diff --git a/Makefile b/Makefile index 463bd88f..ecc81aef 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,13 @@ +IMAGE2CODE = ./sdk/tools/image2code/image2code.py +CPPCHECK = cppcheck +CLANG_FORMAT = clang-format + help: ## Show this help @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-16s\033[0m %s\n", $$1, $$2}' -.PHONY: reformat -reformat: ## Reformat all source files - @find \ +.PHONY: todo +todo: ## Find all TODO, FIXME, XXX comments + find \ . \ -not \( -name .ccls-cache -prune \) \ -not \( -name .pio -prune \) \ @@ -16,24 +20,21 @@ reformat: ## Reformat all source files -o -iname *.hpp \ -o -iname *.h \ -o -iname *.rst \ - | xargs clang-format -i + | xargs grep --color=always -n -H -E "TODO|FIXME|XXX" \ -.PHONY: todo -todo: ## Find all TODO, FIXME, XXX comments - @find \ - . \ +.PHONY: icons +icons: + # Find all PNG images in firmware and sdk folders and convert them to .h + find \ + firmware \ + sdk \ -not \( -name .ccls-cache -prune \) \ -not \( -name .pio -prune \) \ -not \( -name mjs -prune \) \ -not \( -name doomgeneric -prune \) \ -not \( -name bak -prune \) \ - -iname *.h \ - -o -iname *.cpp \ - -o -iname *.c \ - -o -iname *.hpp \ - -o -iname *.h \ - -o -iname *.rst \ - | xargs grep --color=always -n -H -E "TODO|FIXME|XXX" \ + -iname *.png \ + -exec $(IMAGE2CODE) {} \; .PHONY: check check: clang-format cppcheck ## Run all checks @@ -61,11 +62,11 @@ clang-format: ## Run clang-format check -o -iname *.c \ -o -iname *.hpp \ -o -iname *.h \ - | xargs clang-format --dry-run --Werror + | xargs $(CLANG_FORMAT) --dry-run --Werror .PHONY: cppcheck cppcheck: ## Run cppcheck check - cppcheck . -i.ccls-cache -ipio -imjs -idoomgeneric -ibak --enable=performance,style \ + $(CPPCHECK) . -i.ccls-cache -ipio -imjs -idoomgeneric -ibak --enable=performance,style \ --suppress=knownPointerToBool \ --suppress=noCopyConstructor \ --suppress=noOperatorEq \ @@ -73,19 +74,4 @@ cppcheck: ## Run cppcheck check --error-exitcode=1 .PHONY: fix -fix: - # Find all files, but exclude .pio and .ccls-cache directories - # Preserve colors in output - find \ - . \ - -not \( -name .ccls-cache -prune \) \ - -not \( -name .pio -prune \) \ - -not \( -name mjs -prune \) \ - -not \( -name doomgeneric -prune \) \ - -not \( -name bak -prune \) \ - -iname *.h \ - -o -iname *.cpp \ - -o -iname *.c \ - -o -iname *.hpp \ - -o -iname *.h \ - | xargs clang-format -i +fix: ## Fix code style diff --git a/docs/library/display.rst b/docs/library/display.rst index a7edeeae..5c2edf1f 100644 --- a/docs/library/display.rst +++ b/docs/library/display.rst @@ -11,3 +11,6 @@ .. doxygenclass:: lilka::Image :members: + +.. doxygenclass:: lilka::Transform + :members: diff --git a/firmware/doom/assets/doom_splash.png b/firmware/doom/src/doom_splash.png similarity index 100% rename from firmware/doom/assets/doom_splash.png rename to firmware/doom/src/doom_splash.png diff --git a/firmware/keira/sdcard/asteroids/asteroids.lua b/firmware/keira/sdcard/asteroids/asteroids.lua index 681fc7b0..27c0f08f 100644 --- a/firmware/keira/sdcard/asteroids/asteroids.lua +++ b/firmware/keira/sdcard/asteroids/asteroids.lua @@ -458,7 +458,7 @@ function lilka.update(delta) bullet.speed_x = ship.speed_x / 2 + display.width * dir_x bullet.speed_y = ship.speed_y / 2 + display.width * dir_y table.insert(bullets, bullet) - buzzer.play_melody(SHOOT_SOUND, 400) + buzzer.play_melody(SHOOT_SOUND, 600) end -- Вихід з гри diff --git a/firmware/keira/src/app.cpp b/firmware/keira/src/app.cpp index 2ade18fa..bc5ef3ed 100644 --- a/firmware/keira/src/app.cpp +++ b/firmware/keira/src/app.cpp @@ -15,6 +15,9 @@ App::App(const char* name, uint16_t x, uint16_t y, uint16_t w, uint16_t h) : backCanvas(new lilka::Canvas(x, y, w, h)), isDrawQueued(false), backCanvasMutex(xSemaphoreCreateMutex()) { + // Clear buffers + canvas->fillScreen(0); + backCanvas->fillScreen(0); Serial.println( "Created app " + String(name) + " at " + String(x) + ", " + String(y) + " with size " + String(w) + "x" + String(h) @@ -27,7 +30,7 @@ void App::start() { return; } Serial.println("Starting app " + String(name)); - if (xTaskCreate(_run, name, 8192, this, 1, &taskHandle) != pdPASS) { + if (xTaskCreatePinnedToCore(_run, name, 8192, this, 1, &taskHandle, 0) != pdPASS) { Serial.println("Failed to create task for app " + String(name) + " (not enough memory?)"); } } diff --git a/firmware/keira/src/apps/demos/keyboard.cpp b/firmware/keira/src/apps/demos/keyboard.cpp new file mode 100644 index 00000000..6f81327f --- /dev/null +++ b/firmware/keira/src/apps/demos/keyboard.cpp @@ -0,0 +1,27 @@ +#include "keyboard.h" + +KeyboardApp::KeyboardApp() : App("Keyboard") { +} + +void KeyboardApp::run() { + lilka::InputDialog dialog("Введіть текст:"); + + while (true) { + dialog.update(); + dialog.draw(canvas); + queueDraw(); + if (dialog.isDone()) { + break; + } + } + + lilka::Alert alert("Ви ввели:", dialog.getValue()); + alert.draw(canvas); + queueDraw(); + while (true) { + alert.update(); + if (alert.isDone()) { + break; + } + } +} diff --git a/firmware/keira/src/apps/demos/keyboard.h b/firmware/keira/src/apps/demos/keyboard.h new file mode 100644 index 00000000..d194eb41 --- /dev/null +++ b/firmware/keira/src/apps/demos/keyboard.h @@ -0,0 +1,11 @@ +#pragma once + +#include "app.h" + +class KeyboardApp : public App { +public: + KeyboardApp(); + +private: + void run() override; +}; diff --git a/firmware/keira/assets/letris_splash.png b/firmware/keira/src/apps/demos/letris_splash.png similarity index 100% rename from firmware/keira/assets/letris_splash.png rename to firmware/keira/src/apps/demos/letris_splash.png diff --git a/firmware/keira/src/apps/demos/transform.cpp b/firmware/keira/src/apps/demos/transform.cpp new file mode 100644 index 00000000..aec0b0c4 --- /dev/null +++ b/firmware/keira/src/apps/demos/transform.cpp @@ -0,0 +1,45 @@ +#include "transform.h" + +#include + +TransformApp::TransformApp() : App("Transform") { +} + +void TransformApp::run() { + lilka::Image* face = lilka::resources.loadImage("/sd/face.bmp", canvas->color565(0, 0, 0), 32, 32); + + if (!face) { + lilka::Alert alert("Помилка", "Не вдалось завантажити face.bmp з SD-карти."); + alert.draw(canvas); + queueDraw(); + while (!alert.isDone()) { + alert.update(); + } + return; + } + + int x = canvas->width() / 2; + int y = canvas->height() / 2; + + Serial.println("Drawing face at " + String(x) + ", " + String(y)); + + int angle = 0; + + while (1) { + canvas->fillScreen(canvas->color565(0, 64, 0)); + // canvas->drawImage(face, x, y); + lilka::Transform transform = lilka::Transform().rotate(angle).scale(sin(angle / 24.0), cos(angle / 50.0)); + // lilka::Transform transform = lilka::Transform().rotate(30).scale(1.5, 1); + // uint64_t start = micros(); + canvas->drawImageTransformed(face, x, y, transform); + // uint64_t end = micros(); + // Serial.println("Drawing took " + String(end - start) + " us"); + queueDraw(); + angle += 8; + + lilka::State state = lilka::controller.getState(); + if (state.a.justPressed) { + return; + } + } +} diff --git a/firmware/keira/src/apps/demos/transform.h b/firmware/keira/src/apps/demos/transform.h new file mode 100644 index 00000000..2e93f71f --- /dev/null +++ b/firmware/keira/src/apps/demos/transform.h @@ -0,0 +1,11 @@ +#pragma once + +#include "app.h" + +class TransformApp : public App { +public: + TransformApp(); + +private: + void run() override; +}; diff --git a/firmware/keira/src/apps/icons/battery.h b/firmware/keira/src/apps/icons/battery.h index ef446e51..8f0f7992 100644 --- a/firmware/keira/src/apps/icons/battery.h +++ b/firmware/keira/src/apps/icons/battery.h @@ -1,7 +1,7 @@ // This is a generated file, do not edit. // clang-format off #include -const uint16_t battery_width = 32; +const uint16_t battery_width = 16; const uint16_t battery_height = 24; const uint16_t battery[] = { 0xf81f, @@ -42,6 +42,10 @@ const uint16_t battery[] = { 0xf81f, 0xf81f, 0xf81f, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0xf81f, 0xf81f, 0xf81f, @@ -53,172 +57,6 @@ const uint16_t battery[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, @@ -232,6 +70,7 @@ const uint16_t battery[] = { 0xf81f, 0xf81f, 0xf81f, + 0xf81f, 0xffff, 0xffff, 0xffff, @@ -242,6 +81,11 @@ const uint16_t battery[] = { 0xffff, 0xffff, 0xffff, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, 0xffff, 0xffff, 0xffff, @@ -254,12 +98,6 @@ const uint16_t battery[] = { 0xffff, 0xffff, 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xf81f, - 0xf81f, 0xf81f, 0xf81f, 0xf81f, @@ -274,28 +112,12 @@ const uint16_t battery[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0xffff, 0xffff, 0xf81f, 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xffff, 0xffff, 0xffff, 0x0000, @@ -306,20 +128,6 @@ const uint16_t battery[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0xffff, 0xffff, 0xf81f, @@ -328,14 +136,6 @@ const uint16_t battery[] = { 0xf81f, 0xffff, 0xffff, - 0xffff, - 0xffff, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, @@ -344,6 +144,14 @@ const uint16_t battery[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -360,14 +168,6 @@ const uint16_t battery[] = { 0xf81f, 0xffff, 0xffff, - 0xffff, - 0xffff, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, @@ -376,6 +176,14 @@ const uint16_t battery[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -392,14 +200,6 @@ const uint16_t battery[] = { 0xf81f, 0xffff, 0xffff, - 0xffff, - 0xffff, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, @@ -408,6 +208,14 @@ const uint16_t battery[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -424,14 +232,6 @@ const uint16_t battery[] = { 0xf81f, 0xffff, 0xffff, - 0xffff, - 0xffff, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, @@ -440,6 +240,14 @@ const uint16_t battery[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -454,8 +262,6 @@ const uint16_t battery[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xffff, 0xffff, 0xffff, 0x0000, @@ -466,12 +272,14 @@ const uint16_t battery[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, + 0xffff, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -486,8 +294,6 @@ const uint16_t battery[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xf81f, 0xffff, 0xffff, 0x0000, @@ -498,12 +304,14 @@ const uint16_t battery[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, + 0xffff, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -518,11 +326,6 @@ const uint16_t battery[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xf81f, - 0xffff, - 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, @@ -535,27 +338,11 @@ const uint16_t battery[] = { 0xffff, 0xffff, 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xffff, - 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, @@ -566,177 +353,6 @@ const uint16_t battery[] = { 0xffff, 0xffff, 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xffff, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, 0xf81f, 0xf81f, 0xf81f, diff --git a/firmware/keira/src/apps/icons/battery.png b/firmware/keira/src/apps/icons/battery.png index 4b0e48e0..5892d729 100644 Binary files a/firmware/keira/src/apps/icons/battery.png and b/firmware/keira/src/apps/icons/battery.png differ diff --git a/firmware/keira/src/apps/icons/battery_absent.h b/firmware/keira/src/apps/icons/battery_absent.h index 3797e451..a3df7842 100644 --- a/firmware/keira/src/apps/icons/battery_absent.h +++ b/firmware/keira/src/apps/icons/battery_absent.h @@ -1,7 +1,7 @@ // This is a generated file, do not edit. // clang-format off #include -const uint16_t battery_absent_width = 32; +const uint16_t battery_absent_width = 16; const uint16_t battery_absent_height = 24; const uint16_t battery_absent[] = { 0xf81f, @@ -42,6 +42,10 @@ const uint16_t battery_absent[] = { 0xf81f, 0xf81f, 0xf81f, + 0xad55, + 0xad55, + 0xad55, + 0xad55, 0xf81f, 0xf81f, 0xf81f, @@ -53,172 +57,6 @@ const uint16_t battery_absent[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, 0xad55, 0xad55, 0xad55, @@ -232,6 +70,7 @@ const uint16_t battery_absent[] = { 0xf81f, 0xf81f, 0xf81f, + 0xf81f, 0xad55, 0xad55, 0xad55, @@ -242,6 +81,11 @@ const uint16_t battery_absent[] = { 0xad55, 0xad55, 0xad55, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, 0xad55, 0xad55, 0xad55, @@ -254,12 +98,6 @@ const uint16_t battery_absent[] = { 0xad55, 0xad55, 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xf81f, - 0xf81f, 0xf81f, 0xf81f, 0xf81f, @@ -273,20 +111,6 @@ const uint16_t battery_absent[] = { 0x0000, 0x0000, 0x0000, - 0xad55, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0xad55, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0xad55, 0xad55, @@ -294,8 +118,6 @@ const uint16_t battery_absent[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xad55, 0xad55, 0xad55, 0x0000, @@ -307,10 +129,12 @@ const uint16_t battery_absent[] = { 0x0000, 0x0000, 0xad55, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xad55, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xad55, 0xad55, 0x0000, 0x0000, @@ -329,10 +153,6 @@ const uint16_t battery_absent[] = { 0xad55, 0xad55, 0xad55, - 0xad55, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, @@ -340,17 +160,21 @@ const uint16_t battery_absent[] = { 0x0000, 0x0000, 0xad55, - 0x0000, - 0x0000, + 0xad55, + 0xad55, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xad55, 0xad55, 0x0000, + 0xad55, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xad55, 0x0000, 0xad55, 0xad55, @@ -360,27 +184,27 @@ const uint16_t battery_absent[] = { 0xf81f, 0xad55, 0xad55, - 0xad55, - 0xad55, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, + 0xad55, 0x0000, 0x0000, + 0xad55, 0x0000, 0x0000, 0xad55, 0xad55, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xad55, + 0xad55, 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xad55, + 0xad55, 0x0000, 0x0000, 0x0000, @@ -392,15 +216,6 @@ const uint16_t battery_absent[] = { 0xf81f, 0xad55, 0xad55, - 0xad55, - 0xad55, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, @@ -409,13 +224,6 @@ const uint16_t battery_absent[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0xad55, 0xad55, 0xf81f, @@ -424,15 +232,6 @@ const uint16_t battery_absent[] = { 0xf81f, 0xad55, 0xad55, - 0xad55, - 0xad55, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, 0xad55, @@ -441,12 +240,21 @@ const uint16_t battery_absent[] = { 0xad55, 0x0000, 0x0000, + 0xad55, + 0xad55, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xad55, + 0xad55, 0x0000, + 0xad55, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, + 0xad55, 0x0000, 0xad55, 0xad55, @@ -454,7 +262,6 @@ const uint16_t battery_absent[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, 0xad55, 0xad55, 0xad55, @@ -464,13 +271,14 @@ const uint16_t battery_absent[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, 0xad55, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xad55, + 0xad55, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xad55, 0xad55, 0x0000, 0x0000, @@ -486,8 +294,6 @@ const uint16_t battery_absent[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xf81f, 0xad55, 0xad55, 0x0000, @@ -497,14 +303,16 @@ const uint16_t battery_absent[] = { 0x0000, 0x0000, 0x0000, - 0xad55, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0xad55, + 0xad55, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xad55, + 0xad55, + 0x0000, 0x0000, 0x0000, 0x0000, @@ -518,9 +326,6 @@ const uint16_t battery_absent[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xf81f, - 0xad55, 0xad55, 0xad55, 0xad55, @@ -533,27 +338,11 @@ const uint16_t battery_absent[] = { 0xad55, 0xad55, 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xad55, 0xad55, 0xad55, 0xad55, @@ -564,179 +353,6 @@ const uint16_t battery_absent[] = { 0xad55, 0xad55, 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xad55, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, 0xf81f, 0xf81f, 0xf81f, diff --git a/firmware/keira/src/apps/icons/battery_absent.png b/firmware/keira/src/apps/icons/battery_absent.png index 3976b5e6..b7825e64 100644 Binary files a/firmware/keira/src/apps/icons/battery_absent.png and b/firmware/keira/src/apps/icons/battery_absent.png differ diff --git a/firmware/keira/src/apps/icons/battery_danger.h b/firmware/keira/src/apps/icons/battery_danger.h index a36ea3d5..b7e13249 100644 --- a/firmware/keira/src/apps/icons/battery_danger.h +++ b/firmware/keira/src/apps/icons/battery_danger.h @@ -1,7 +1,7 @@ // This is a generated file, do not edit. // clang-format off #include -const uint16_t battery_danger_width = 32; +const uint16_t battery_danger_width = 16; const uint16_t battery_danger_height = 24; const uint16_t battery_danger[] = { 0xf81f, @@ -42,6 +42,10 @@ const uint16_t battery_danger[] = { 0xf81f, 0xf81f, 0xf81f, + 0xf800, + 0xf800, + 0xf800, + 0xf800, 0xf81f, 0xf81f, 0xf81f, @@ -53,172 +57,6 @@ const uint16_t battery_danger[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, 0xf800, 0xf800, 0xf800, @@ -232,6 +70,7 @@ const uint16_t battery_danger[] = { 0xf81f, 0xf81f, 0xf81f, + 0xf81f, 0xf800, 0xf800, 0xf800, @@ -242,6 +81,11 @@ const uint16_t battery_danger[] = { 0xf800, 0xf800, 0xf800, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, 0xf800, 0xf800, 0xf800, @@ -254,12 +98,6 @@ const uint16_t battery_danger[] = { 0xf800, 0xf800, 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf81f, - 0xf81f, 0xf81f, 0xf81f, 0xf81f, @@ -274,28 +112,12 @@ const uint16_t battery_danger[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0xf800, 0xf800, 0xf81f, 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xf800, 0xf800, 0xf800, 0x0000, @@ -306,20 +128,6 @@ const uint16_t battery_danger[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0xf800, 0xf800, 0xf81f, @@ -328,14 +136,6 @@ const uint16_t battery_danger[] = { 0xf81f, 0xf800, 0xf800, - 0xf800, - 0xf800, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, @@ -344,6 +144,14 @@ const uint16_t battery_danger[] = { 0x0000, 0x0000, 0x0000, + 0xf800, + 0xf800, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf800, + 0xf800, 0x0000, 0x0000, 0x0000, @@ -360,14 +168,6 @@ const uint16_t battery_danger[] = { 0xf81f, 0xf800, 0xf800, - 0xf800, - 0xf800, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, @@ -376,6 +176,14 @@ const uint16_t battery_danger[] = { 0x0000, 0x0000, 0x0000, + 0xf800, + 0xf800, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf800, + 0xf800, 0x0000, 0x0000, 0x0000, @@ -392,14 +200,6 @@ const uint16_t battery_danger[] = { 0xf81f, 0xf800, 0xf800, - 0xf800, - 0xf800, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, @@ -408,6 +208,14 @@ const uint16_t battery_danger[] = { 0x0000, 0x0000, 0x0000, + 0xf800, + 0xf800, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf800, + 0xf800, 0x0000, 0x0000, 0x0000, @@ -424,14 +232,6 @@ const uint16_t battery_danger[] = { 0xf81f, 0xf800, 0xf800, - 0xf800, - 0xf800, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, @@ -440,6 +240,14 @@ const uint16_t battery_danger[] = { 0x0000, 0x0000, 0x0000, + 0xf800, + 0xf800, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf800, + 0xf800, 0x0000, 0x0000, 0x0000, @@ -454,8 +262,6 @@ const uint16_t battery_danger[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xf800, 0xf800, 0xf800, 0x0000, @@ -466,12 +272,14 @@ const uint16_t battery_danger[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xf800, + 0xf800, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf800, + 0xf800, 0x0000, 0x0000, 0x0000, @@ -486,8 +294,6 @@ const uint16_t battery_danger[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xf81f, 0xf800, 0xf800, 0x0000, @@ -498,12 +304,14 @@ const uint16_t battery_danger[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xf800, + 0xf800, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf81f, + 0xf800, + 0xf800, 0x0000, 0x0000, 0x0000, @@ -518,11 +326,6 @@ const uint16_t battery_danger[] = { 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xf81f, - 0xf800, - 0xf800, - 0xf800, 0xf800, 0xf800, 0xf800, @@ -535,27 +338,11 @@ const uint16_t battery_danger[] = { 0xf800, 0xf800, 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, - 0xf81f, - 0xf800, - 0xf800, - 0xf800, 0xf800, 0xf800, 0xf800, @@ -566,177 +353,6 @@ const uint16_t battery_danger[] = { 0xf800, 0xf800, 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf800, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, - 0xf81f, 0xf81f, 0xf81f, 0xf81f, diff --git a/firmware/keira/src/apps/icons/battery_danger.png b/firmware/keira/src/apps/icons/battery_danger.png index 5c89db5c..e4094f1a 100644 Binary files a/firmware/keira/src/apps/icons/battery_danger.png and b/firmware/keira/src/apps/icons/battery_danger.png differ diff --git a/firmware/keira/src/apps/icons/ram.h b/firmware/keira/src/apps/icons/ram.h new file mode 100644 index 00000000..6e699097 --- /dev/null +++ b/firmware/keira/src/apps/icons/ram.h @@ -0,0 +1,584 @@ +// This is a generated file, do not edit. +// clang-format off +#include +const uint16_t ram_width = 24; +const uint16_t ram_height = 24; +const uint16_t ram[] = { + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0x0000, + 0xffff, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, +}; +// clang-format on diff --git a/firmware/keira/src/apps/icons/ram.png b/firmware/keira/src/apps/icons/ram.png new file mode 100644 index 00000000..e7f26dee Binary files /dev/null and b/firmware/keira/src/apps/icons/ram.png differ diff --git a/firmware/keira/src/apps/icons/wifi_0.h b/firmware/keira/src/apps/icons/wifi_0.h index a0a90362..c43888d5 100644 --- a/firmware/keira/src/apps/icons/wifi_0.h +++ b/firmware/keira/src/apps/icons/wifi_0.h @@ -35,6 +35,16 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -47,6 +57,8 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -57,6 +69,8 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -65,22 +79,8 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x10a2, @@ -95,14 +95,14 @@ const uint16_t wifi_0[] = { 0x1082, 0x0020, 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, 0x0000, 0x0020, 0x18e3, @@ -121,11 +121,11 @@ const uint16_t wifi_0[] = { 0x18e3, 0x0020, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, + 0xffff, 0x0020, 0x18e3, 0x2945, @@ -146,11 +146,11 @@ const uint16_t wifi_0[] = { 0x2945, 0x18e3, 0x0020, + 0xffff, 0x0000, 0x0000, 0x0000, - 0x0861, - 0x2124, + 0xffff, 0x2945, 0x2945, 0x2945, @@ -169,12 +169,12 @@ const uint16_t wifi_0[] = { 0x2945, 0x2945, 0x2945, - 0x2124, - 0x0841, + 0xffff, 0x0000, 0x0000, - 0x18e3, - 0x2945, + 0x0000, + 0x0000, + 0xffff, 0x2945, 0x2945, 0x2104, @@ -193,13 +193,13 @@ const uint16_t wifi_0[] = { 0x2104, 0x2945, 0x2945, - 0x2945, - 0x18e3, + 0xffff, 0x0000, 0x0000, - 0x18e3, - 0x2945, - 0x2945, + 0x0000, + 0x0000, + 0x0000, + 0xffff, 0x18c3, 0x0000, 0x0861, @@ -216,15 +216,15 @@ const uint16_t wifi_0[] = { 0x0841, 0x0000, 0x18c3, - 0x2945, - 0x2945, - 0x18e3, + 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffff, + 0x0000, 0x18c3, 0x2945, 0x2945, @@ -240,6 +240,7 @@ const uint16_t wifi_0[] = { 0x2945, 0x10a2, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -247,8 +248,7 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x10a2, + 0xffff, 0x2945, 0x2945, 0x2945, @@ -263,7 +263,7 @@ const uint16_t wifi_0[] = { 0x2945, 0x2945, 0x2945, - 0x10a2, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -272,8 +272,8 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, - 0x18e3, - 0x2945, + 0x0000, + 0xffff, 0x2945, 0x2945, 0x10a2, @@ -286,8 +286,7 @@ const uint16_t wifi_0[] = { 0x10a2, 0x2945, 0x2945, - 0x2945, - 0x18e3, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -298,6 +297,7 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0861, @@ -310,6 +310,7 @@ const uint16_t wifi_0[] = { 0x0841, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -321,8 +322,7 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, + 0xffff, 0x10a2, 0x2945, 0x2945, @@ -333,6 +333,7 @@ const uint16_t wifi_0[] = { 0x2945, 0x2945, 0x10a2, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -345,8 +346,7 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, + 0xffff, 0x18e3, 0x2945, 0x2945, @@ -357,6 +357,7 @@ const uint16_t wifi_0[] = { 0x2945, 0x2945, 0x18e3, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -370,6 +371,7 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -378,6 +380,7 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -393,16 +396,14 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, 0x0000, 0x5acb, 0xad55, 0xad55, 0x5acb, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -419,14 +420,14 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, + 0xffff, 0x7bef, 0xffdf, 0xffff, 0xffff, 0xf7be, 0x7bef, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -444,13 +445,12 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0xe73c, 0xffff, 0xffff, 0xffff, 0xffff, - 0xe71c, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -469,12 +469,13 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, - 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffdf, + 0xffff, + 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, @@ -493,12 +494,10 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, - 0xe73c, 0xffff, 0xffff, 0xffff, 0xffff, - 0xe71c, 0x0000, 0x0000, 0x0000, @@ -517,12 +516,12 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, - 0x7bef, - 0xf7be, + 0x0000, + 0x0000, + 0xffff, + 0xffff, 0xffff, 0xffff, - 0xf7be, - 0x7bef, 0x0000, 0x0000, 0x0000, @@ -542,10 +541,11 @@ const uint16_t wifi_0[] = { 0x0000, 0x0000, 0x0000, - 0x52aa, - 0xad55, - 0xad55, - 0x52aa, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, diff --git a/firmware/keira/src/apps/icons/wifi_0.png b/firmware/keira/src/apps/icons/wifi_0.png index dd4a2e78..a9a8c9d8 100644 Binary files a/firmware/keira/src/apps/icons/wifi_0.png and b/firmware/keira/src/apps/icons/wifi_0.png differ diff --git a/firmware/keira/src/apps/icons/wifi_1.h b/firmware/keira/src/apps/icons/wifi_1.h index b78cd3cb..70268f7a 100644 --- a/firmware/keira/src/apps/icons/wifi_1.h +++ b/firmware/keira/src/apps/icons/wifi_1.h @@ -35,6 +35,16 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -47,6 +57,8 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -57,6 +69,8 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -65,22 +79,8 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x10a2, @@ -95,14 +95,14 @@ const uint16_t wifi_1[] = { 0x1082, 0x0020, 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, 0x0000, 0x0020, 0x18e3, @@ -121,11 +121,11 @@ const uint16_t wifi_1[] = { 0x18e3, 0x0020, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, + 0xffff, 0x0020, 0x18e3, 0x2945, @@ -146,11 +146,11 @@ const uint16_t wifi_1[] = { 0x2945, 0x18e3, 0x0020, + 0xffff, 0x0000, 0x0000, 0x0000, - 0x0861, - 0x2124, + 0xffff, 0x2945, 0x2945, 0x2945, @@ -169,12 +169,12 @@ const uint16_t wifi_1[] = { 0x2945, 0x2945, 0x2945, - 0x2124, - 0x0841, + 0xffff, 0x0000, 0x0000, - 0x18e3, - 0x2945, + 0x0000, + 0x0000, + 0xffff, 0x2945, 0x2945, 0x2104, @@ -193,13 +193,13 @@ const uint16_t wifi_1[] = { 0x2104, 0x2945, 0x2945, - 0x2945, - 0x18e3, + 0xffff, 0x0000, 0x0000, - 0x18e3, - 0x2945, - 0x2945, + 0x0000, + 0x0000, + 0x0000, + 0xffff, 0x18c3, 0x0000, 0x0861, @@ -216,14 +216,14 @@ const uint16_t wifi_1[] = { 0x0841, 0x0000, 0x18c3, - 0x2945, - 0x2945, - 0x18e3, + 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0x18c3, 0x2945, @@ -240,6 +240,7 @@ const uint16_t wifi_1[] = { 0x2945, 0x10a2, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -247,8 +248,7 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x10a2, + 0xffff, 0x2945, 0x2945, 0x2945, @@ -263,7 +263,7 @@ const uint16_t wifi_1[] = { 0x2945, 0x2945, 0x2945, - 0x10a2, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -272,8 +272,8 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, - 0x18e3, - 0x2945, + 0x0000, + 0xffff, 0x2945, 0x2945, 0x10a2, @@ -286,8 +286,7 @@ const uint16_t wifi_1[] = { 0x10a2, 0x2945, 0x2945, - 0x2945, - 0x18e3, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -298,6 +297,7 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, 0x7bcf, @@ -310,6 +310,7 @@ const uint16_t wifi_1[] = { 0x738e, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -321,8 +322,7 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, + 0xffff, 0x9cf3, 0xffff, 0xffff, @@ -333,6 +333,7 @@ const uint16_t wifi_1[] = { 0xffff, 0xffff, 0x9cf3, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -345,8 +346,7 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, + 0xffff, 0xbdf7, 0xffff, 0xffff, @@ -357,6 +357,7 @@ const uint16_t wifi_1[] = { 0xffff, 0xffff, 0xbdf7, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -370,6 +371,16 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -385,26 +396,14 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x5acb, - 0xad55, - 0xad55, - 0x5acb, - 0x0000, - 0x0000, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -421,13 +420,14 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, - 0x7bef, - 0xffdf, 0xffff, 0xffff, - 0xf7be, - 0x7bef, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -445,12 +445,12 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, - 0xe73c, 0xffff, 0xffff, 0xffff, 0xffff, - 0xe71c, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -469,12 +469,13 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, - 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffdf, + 0xffff, + 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, @@ -493,12 +494,10 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, - 0xe73c, 0xffff, 0xffff, 0xffff, 0xffff, - 0xe71c, 0x0000, 0x0000, 0x0000, @@ -517,12 +516,13 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, - 0x7bef, - 0xf7be, + 0x0000, + 0x0000, + 0xffff, 0xffff, 0xffff, - 0xf7be, - 0x7bef, + 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, @@ -542,10 +542,10 @@ const uint16_t wifi_1[] = { 0x0000, 0x0000, 0x0000, - 0x52aa, - 0xad55, - 0xad55, - 0x52aa, + 0x0000, + 0xffff, + 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, diff --git a/firmware/keira/src/apps/icons/wifi_1.png b/firmware/keira/src/apps/icons/wifi_1.png index aaea20cd..eef2244a 100644 Binary files a/firmware/keira/src/apps/icons/wifi_1.png and b/firmware/keira/src/apps/icons/wifi_1.png differ diff --git a/firmware/keira/src/apps/icons/wifi_2.h b/firmware/keira/src/apps/icons/wifi_2.h index 1c3487e9..67e32d82 100644 --- a/firmware/keira/src/apps/icons/wifi_2.h +++ b/firmware/keira/src/apps/icons/wifi_2.h @@ -35,6 +35,16 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -47,6 +57,8 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -57,6 +69,8 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -65,22 +79,8 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x10a2, @@ -95,14 +95,14 @@ const uint16_t wifi_2[] = { 0x1082, 0x0020, 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, 0x0000, 0x0020, 0x18e3, @@ -121,11 +121,11 @@ const uint16_t wifi_2[] = { 0x18e3, 0x0020, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, + 0xffff, 0x0020, 0x18e3, 0x2945, @@ -146,11 +146,11 @@ const uint16_t wifi_2[] = { 0x2945, 0x18e3, 0x0020, + 0xffff, 0x0000, 0x0000, 0x0000, - 0x0861, - 0x2124, + 0xffff, 0x2945, 0x2945, 0x2945, @@ -169,12 +169,12 @@ const uint16_t wifi_2[] = { 0x2945, 0x2945, 0x2945, - 0x2124, - 0x0841, + 0xffff, 0x0000, 0x0000, - 0x18e3, - 0x2945, + 0x0000, + 0x0000, + 0xffff, 0x2945, 0x2945, 0x2104, @@ -193,37 +193,37 @@ const uint16_t wifi_2[] = { 0x2104, 0x2945, 0x2945, - 0x2945, - 0x18e3, + 0xffff, 0x0000, 0x0000, - 0x18e3, - 0x2945, - 0x2945, + 0x0000, + 0x0000, + 0x0000, + 0xffff, 0x18c3, 0x0000, 0x6b6d, 0xd69a, - 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xf7be, + 0xffff, + 0xffff, 0xce79, 0x630c, 0x0000, 0x18c3, - 0x2945, - 0x2945, - 0x18e3, + 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0xb596, 0xffff, @@ -240,6 +240,7 @@ const uint16_t wifi_2[] = { 0xffff, 0xad75, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -247,72 +248,45 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0xa514, 0xffff, 0xffff, 0xffff, 0xffff, - 0xf7be, - 0xd6ba, - 0xc618, - 0xc618, - 0xd6ba, - 0xf7be, 0xffff, 0xffff, 0xffff, 0xffff, - 0xa514, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0xbdf7, 0xffff, 0xffff, - 0xf7be, - 0xa534, - 0x2124, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x2124, - 0xa534, - 0xf7be, 0xffff, 0xffff, - 0xbdf7, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, - 0x7bcf, - 0xce79, - 0xf79e, - 0xffdf, - 0xffdf, - 0xef7d, - 0xce59, - 0x738e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -323,7 +297,6 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, - 0x9cf3, 0xffff, 0xffff, 0xffff, @@ -331,11 +304,13 @@ const uint16_t wifi_2[] = { 0xffff, 0xffff, 0xffff, + 0xffdf, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0xffff, - 0x9cf3, - 0x0000, - 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, @@ -347,7 +322,6 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, - 0xbdf7, 0xffff, 0xffff, 0xffff, @@ -356,11 +330,10 @@ const uint16_t wifi_2[] = { 0xffff, 0xffff, 0xffff, - 0xbdf7, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -373,6 +346,18 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -386,6 +371,16 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -398,13 +393,17 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, - 0x5acb, - 0xad55, - 0xad55, - 0x5acb, 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -421,13 +420,14 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, - 0x7bef, - 0xffdf, 0xffff, 0xffff, - 0xf7be, - 0x7bef, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -445,12 +445,12 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, - 0xe73c, 0xffff, 0xffff, 0xffff, 0xffff, - 0xe71c, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -469,12 +469,13 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, - 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffdf, + 0xffff, + 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, @@ -493,12 +494,10 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, - 0xe73c, 0xffff, 0xffff, 0xffff, 0xffff, - 0xe71c, 0x0000, 0x0000, 0x0000, @@ -517,12 +516,14 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, - 0x7bef, - 0xf7be, + 0x0000, + 0x0000, + 0xffff, 0xffff, 0xffff, - 0xf7be, - 0x7bef, + 0xffff, + 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, @@ -542,10 +543,9 @@ const uint16_t wifi_2[] = { 0x0000, 0x0000, 0x0000, - 0x52aa, - 0xad55, - 0xad55, - 0x52aa, + 0xffff, + 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, diff --git a/firmware/keira/src/apps/icons/wifi_2.png b/firmware/keira/src/apps/icons/wifi_2.png index 534ca76a..4e14193b 100644 Binary files a/firmware/keira/src/apps/icons/wifi_2.png and b/firmware/keira/src/apps/icons/wifi_2.png differ diff --git a/firmware/keira/src/apps/icons/wifi_3.h b/firmware/keira/src/apps/icons/wifi_3.h index 8fd5c7d5..ea179e86 100644 --- a/firmware/keira/src/apps/icons/wifi_3.h +++ b/firmware/keira/src/apps/icons/wifi_3.h @@ -35,6 +35,16 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -47,55 +57,20 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x4228, - 0x9cd3, - 0xce59, - 0xe73c, - 0xef7d, - 0xffdf, 0xffff, - 0xf7be, - 0xe73c, - 0xc638, - 0x9492, - 0x2965, - 0x0000, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -104,8 +79,6 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, - 0x6b4d, - 0xce79, 0xffff, 0xffff, 0xffff, @@ -117,17 +90,18 @@ const uint16_t wifi_3[] = { 0xffff, 0xffff, 0xffff, - 0xffdf, - 0xc638, - 0x5acb, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x3186, - 0xce59, 0xffff, 0xffff, 0xffff, @@ -143,89 +117,63 @@ const uint16_t wifi_3[] = { 0xffff, 0xffff, 0xffff, - 0xffdf, - 0xc618, - 0x2945, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, - 0x6b6d, - 0xef5d, 0xffff, 0xffff, 0xffff, 0xffff, - 0xe73c, - 0xbdd7, - 0x8430, - 0x630c, - 0x39c7, - 0x39c7, - 0x630c, - 0x8c51, - 0xbdf7, - 0xef5d, 0xffff, 0xffff, 0xffff, 0xffff, - 0xe73c, - 0x632c, - 0x0000, - 0x0000, - 0xbdf7, 0xffff, 0xffff, 0xffff, - 0xe71c, - 0x8430, - 0x0000, - 0x2945, - 0x8c51, - 0xa534, - 0xb596, - 0xb596, - 0xa514, - 0x8430, - 0x18e3, - 0x0000, - 0x8c71, - 0xe73c, 0xffff, 0xffff, 0xffff, - 0xbdf7, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, 0x0000, 0x0000, - 0xbdf7, 0xffff, 0xffff, - 0xb5b6, - 0x10a2, - 0x6b6d, - 0xd69a, - 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xf7be, - 0xce79, - 0x630c, - 0x0000, - 0xb596, 0xffff, 0xffff, - 0xbdf7, - 0x0000, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, - 0xb596, 0xffff, 0xffff, 0xffff, @@ -238,57 +186,61 @@ const uint16_t wifi_3[] = { 0xffff, 0xffff, 0xffff, - 0xad75, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xa514, 0xffff, 0xffff, 0xffff, 0xffff, - 0xf7be, - 0xd6ba, - 0xc618, - 0xc618, - 0xd6ba, - 0xf7be, 0xffff, 0xffff, 0xffff, 0xffff, - 0xa514, - 0x0000, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0xbdf7, 0xffff, 0xffff, - 0xf7be, - 0xa534, - 0x2124, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x2124, - 0xa534, - 0xf7be, 0xffff, 0xffff, - 0xbdf7, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -296,23 +248,45 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, - 0x7bcf, - 0xce79, - 0xf79e, - 0xffdf, - 0xffdf, - 0xef7d, - 0xce59, - 0x738e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -323,7 +297,6 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, - 0x9cf3, 0xffff, 0xffff, 0xffff, @@ -332,10 +305,12 @@ const uint16_t wifi_3[] = { 0xffff, 0xffff, 0xffff, - 0x9cf3, - 0x0000, - 0x0000, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -347,7 +322,6 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, - 0xbdf7, 0xffff, 0xffff, 0xffff, @@ -356,11 +330,10 @@ const uint16_t wifi_3[] = { 0xffff, 0xffff, 0xffff, - 0xbdf7, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -373,6 +346,18 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -386,6 +371,16 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -398,13 +393,17 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, - 0x5acb, - 0xad55, - 0xad55, - 0x5acb, 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -421,13 +420,14 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, - 0x7bef, - 0xffdf, 0xffff, 0xffff, - 0xf7be, - 0x7bef, - 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -445,12 +445,12 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, - 0xe73c, 0xffff, 0xffff, 0xffff, 0xffff, - 0xe71c, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -469,12 +469,13 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, - 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffdf, + 0xffff, + 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, @@ -493,12 +494,10 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, - 0xe73c, 0xffff, 0xffff, 0xffff, 0xffff, - 0xe71c, 0x0000, 0x0000, 0x0000, @@ -517,12 +516,14 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, - 0x7bef, - 0xf7be, + 0x0000, + 0x0000, 0xffff, 0xffff, - 0xf7be, - 0x7bef, + 0xffff, + 0xffff, + 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, @@ -542,10 +543,9 @@ const uint16_t wifi_3[] = { 0x0000, 0x0000, 0x0000, - 0x52aa, - 0xad55, - 0xad55, - 0x52aa, + 0xffff, + 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, diff --git a/firmware/keira/src/apps/icons/wifi_3.png b/firmware/keira/src/apps/icons/wifi_3.png index e4da2d8e..a5ffb63b 100644 Binary files a/firmware/keira/src/apps/icons/wifi_3.png and b/firmware/keira/src/apps/icons/wifi_3.png differ diff --git a/firmware/keira/src/apps/icons/wifi_offline.h b/firmware/keira/src/apps/icons/wifi_offline.h index c49f2e9f..2f255698 100644 --- a/firmware/keira/src/apps/icons/wifi_offline.h +++ b/firmware/keira/src/apps/icons/wifi_offline.h @@ -35,6 +35,16 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, + 0xa800, + 0xa800, + 0xa800, + 0xa800, + 0xa800, + 0xa800, + 0xa800, + 0xa800, + 0xa800, + 0xa800, 0x0000, 0x0000, 0x0000, @@ -47,6 +57,8 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, + 0xa800, + 0xa800, 0x0000, 0x0000, 0x0000, @@ -57,6 +69,8 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, + 0xa800, + 0xa800, 0x0000, 0x0000, 0x0000, @@ -65,22 +79,8 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xa800, + 0xa800, 0x0000, 0x1000, 0x4000, @@ -95,14 +95,14 @@ const uint16_t wifi_offline[] = { 0x4000, 0x1000, 0x0000, + 0xa800, + 0xa800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xa800, 0x0000, 0x2000, 0x5000, @@ -121,11 +121,11 @@ const uint16_t wifi_offline[] = { 0x5000, 0x2000, 0x0000, + 0xa800, 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, + 0xa800, 0x1800, 0x5000, 0x6800, @@ -146,11 +146,11 @@ const uint16_t wifi_offline[] = { 0x6800, 0x5000, 0x1800, + 0xa800, 0x0000, 0x0000, 0x0000, - 0x2000, - 0x6000, + 0xa800, 0x6800, 0x6800, 0x6800, @@ -169,12 +169,12 @@ const uint16_t wifi_offline[] = { 0x6800, 0x6800, 0x6800, - 0x6000, - 0x2000, + 0xa800, 0x0000, - 0x2800, - 0x6000, - 0x6800, + 0x0000, + 0x0000, + 0x0000, + 0xa800, 0x6800, 0x6800, 0x5800, @@ -193,13 +193,13 @@ const uint16_t wifi_offline[] = { 0x6000, 0x6800, 0x6800, - 0x6800, - 0x6000, - 0x2800, - 0x6000, - 0x6800, - 0x6800, - 0x6800, + 0xa800, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xa800, 0x4800, 0x0000, 0x0000, @@ -216,14 +216,14 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x4800, - 0x6800, - 0x6800, - 0x6800, - 0x6000, - 0x6000, - 0x6800, - 0x6800, - 0x3000, + 0xa800, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xa800, 0x0000, 0x0000, 0x0000, @@ -240,16 +240,16 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x3000, - 0x6800, - 0x6800, - 0x6000, - 0x2000, - 0x4800, - 0x2000, + 0xa800, + 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, + 0x0000, + 0xa800, + 0x0000, 0x2000, 0x5800, 0x6800, @@ -263,17 +263,17 @@ const uint16_t wifi_offline[] = { 0x5800, 0x2000, 0x0000, + 0xa800, 0x0000, 0x0000, - 0x2000, - 0x4800, - 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x2800, + 0x0000, + 0x0000, + 0xa800, 0x6000, 0x6800, 0x6800, @@ -286,7 +286,7 @@ const uint16_t wifi_offline[] = { 0x6800, 0x6800, 0x6000, - 0x2800, + 0xa800, 0x0000, 0x0000, 0x0000, @@ -296,8 +296,8 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x2000, - 0x6800, + 0x0000, + 0xa800, 0x6800, 0x6800, 0x6800, @@ -310,8 +310,7 @@ const uint16_t wifi_offline[] = { 0x6800, 0x6800, 0x6800, - 0x6800, - 0x2000, + 0xa800, 0x0000, 0x0000, 0x0000, @@ -320,9 +319,10 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x4800, - 0x6800, - 0x6800, + 0x0000, + 0x0000, + 0x0000, + 0xa800, 0x6800, 0x3000, 0x0000, @@ -333,9 +333,10 @@ const uint16_t wifi_offline[] = { 0x0000, 0x3000, 0x5000, - 0x5800, - 0x6800, - 0x4800, + 0xa800, + 0x0000, + 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, @@ -344,11 +345,9 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x2800, - 0x6000, - 0x6000, - 0x3000, 0x0000, + 0xa800, + 0x3000, 0x0000, 0x0000, 0x0000, @@ -358,6 +357,7 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, + 0xa800, 0x4000, 0x2800, 0x0000, @@ -371,7 +371,7 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x0000, + 0xa800, 0x0000, 0x0000, 0x5000, @@ -396,7 +396,7 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x0000, + 0xa800, 0x5000, 0x6800, 0x6800, @@ -404,13 +404,13 @@ const uint16_t wifi_offline[] = { 0x5000, 0x0000, 0xa800, - 0xb000, - 0xb000, + 0xf800, + 0xf800, 0x8800, 0x1800, 0x8800, - 0xb000, - 0xb000, + 0xf800, + 0xf800, 0xa800, 0x0000, 0x0000, @@ -420,7 +420,7 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x0000, + 0xa800, 0x6000, 0x6800, 0x6800, @@ -428,13 +428,13 @@ const uint16_t wifi_offline[] = { 0x5800, 0x0000, 0x8800, - 0xb000, - 0xb000, - 0xb000, + 0xf800, + 0xf800, + 0xf800, 0xa000, - 0xb000, - 0xb000, - 0xb000, + 0xf800, + 0xf800, + 0xf800, 0x8800, 0x0000, 0x0000, @@ -445,19 +445,19 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x6000, + 0xa800, 0x6800, 0x6800, 0x6800, 0x6800, - 0x4000, + 0xa800, 0x0000, 0x8800, - 0xb000, - 0xb000, - 0xb000, - 0xb000, - 0xb000, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, 0x8800, 0x0000, 0x0000, @@ -469,18 +469,18 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x5000, - 0x6800, - 0x6800, - 0x6800, - 0x6800, - 0x4800, + 0xa800, + 0xa800, + 0xa800, + 0xa800, + 0xa800, + 0xa800, 0x0000, 0x1800, 0xa000, - 0xb000, - 0xb000, - 0xb000, + 0xf800, + 0xf800, + 0xf800, 0xa000, 0x1800, 0x0000, @@ -494,18 +494,18 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x5000, - 0x6000, - 0x6000, - 0x5000, + 0xa800, + 0xa800, + 0xa800, + 0xa800, 0x0000, 0x0000, 0x8800, - 0xb000, - 0xb000, - 0xb000, - 0xb000, - 0xb000, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, 0x8800, 0x0000, 0x0000, @@ -518,19 +518,19 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + 0xa800, + 0xa800, + 0xa800, + 0xa800, 0x0000, 0x8800, - 0xb000, - 0xb000, - 0xb000, + 0xf800, + 0xf800, + 0xf800, 0xa000, - 0xb000, - 0xb000, - 0xb000, + 0xf800, + 0xf800, + 0xf800, 0x8800, 0x0000, 0x0000, @@ -543,18 +543,18 @@ const uint16_t wifi_offline[] = { 0x0000, 0x0000, 0x0000, - 0x0000, - 0x0000, + 0xa800, + 0xa800, 0x0000, 0x0000, 0xa800, - 0xb000, - 0xb000, + 0xf800, + 0xf800, 0x8800, 0x1800, 0x8800, - 0xb000, - 0xb000, + 0xf800, + 0xf800, 0xa800, 0x0000, 0x0000, diff --git a/firmware/keira/src/apps/icons/wifi_offline.png b/firmware/keira/src/apps/icons/wifi_offline.png index c11c0dac..d5b08aa7 100644 Binary files a/firmware/keira/src/apps/icons/wifi_offline.png and b/firmware/keira/src/apps/icons/wifi_offline.png differ diff --git a/firmware/keira/src/apps/launcher.cpp b/firmware/keira/src/apps/launcher.cpp index cc3207c7..65908ad8 100644 --- a/firmware/keira/src/apps/launcher.cpp +++ b/firmware/keira/src/apps/launcher.cpp @@ -4,8 +4,10 @@ #include "demos/lines.h" #include "demos/disk.h" #include "demos/ball.h" +#include "demos/transform.h" #include "demos/epilepsy.h" #include "demos/letris.h" +#include "demos/keyboard.h" #include "demos/user_spi.h" #include "demos/scan_i2c.h" #include "demos/wifi_scan.h" @@ -68,9 +70,11 @@ void LauncherApp::appsMenu() { String titles[] = { "Лінії", "Шайба", + "Перетворення", "М'ячик", "Епілепсія", "Летріс", + "Клавіатура", "Тест SPI", "I2C-сканер", "WiFi-сканер", @@ -80,9 +84,11 @@ void LauncherApp::appsMenu() { APP_CLASS_LIST classes = { APP_CLASS(DemoLines), APP_CLASS(DiskApp), + APP_CLASS(TransformApp), APP_CLASS(BallApp), APP_CLASS(EpilepsyApp), APP_CLASS(LetrisApp), + APP_CLASS(KeyboardApp), APP_CLASS(UserSPIApp), APP_CLASS(ScanI2CApp), APP_CLASS(WifiScanApp), diff --git a/firmware/keira/src/apps/statusbar.cpp b/firmware/keira/src/apps/statusbar.cpp index 3f9d2075..7323b172 100644 --- a/firmware/keira/src/apps/statusbar.cpp +++ b/firmware/keira/src/apps/statusbar.cpp @@ -8,6 +8,7 @@ #include "icons/wifi_1.h" #include "icons/wifi_2.h" #include "icons/wifi_3.h" +#include "icons/ram.h" #include "servicemanager.h" #include "services/network.h" @@ -18,56 +19,85 @@ const uint16_t* icons[] = {wifi_offline, wifi_0, wifi_1, wifi_2, wifi_3}; void StatusBarApp::run() { int counter = 0; - NetworkService* networkService = ServiceManager::getInstance()->getService(); + lilka::Canvas iconCanvas(240, 24); while (1) { canvas->fillScreen(lilka::display.color565(0, 0, 0)); - int16_t xOffset = 144; - // Print counter for debug purpose // TODO: Replace with actual time from NTP canvas->setTextColor(lilka::display.color565(255, 255, 255), lilka::display.color565(0, 0, 0)); canvas->setFont(FONT_9x15); - canvas->setCursor(32, 17); + canvas->setCursor(24, 17); canvas->print("Час: " + String(counter++)); - // Draw WiFi signal strength - if (networkService != NULL) { - if (networkService->getNetworkState() == NETWORK_STATE_OFFLINE) { - canvas->draw16bitRGBBitmapWithTranColor(144, 0, wifi_offline, 0, 24, 24); - } else if (networkService->getNetworkState() == NETWORK_STATE_CONNECTING) { - canvas->draw16bitRGBBitmapWithTranColor(144, 0, wifi_connecting, 0, 24, 24); - } else { - canvas->draw16bitRGBBitmapWithTranColor(144, 0, icons[networkService->getSignalStrength()], 0, 24, 24); - } - } - xOffset += 8 + 24; - - // Draw battery - int level = lilka::battery.readLevel(); - if (level == -1) { - canvas->draw16bitRGBBitmapWithTranColor( - xOffset, 0, battery_absent, lilka::display.color565(255, 0, 255), 32, 24 - ); - } else { - int16_t x1 = 6, y1 = 8; - int16_t fullWidth = 22, h = 8; - int filledWidth = fullWidth * level / 100; - if (filledWidth < 1) filledWidth = 1; - int16_t color = - level > 50 ? lilka::display.color565(0, 255, 0) - : (level > 20 ? lilka::display.color565(255, 255, 0) : lilka::display.color565(255, 0, 0)); - canvas->draw16bitRGBBitmapWithTranColor( - xOffset, 0, level > 10 ? battery : battery_danger, lilka::display.color565(255, 0, 255), 32, 24 - ); - canvas->fillRect(xOffset + x1 + (fullWidth - filledWidth), y1, filledWidth, h, color); - } - xOffset += 8 + 32; - canvas->setCursor(xOffset, 17); - canvas->print(String(level) + "%"); + // Draw icons + int16_t xOffset = drawIcons(&iconCanvas); + canvas->draw16bitRGBBitmap(canvas->width() - xOffset - 16, 0, iconCanvas.getFramebuffer(), 240, 24); // Draw everything queueDraw(); vTaskDelay(1000 / portTICK_PERIOD_MS); } } + +int16_t StatusBarApp::drawIcons(lilka::Canvas* iconCanvas) { + NetworkService* networkService = ServiceManager::getInstance()->getService(); + + int16_t xOffset = 0; + + iconCanvas->fillScreen(lilka::display.color565(0, 0, 0)); + iconCanvas->setFont(FONT_9x15); + + // Draw RAM usage + uint32_t freeRAM = ESP.getFreeHeap(); + uint32_t totalRAM = ESP.getHeapSize(); + int16_t padding = 1; + int16_t barWidth = 24 - padding * 2; + int16_t barHeight = barWidth; + int16_t barWidthUsed = barWidth * (totalRAM - freeRAM) / totalRAM; + iconCanvas->fillRect(xOffset + padding, padding, barWidthUsed, barHeight, lilka::display.color565(255, 0, 0)); + iconCanvas->draw16bitRGBBitmapWithTranColor(xOffset, 0, ram, lilka::display.color565(0, 0, 0), 24, 24); + xOffset += 4 + 24; + + // Draw WiFi signal strength + if (networkService != NULL) { + if (networkService->getNetworkState() == NETWORK_STATE_OFFLINE) { + iconCanvas->draw16bitRGBBitmapWithTranColor(xOffset, 0, wifi_offline, 0, 24, 24); + } else if (networkService->getNetworkState() == NETWORK_STATE_CONNECTING) { + iconCanvas->draw16bitRGBBitmapWithTranColor(xOffset, 0, wifi_connecting, 0, 24, 24); + } else if (networkService->getNetworkState() == NETWORK_STATE_ONLINE) { + iconCanvas->draw16bitRGBBitmapWithTranColor( + xOffset, 0, icons[networkService->getSignalStrength()], 0, 24, 24 + ); + } + xOffset += 4 + 24; + } + + // Draw battery + int level = lilka::battery.readLevel(); + if (level == -1) { + iconCanvas->draw16bitRGBBitmapWithTranColor( + xOffset, 0, battery_absent, lilka::display.color565(255, 0, 255), 16, 24 + ); + xOffset += 4 + 16; + } else { + int16_t x1 = 4, y1 = 6; + int16_t width = 8, fullHeight = 14; + int filledHeight = fullHeight * level / 100; + if (filledHeight < 1) filledHeight = 1; + int emptyHeight = fullHeight - filledHeight; + int16_t color = level > 50 + ? lilka::display.color565(0, 255, 0) + : (level > 20 ? lilka::display.color565(255, 255, 0) : lilka::display.color565(255, 0, 0)); + iconCanvas->draw16bitRGBBitmapWithTranColor( + xOffset, 0, level > 10 ? battery : battery_danger, lilka::display.color565(255, 0, 255), 16, 24 + ); + iconCanvas->fillRect(xOffset + x1, y1 + emptyHeight, width, filledHeight, color); + xOffset += 4 + 16; + iconCanvas->setCursor(xOffset, 17); + iconCanvas->print(String(level) + "%"); + xOffset += 36; + } + + return xOffset; +} diff --git a/firmware/keira/src/apps/statusbar.h b/firmware/keira/src/apps/statusbar.h index 42c54681..40ae2029 100644 --- a/firmware/keira/src/apps/statusbar.h +++ b/firmware/keira/src/apps/statusbar.h @@ -8,4 +8,5 @@ class StatusBarApp : public App { private: void run() override; + int16_t drawIcons(lilka::Canvas* canvas); }; diff --git a/firmware/keira/assets/keira_splash.png b/firmware/keira/src/keira_splash.png similarity index 100% rename from firmware/keira/assets/keira_splash.png rename to firmware/keira/src/keira_splash.png diff --git a/sdk/lib/lilka/assets/default_splash.png b/sdk/lib/lilka/src/lilka/default_splash.png similarity index 100% rename from sdk/lib/lilka/assets/default_splash.png rename to sdk/lib/lilka/src/lilka/default_splash.png diff --git a/sdk/lib/lilka/src/lilka/display.cpp b/sdk/lib/lilka/src/lilka/display.cpp index afa57033..97c72705 100644 --- a/sdk/lib/lilka/src/lilka/display.cpp +++ b/sdk/lib/lilka/src/lilka/display.cpp @@ -93,12 +93,55 @@ void Display::setSplash(const uint16_t* splash) { void Display::drawImage(Image* image, int16_t x, int16_t y) { if (image->transparentColor == -1) { - draw16bitRGBBitmap(x, y, image->pixels, image->width, image->height); + draw16bitRGBBitmap(x - image->pivotX, y - image->pivotY, image->pixels, image->width, image->height); } else { - draw16bitRGBBitmapWithTranColor(x, y, image->pixels, image->transparentColor, image->width, image->height); + draw16bitRGBBitmapWithTranColor( + x - image->pivotX, y - image->pivotY, image->pixels, image->transparentColor, image->width, image->height + ); } } +void Display::drawImageTransformed(Image* image, int16_t destX, int16_t destY, Transform transform) { + // Transform image around its pivot. + // Draw the rotated image at the specified position. + + int32_t imageWidth = image->width; + int32_t imageHeight = image->height; + + // Calculate the coordinates of the four corners of the destination rectangle. + int_vector_t v1 = transform.transform(int_vector_t{-image->pivotX, -image->pivotY}); + int_vector_t v2 = transform.transform(int_vector_t{imageWidth - image->pivotX, -image->pivotY}); + int_vector_t v3 = transform.transform(int_vector_t{-image->pivotX, imageHeight - image->pivotY}); + int_vector_t v4 = transform.transform(int_vector_t{imageWidth - image->pivotX, imageHeight - image->pivotY}); + + // Find the bounding box of the transformed image. + int_vector_t topLeft = int_vector_t{min(min(v1.x, v2.x), min(v3.x, v4.x)), min(min(v1.y, v2.y), min(v3.y, v4.y))}; + int_vector_t bottomRight = + int_vector_t{max(max(v1.x, v2.x), max(v3.x, v4.x)), max(max(v1.y, v2.y), max(v3.y, v4.y))}; + + // Create a new image to hold the transformed image. + Image destImage(bottomRight.x - topLeft.x, bottomRight.y - topLeft.y, image->transparentColor, 0, 0); + + // Draw the transformed image to the new image. + Transform inverse = transform.inverse(); + for (int y = topLeft.y; y < bottomRight.y; y++) { + for (int x = topLeft.x; x < bottomRight.x; x++) { + int_vector_t v = inverse.transform(int_vector_t{x, y}); + // Apply pivot offset + v.x += image->pivotX; + v.y += image->pivotY; + if (v.x >= 0 && v.x < image->width && v.y >= 0 && v.y < image->height) { + destImage.pixels[x - topLeft.x + (y - topLeft.y) * destImage.width] = + image->pixels[v.x + v.y * image->width]; + } else { + destImage.pixels[x - topLeft.x + (y - topLeft.y) * destImage.width] = image->transparentColor; + } + } + } + + drawImage(&destImage, destX + topLeft.x, destY + topLeft.y); +} + // Чомусь в Arduino_GFX немає варіанту цього методу для const uint16_t[] - є лише для uint16_t. void Display::draw16bitRGBBitmapWithTranColor( int16_t x, int16_t y, const uint16_t bitmap[], uint16_t transparent_color, int16_t w, int16_t h @@ -132,12 +175,62 @@ Canvas::Canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) : void Canvas::drawImage(Image* image, int16_t x, int16_t y) { if (image->transparentColor == -1) { - draw16bitRGBBitmap(x, y, image->pixels, image->width, image->height); + draw16bitRGBBitmap(x - image->pivotX, y - image->pivotY, image->pixels, image->width, image->height); } else { - draw16bitRGBBitmapWithTranColor(x, y, image->pixels, image->transparentColor, image->width, image->height); + draw16bitRGBBitmapWithTranColor( + x - image->pivotX, y - image->pivotY, image->pixels, image->transparentColor, image->width, image->height + ); } } +void Canvas::drawImageTransformed(Image* image, int16_t destX, int16_t destY, Transform transform) { + // Transform image around its pivot. + // Draw the rotated image at the specified position. + + // Calculate the coordinates of the four corners of the destination rectangle. + int32_t imageWidth = image->width; + int32_t imageHeight = image->height; + + // Calculate the coordinates of the four corners of the destination rectangle. + int_vector_t v1 = transform.transform(int_vector_t{-image->pivotX, -image->pivotY}); + int_vector_t v2 = transform.transform(int_vector_t{imageWidth - image->pivotX, -image->pivotY}); + int_vector_t v3 = transform.transform(int_vector_t{-image->pivotX, imageHeight - image->pivotY}); + int_vector_t v4 = transform.transform(int_vector_t{imageWidth - image->pivotX, imageHeight - image->pivotY}); + + // Find the bounding box of the transformed image. + int_vector_t topLeft = int_vector_t{min(min(v1.x, v2.x), min(v3.x, v4.x)), min(min(v1.y, v2.y), min(v3.y, v4.y))}; + int_vector_t bottomRight = + int_vector_t{max(max(v1.x, v2.x), max(v3.x, v4.x)), max(max(v1.y, v2.y), max(v3.y, v4.y))}; + + // Create a new image to hold the transformed image. + Image destImage(bottomRight.x - topLeft.x, bottomRight.y - topLeft.y, image->transparentColor, 0, 0); + + // Draw the transformed image to the new image. + Transform inverse = transform.inverse(); + uint64_t start = esp_timer_get_time(); + int_vector_t point{0, 0}; + for (point.y = topLeft.y; point.y < bottomRight.y; point.y++) { + for (point.x = topLeft.x; point.x < bottomRight.x; point.x++) { + int_vector_t v = inverse.transform(point); + // Apply pivot offset + v.x += image->pivotX; + v.y += image->pivotY; + if (v.x >= 0 && v.x < image->width && v.y >= 0 && v.y < image->height) { + destImage.pixels[point.x - topLeft.x + (point.y - topLeft.y) * destImage.width] = + image->pixels[v.x + v.y * image->width]; + } else { + destImage.pixels[point.x - topLeft.x + (point.y - topLeft.y) * destImage.width] = + image->transparentColor; + } + } + } + uint64_t end = esp_timer_get_time(); + Serial.println("Transformed image in " + String(end - start) + " us"); + + // TODO: Draw directly to the canvas? + drawImage(&destImage, destX + topLeft.x, destY + topLeft.y); +} + void Canvas::draw16bitRGBBitmapWithTranColor( int16_t x, int16_t y, const uint16_t bitmap[], uint16_t transparent_color, int16_t w, int16_t h ) { @@ -158,8 +251,8 @@ int16_t Canvas::y() { return _output_y; } -Image::Image(uint32_t width, uint32_t height, int32_t transparentColor) : - width(width), height(height), transparentColor(transparentColor) { +Image::Image(uint32_t width, uint32_t height, int32_t transparentColor, int16_t pivotX, int16_t pivotY) : + width(width), height(height), transparentColor(transparentColor), pivotX(pivotX), pivotY(pivotY) { // Allocate pixels in PSRAM pixels = static_cast(ps_malloc(width * height * sizeof(uint16_t))); } @@ -204,6 +297,79 @@ void Image::flipY(Image* dest) { } } +Transform::Transform() : matrix{{1, 0}, {0, 1}} { +} + +// Copy constructor +Transform::Transform(const Transform& other) { + matrix[0][0] = other.matrix[0][0]; + matrix[0][1] = other.matrix[0][1]; + matrix[1][0] = other.matrix[1][0]; + matrix[1][1] = other.matrix[1][1]; +} + +// Copy assignment operator +Transform& Transform::operator=(const Transform& other) { + if (this != &other) { + matrix[0][0] = other.matrix[0][0]; + matrix[0][1] = other.matrix[0][1]; + matrix[1][0] = other.matrix[1][0]; + matrix[1][1] = other.matrix[1][1]; + } + return *this; +} + +Transform Transform::multiply(Transform other) { + // Apply other transform to this transform + Transform t; + t.matrix[0][0] = matrix[0][0] * other.matrix[0][0] + matrix[0][1] * other.matrix[1][0]; + t.matrix[0][1] = matrix[0][0] * other.matrix[0][1] + matrix[0][1] * other.matrix[1][1]; + t.matrix[1][0] = matrix[1][0] * other.matrix[0][0] + matrix[1][1] * other.matrix[1][0]; + t.matrix[1][1] = matrix[1][0] * other.matrix[0][1] + matrix[1][1] * other.matrix[1][1]; + return t; +} + +Transform Transform::rotate(int16_t angle) { + // Rotate this transform by angle. Do this by multiplying with a rotation matrix. + Transform t; + t.matrix[0][0] = fCos360(angle); + t.matrix[0][1] = -fSin360(angle); + t.matrix[1][0] = fSin360(angle); + t.matrix[1][1] = fCos360(angle); + // Apply the rotation to this transform + return t.multiply(*this); +} + +Transform Transform::scale(float sx, float sy) { + // Scale this transform by sx and sy. Do this by multiplying with a scaling matrix. + Transform t; + t.matrix[0][0] = sx; + t.matrix[0][1] = 0; + t.matrix[1][0] = 0; + t.matrix[1][1] = sy; + // Apply the scaling to this transform + return t.multiply(*this); +} + +Transform Transform::inverse() { + // Calculate the inverse of this transform + Transform t; + float det = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; + t.matrix[0][0] = matrix[1][1] / det; + t.matrix[0][1] = -matrix[0][1] / det; + t.matrix[1][0] = -matrix[1][0] / det; + t.matrix[1][1] = matrix[0][0] / det; + return t; +} + +inline int_vector_t Transform::transform(int_vector_t v) { + // Apply this transform to a vector + return int_vector_t{ + static_cast(matrix[0][0] * v.x + matrix[0][1] * v.y), + static_cast(matrix[1][0] * v.x + matrix[1][1] * v.y) + }; +} + Display display; } // namespace lilka diff --git a/sdk/lib/lilka/src/lilka/display.h b/sdk/lib/lilka/src/lilka/display.h index 9bbffccf..ccc50602 100644 --- a/sdk/lib/lilka/src/lilka/display.h +++ b/sdk/lib/lilka/src/lilka/display.h @@ -21,6 +21,11 @@ namespace lilka { class Canvas; class Image; +class Transform; +typedef struct int_vector_t { + int32_t x; + int32_t y; +} int_vector_t; /// Клас для роботи з дисплеєм. /// @@ -171,8 +176,8 @@ class Display : public Arduino_ST7789 { /// Намалювати зображення. /// @param image Вказівник на зображення (об'єкт класу `lilka::Image`). - /// @param x Координата X лівого верхнього кута зображення. - /// @param y Координата Y лівого верхнього кута зображення. + /// @param x Координата X осі зображення. + /// @param y Координата Y осі зображення. /// /// Приклад використання: /// @@ -187,6 +192,14 @@ class Display : public Arduino_ST7789 { /// delete image; /// @endcode void drawImage(Image* image, int16_t x, int16_t y); + /// Намалювати зображення з афінними перетвореннями. + /// @param image Вказівник на зображення (об'єкт класу `lilka::Image`). + /// @param x Координата X осі зображення. + /// @param y Координата Y осі зображення. + /// @param transform Об'єкт класу `lilka::Transform`, який містить матрицю перетворення. + /// @note Зверніть увагу, що перетворення - це повільніше, ніж звичайне малювання зображення, оскільки обчислює координати пікселів "на льоту". Використовуйте його лише тоді, коли не можете заздалегідь створити обернені копії зображеня за допомогою методів `lilka::Image::rotate`, `lilka::Image::flipX` та `lilka::Image::flipY`. + /// @see lilka::Transform + void drawImageTransformed(Image* image, int16_t x, int16_t y, Transform transform); #ifdef DOXYGEN /// Намалювати зображення з масиву 16-бітних точок. @@ -238,14 +251,15 @@ class Display : public Arduino_ST7789 { /// Клас для роботи з графічним буфером. /// -/// При частому перемальовуванні екрану без використання буфера, може спостерігатися мерехтіння. +/// При частому перемальовуванні екрану без використання буфера може спостерігатися мерехтіння. /// Наприклад, якщо використовувати метод `fillScreen` для очищення екрану перед кожним викликом `print`, /// то текст буде мерехтіти. /// /// Щоб уникнути цього, можна використовувати буфер. Цей клас дозволяє малювати графічні об'єкти на буфері, /// а потім відобразити його на екрані за допомогою методу `lilka::display.renderCanvas`. /// -/// Такий підхід дозволяє зменшити мерехтіння, але збільшує використання пам'яті. Він називається "буферизація". +/// Такий підхід дозволяє зменшити мерехтіння, але збільшує використання пам'яті. Він називається "буферизація", +/// оскільки ми спершу малюємо на буфері, а тоді відображаємо буфер на екрані. /// /// Цей клас, як і `Display`, є підкласом `Arduino_GFX` з бібліотеки `Arduino_GFX_Library`. /// Це означає, що майже всі методи, які доступні в `Display`, також доступні в `Canvas`. @@ -260,11 +274,11 @@ class Display : public Arduino_ST7789 { /// } /// /// void loop() { -/// lilka::Canvas canvas; +/// lilka::Canvas canvas; // Створити новий Canvas зі стандартним розміром (розмір дисплею) /// int y = 100; /// while (1) { /// canvas.fillScreen(lilka::display.color565(0, 0, 0)); // Заповнити буфер чорним кольором -/// canvas.setCursor(32, 0); +/// canvas.setCursor(32, y); /// canvas.setTextColor(lilka::display.color565(0, 0, 0)); // Білий текст /// canvas.print("Привіт, Лілка!"); /// lilka::display.renderCanvas(&canvas); // Відобразити буфер на екрані - жодного мерехтіння! @@ -283,6 +297,9 @@ class Canvas : public Arduino_Canvas { /// Намалювати зображення. /// @see Display::drawImage void drawImage(Image* image, int16_t x, int16_t y); + /// Намалювати зображення з афінними перетвореннями. + /// @see Display::drawImageTransformed + void drawImageTransformed(Image* image, int16_t x, int16_t y, Transform transform); void draw16bitRGBBitmapWithTranColor( int16_t x, int16_t y, const uint16_t bitmap[], uint16_t transparent_color, int16_t w, int16_t h ); @@ -296,13 +313,19 @@ class Canvas : public Arduino_Canvas { /// Містить розміри, прозорий колір та пікселі зображення (в 16-бітному форматі, 5-6-5). /// Пікселі зберігаються в рядку зліва направо, зверху вниз. /// +/// Вісь зображення - це точка, яка вказує на центр зображення. Це дозволяє вам встановити точку, відносно якої буде відображатися зображення, а також навколо якої буде відбуватися перетворення зображення. +/// /// @note Основна відмінність Image від поняття "bitmap" погялає в тому, що Image містить масив пікселів, розміри зображення і прозорий колір, в той час як "bitmap" - це просто масив пікселів. class Image { public: - Image(uint32_t width, uint32_t height, int32_t transparentColor = -1); + Image(uint32_t width, uint32_t height, int32_t transparentColor = -1, int16_t pivotX = 0, int16_t pivotY = 0); ~Image(); /// Обернути зображення на заданий кут (в градусах) і записати результат в `dest`. /// + /// Цей метод, а також методи `flipX` та `flipY`, зручно використовувати для створення обернених та віддзеркалених копій зображення, якщо ви заздалегідь знаєте, які варіанти зображення вам знадобляться. + /// + /// Замість них можна використовувати клас `lilka::Transform` та його методи, які дозволяють виконувати та комбінувати складніші перетворення "на льоту", але такі перетворення є повільнішими. + /// /// @param angle Кут обертання в градусах. /// @param dest Вказівник на Image, в яке буде записано обернуте зображення. /// @param blankColor 16-бітний колір (5-6-5), який буде використаний для заповнення пікселів, які виходять за межі зображення. @@ -323,6 +346,7 @@ class Image { /// delete image; /// delete rotatedImage; /// @endcode + /// @see Display::drawImageTransformed, Canvas::drawImageTransformed, Transform void rotate(int16_t angle, Image* dest, int32_t blankColor); /// Віддзеркалити зображення по горизонталі і записати результат в `dest`. void flipX(Image* dest); @@ -332,9 +356,71 @@ class Image { uint32_t height; /// 16-бітний колір (5-6-5), який буде прозорим. За замовчуванням -1 (прозорість відсутня). int32_t transparentColor; + int16_t pivotX; + int16_t pivotY; uint16_t* pixels; }; +/// Клас для роботи з афінними перетвореннями. +/// +/// Афінні перетворення - це перетворення, які зберігають паралельність ліній. +/// Вони включають в себе обертання, масштабування та віддзеркалення. +/// +/// Перетворення - це всього лиш матриця 2x2. Застосування перетворення до вектора - це множення цього вектора на матрицю перетворення. Магія! +/// +/// Наприклад, ось цей код обертає зображення на 30 градусів і тоді віддзеркалює його по горизонталі: +/// +/// @code +/// lilka::Transform transform = lilka::Transform().rotate(30).flipX(); +/// lilka::display.drawImageTransformed(image, 32, 64, transform); +/// @endcode +class Transform { +public: + /// Створити об'єкт класу `lilka::Transform`. + Transform(); + Transform(const Transform& other); + Transform& operator=(const Transform& other); + /// Обернути навколо центру на кут `angle` (в градусах). + /// + /// Оскільки на екрані вісь Y вказує вниз, обертання буде здійснено за годинниковою стрілкою. + /// @param angle Кут обертання в градусах. + /// @return Нове перетворення. + Transform rotate(int16_t angle); + /// Масштабувати по X та Y. + /// + /// Щоб віддзеркалити зображення, використайте від'ємні значення (наприклад, -1). + /// @param scaleX Масштаб по X. + /// @param scaleY Масштаб по Y. + /// @return Нове перетворення. + Transform scale(float scaleX, float scaleY); + + /// Помножити це перетворення на інше. + /// + /// @note Зверніть увагу: при комбінації перетворень порядок важливий, і він є оберненим до порядку множення матриць! В результаті цього, перетворення other буде виконано **перед** поточним перетворенням. Тобто якщо в вас є деякі перетворення `A` та `B`, то перетворення `A.multiply(B)` утворить нове перетворення, в якому спочатку виконається перетворення `B`, а потім `A`. + /// @note Для уникнення плутанини рекомендуємо використовувати більш високорівневі методи, такі як `rotate` та `scale`. + /// @param other Інше перетворення. + /// @return Перетворення, яке є результатом застосування цього перетворення після `other` перетворення. + /// @code + /// lilka::Transform rotate30 = lilka::Transform().rotate(30); // обернути на 30 градусів + /// lilka::Transform scale2x = lilka::Transform().scale(2, 2); // збільшити в 2 рази + /// lilka::Transform scaleThenRotate = rotate30.multiply(scale2x); // результат - це перетворення "спочатку збільшити, а потім обернути", а не навпаки! + /// @endcode + Transform multiply(Transform other); + + /// Інвертувати перетворення. + /// @note Інвертне перетворення - це таке перетворення, яке скасує це перетворення, тобто є зворотнім до цього. + /// @return Інвертоване перетворення. + Transform inverse(); + + /// Перетворити вектор, використовуючи це перетворення. + /// @param vector Вхідний вектор. + /// @return Результат перетворення. + int_vector_t transform(int_vector_t vector); + + // Матриця перетворення + float matrix[2][2]; // [рядок][стовпець] +}; + /// Екземпляр класу `Display`, який можна використовувати для роботи з дисплеєм. /// Вам не потрібно інстанціювати `Display` вручну. extern Display display; diff --git a/sdk/lib/lilka/src/lilka/resources.cpp b/sdk/lib/lilka/src/lilka/resources.cpp index 06fa40eb..cb4e1111 100644 --- a/sdk/lib/lilka/src/lilka/resources.cpp +++ b/sdk/lib/lilka/src/lilka/resources.cpp @@ -5,7 +5,7 @@ namespace lilka { -Image* Resources::loadImage(String filename, int32_t transparentColor) { +Image* Resources::loadImage(String filename, int32_t transparentColor, int32_t pivotX, int32_t pivotY) { FILE* file = fopen(filename.c_str(), "r"); if (!file) { // serial_err("File not found: %s\n", filename.c_str()); @@ -37,7 +37,7 @@ Image* Resources::loadImage(String filename, int32_t transparentColor) { return 0; } - Image* image = new Image(width, height, transparentColor); + Image* image = new Image(width, height, transparentColor, pivotX, pivotY); fseek(file, dataOffset, SEEK_SET); uint8_t row[width * bytesPerPixel]; for (int y = height - 1; y >= 0; y--) { diff --git a/sdk/lib/lilka/src/lilka/resources.h b/sdk/lib/lilka/src/lilka/resources.h index 16b18c49..a9377e40 100644 --- a/sdk/lib/lilka/src/lilka/resources.h +++ b/sdk/lib/lilka/src/lilka/resources.h @@ -13,6 +13,8 @@ class Resources { /// /// \param filename Шлях до файлу. /// \param transparentColor 16-бітний колір (5-6-5), який буде прозорим. За замовчуванням -1 (прозорість відсутня). + /// \param pivotX X-координата точки, яка буде центром зображення. За замовчуванням 0. + /// \param pivotY Y-координата точки, яка буде центром зображення. За замовчуванням 0. /// \return Вказівник на зображення. /// /// \warning Пам'ять для зображення виділяється динамічно. Після використання зображення, його потрібно видалити за допомогою `delete`. @@ -32,7 +34,7 @@ class Resources { /// // Звільнити пам'ять /// delete image; /// \endcode - Image* loadImage(String filename, int32_t transparentColor = -1); + Image* loadImage(String filename, int32_t transparentColor = -1, int32_t pivotX = 0, int32_t pivotY = 0); /// Прочитати вміст файлу. /// /// TODO: Update sdcard/filesystem stuff diff --git a/sdk/lib/lilka/src/lilka/ui.cpp b/sdk/lib/lilka/src/lilka/ui.cpp index 8ce0866c..68f0ad29 100644 --- a/sdk/lib/lilka/src/lilka/ui.cpp +++ b/sdk/lib/lilka/src/lilka/ui.cpp @@ -255,4 +255,193 @@ void ProgressDialog::draw(Arduino_GFX* canvas) { canvas->print(buf); } +#define K_L0 1 +#define K_L1 2 +#define K_L2 3 +#define K_BS 8 + +// 2 layers, 4 rows, 12 columns +const uint8_t keyboard[LILKA_KB_LAYERS][LILKA_KB_ROWS * LILKA_KB_COLS] = { + // Layer 0 + { + ' ', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ' ', // R1 + ' ', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', ' ', // R2 + K_L1, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', K_BS, ' ', // R3 + K_L2, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', ' ', ' ', // R4 + }, + // Layer 1 (shifted layer 0) + { + ' ', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', ' ', // R1 + ' ', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', ' ', // R2 + K_L0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', K_BS, ' ', // R3 + K_L2, 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', ' ', ' ', // R4 + }, + // Layer 2 (special keys - braces, slashes, etc) + { + ' ', '{', '}', '[', ']', '|', '\\', ':', ';', '\'', '"', ' ', // R1 + ' ', '<', '>', '?', '/', '!', '@', '#', '$', '%', '^', ' ', // R2 + ' ', '(', ')', '-', '_', '=', '+', ':', ';', '\'', K_BS, ' ', // R3 + K_L0, '<', '>', '?', '/', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // R4 + }, +}; + +InputDialog::InputDialog(String title) { + this->title = title; + this->masked = false; + + this->done = false; + this->value = ""; + + this->layer = 0; + this->cx = 0; + this->cy = 0; + + this->lastBlink = 0; + this->blinkPhase = true; +} + +void InputDialog::setMasked(bool masked) { + this->masked = masked; +} + +void InputDialog::update() { + if (millis() - lastBlink > 300) { + lastBlink = millis(); + blinkPhase = !blinkPhase; + } + + State state = controller.getState(); + if (state.a.justPressed) { + // TODO: Handle key press + const uint8_t* layerKeys = keyboard[layer]; + uint8_t key = layerKeys[cy * LILKA_KB_COLS + cx]; + if (key == K_L0) { + layer = 0; + } else if (key == K_L1) { + layer = 1; + } else if (key == K_L2) { + layer = 2; + } else if (key == K_BS) { + if (value.length() > 0) { + value.remove(value.length() - 1); + } + } else if (key) { + value += (char)key; + } + resetBlink(); + } else if (state.b.justPressed) { + if (value.length() > 0) { + value.remove(value.length() - 1); + } + resetBlink(); + } else if (state.start.justPressed) { + done = true; + } else if (state.up.justPressed) { + cy--; + if (cy < 0) { + cy = LILKA_KB_ROWS - 1; + } + } else if (state.down.justPressed) { + cy++; + if (cy > LILKA_KB_ROWS - 1) { + cy = 0; + } + } else if (state.left.justPressed) { + cx--; + if (cx < 0) { + cx = LILKA_KB_COLS - 1; + } + } else if (state.right.justPressed) { + cx++; + if (cx > LILKA_KB_COLS - 1) { + cx = 0; + } + } +} + +void InputDialog::draw(Arduino_GFX* canvas) { + // Draw keyboard + int16_t kbTop = canvas->height() / 2 - 32; + int16_t kbHeight = canvas->height() / 2; + int16_t kbWidth = canvas->width(); + + canvas->fillRect(0, 0, canvas->width(), canvas->height(), canvas->color565(0, 0, 0)); + canvas->setTextColor(canvas->color565(255, 255, 255)); + canvas->setFont(FONT_10x20); + + canvas->setTextBound(4, 4, canvas->width() - 8, canvas->height() - 8); + canvas->setCursor(4, 20); + canvas->println(title); + + canvas->setTextBound(16, 16, canvas->width() - 32, canvas->height() - 32); + canvas->setCursor(16, 48); + if (masked) { + for (int i = 0; i < value.length(); i++) { + canvas->print("*"); + } + } else { + canvas->print(value); + } + if (blinkPhase) { + canvas->print("|"); + } + + // canvas->setTextBound(0, kbTop + kbHeight, canvas->width(), canvas->height()); + + const uint8_t* layerKeys = keyboard[layer]; + + for (int i = 0; i < LILKA_KB_ROWS; i++) { + for (int j = 0; j < LILKA_KB_COLS; j++) { + // Draw rect if key is focused + if (i == cy && j == cx) { + canvas->fillRect( + j * kbWidth / LILKA_KB_COLS, + kbTop + i * kbHeight / LILKA_KB_ROWS, + kbWidth / LILKA_KB_COLS, + kbHeight / LILKA_KB_ROWS, + canvas->color565(255, 64, 0) + ); + } + uint8_t key = layerKeys[i * LILKA_KB_COLS + j]; + if (key) { + String caption; + if (key == K_L0 || key == K_L1 || key == K_L2) { + caption = key == K_L0 ? "ab" : key == K_L1 ? "AB" : "!@"; + } else if (key == K_BS) { + caption = "<-"; + } else { + caption = (char)key; + } + int16_t x1, y1; + uint16_t w, h; + // Calculate text top-left corner and size + canvas->getTextBounds(caption, 0, 0, &x1, &y1, &w, &h); + // Print centered text + canvas->setCursor( + j * kbWidth / LILKA_KB_COLS + (kbWidth / LILKA_KB_COLS - w) / 2, + kbTop + i * kbHeight / LILKA_KB_ROWS + (kbHeight / LILKA_KB_ROWS - h) / 2 - y1 + ); + canvas->print(caption); + } + } + } +} + +bool InputDialog::isDone() { + if (done) { + done = false; + return true; + } + return false; +} + +String InputDialog::getValue() { + return value; +} + +void InputDialog::resetBlink() { + lastBlink = millis(); + blinkPhase = true; +} + } // namespace lilka diff --git a/sdk/lib/lilka/src/lilka/ui.h b/sdk/lib/lilka/src/lilka/ui.h index f2d43ca1..80a00cc5 100644 --- a/sdk/lib/lilka/src/lilka/ui.h +++ b/sdk/lib/lilka/src/lilka/ui.h @@ -201,6 +201,37 @@ class ProgressDialog { int16_t progress; }; +#define LILKA_KB_LAYERS 3 +#define LILKA_KB_ROWS 4 +#define LILKA_KB_COLS 12 + +/// Клас для відображення діалогового вікна введення. +/// +/// Малює вікно введення та екранну клавіатуру, дозволяє вводити текст та підтверджувати введення. +class InputDialog { +public: + explicit InputDialog(String title); + void setMasked(bool masked); + void update(); + void draw(Arduino_GFX* canvas); + bool isDone(); + String getValue(); + +private: + void resetBlink(); + + String title; + bool masked; + String value; + bool done; + + int16_t layer; + int16_t cx; + int16_t cy; + int64_t lastBlink; + bool blinkPhase; +}; + } // namespace lilka #endif // LILKA_UI_H diff --git a/sdk/tools/image2code/ship.h b/sdk/tools/image2code/ship.h new file mode 100644 index 00000000..248e5869 --- /dev/null +++ b/sdk/tools/image2code/ship.h @@ -0,0 +1,1032 @@ +// This is a generated file, do not edit. +// clang-format off +#include +const uint16_t ship_width = 32; +const uint16_t ship_height = 32; +const uint16_t ship[] = { + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0xe800, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0xe800, + 0xe800, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0xe800, + 0xe800, + 0xe800, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0xe800, + 0xe800, + 0xe800, + 0xe800, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0xe800, + 0xe800, + 0xe800, + 0xe800, + 0xe800, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0xffff, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffea, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffea, + 0xffea, + 0x0000, + 0xaaa0, + 0x0000, + 0x0000, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffea, + 0xffea, + 0x0000, + 0xaaa0, + 0xaaa0, + 0x0000, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffea, + 0xffea, + 0x0000, + 0xaaa0, + 0x0000, + 0x0000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0x0000, + 0x57ff, + 0x57ff, + 0x57ff, + 0x52bf, + 0x52bf, + 0x0000, + 0xc000, + 0xc000, + 0xc000, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0xf800, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffea, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0xc000, + 0xc000, + 0xc000, + 0x0000, + 0x57ff, + 0x57ff, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x0000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0xf800, + 0xf800, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0xffff, + 0xffff, + 0x0000, + 0xc000, + 0xc000, + 0xc000, + 0x0000, + 0x57ff, + 0x57ff, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x0000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0xc000, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x57ff, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x57ff, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0x0000, + 0xffff, + 0xffff, + 0x0000, + 0x8000, + 0x8000, + 0x8000, + 0x0000, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x0000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffea, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x8000, + 0x8000, + 0x8000, + 0x0000, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x0000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x5000, + 0x5000, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffea, + 0xffea, + 0x0000, + 0xaaa0, + 0x0000, + 0x0000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x0000, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x52bf, + 0x0000, + 0x8000, + 0x8000, + 0x8000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffea, + 0xffea, + 0x0000, + 0xaaa0, + 0xaaa0, + 0x0000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffea, + 0xffea, + 0x0000, + 0xaaa0, + 0x0000, + 0x0000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffea, + 0x0000, + 0x0000, + 0xffff, + 0x0000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x5000, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0xffff, + 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x8000, + 0x8000, + 0x8000, + 0x8000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x8000, + 0x8000, + 0x8000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x8000, + 0x8000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x8000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0x0000, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, +}; +// clang-format on