diff --git a/firmware/keira/src/apps/demos/cube.cpp b/firmware/keira/src/apps/demos/cube.cpp new file mode 100644 index 00000000..da9aced7 --- /dev/null +++ b/firmware/keira/src/apps/demos/cube.cpp @@ -0,0 +1,119 @@ +#include "cube.h" + +CubeApp::CubeApp() : App("Cube") { +} + +typedef struct vec2 { + float x, y; +} vec2; + +typedef struct vec3 { + float x, y, z; +} vec3; + +vec2 add(vec2 a, vec2 b) { + return {a.x + b.x, a.y + b.y}; +} + +vec2 neg(vec2 a) { + return {-a.x, -a.y}; +} + +vec3 add(vec3 a, vec3 b) { + return {a.x + b.x, a.y + b.y, a.z + b.z}; +} + +vec3 mul(vec3 a, float f) { + return {a.x * f, a.y * f, a.z * f}; +} + +float sqr(float a) { + return a * a; +} + +vec3 rotate(vec3 v, vec3 axis, float angle) { + float s = sin(angle); + float c = cos(angle); + return { + v.x * (c + sqr(axis.x) * (1 - c)) + v.y * (axis.x * axis.y * (1 - c) - axis.z * s) + + v.z * (axis.x * axis.z * (1 - c) + axis.y * s), + v.x * (axis.y * axis.x * (1 - c) + axis.z * s) + v.y * (c + sqr(axis.y) * (1 - c)) + + v.z * (axis.y * axis.z * (1 - c) - axis.x * s), + v.x * (axis.z * axis.x * (1 - c) - axis.y * s) + v.y * (axis.z * axis.y * (1 - c) + axis.x * s) + + v.z * (c + sqr(axis.z) * (1 - c)), + }; +} + +typedef struct line { + vec3 a, b; +} line; + +vec2 project(vec3 v, lilka::Canvas* canvas) { + return { + v.x / (v.z * 0.25f) * canvas->height() / 4.0f + canvas->width() / 2.0f, + v.y / (v.z * 0.25f) * canvas->height() / 4.0f + canvas->height() / 2.0f, + }; +} + +void drawLines( + lilka::Canvas* canvas, const line* lines, int count, int thickness, float angle, float angle2, int32_t color +) { + for (int i = 0; i < count; i++) { + vec3 axis = rotate({0, 1, 0}, {0, 0, 1}, angle); + vec3 a = rotate(lines[i].a, axis, angle2); + vec3 b = rotate(lines[i].b, axis, angle2); + a.z += 4; + b.z += 4; + + vec2 aa = project(a, canvas); + vec2 bb = project(b, canvas); + + if (color < 0) { + color = canvas->color565(random(128, 255), random(128, 255), random(128, 255)); + } + for (int y = 0; y < thickness; y++) { + for (int x = 0; x < thickness; x++) { + canvas->drawLine(aa.x + x, aa.y + y, bb.x + x, bb.y + y, color); + } + } + } +} + +void CubeApp::run() { + line cube[] = { + {{-1, -1, -1}, {-1, 1, -1}}, + {{-1, 1, -1}, {1, 1, -1}}, + {{1, 1, -1}, {1, -1, -1}}, + {{1, -1, -1}, {-1, -1, -1}}, + {{-1, -1, 1}, {-1, 1, 1}}, + {{-1, 1, 1}, {1, 1, 1}}, + {{1, 1, 1}, {1, -1, 1}}, + {{1, -1, 1}, {-1, -1, 1}}, + {{-1, -1, -1}, {-1, -1, 1}}, + {{-1, 1, -1}, {-1, 1, 1}}, + {{1, 1, -1}, {1, 1, 1}}, + {{1, -1, -1}, {1, -1, 1}}, + }; + + constexpr uint8_t size = sizeof(cube) / sizeof(cube[0]); + + line cube2[size]; + for (int i = 0; i < size; i++) { + cube2[i].a = mul(cube[i].a, 0.5); + cube2[i].b = mul(cube[i].b, 0.5); + } + + while (1) { + lilka::State state = lilka::controller.getState(); + if (state.a.justPressed) { + return; + } + + float time = millis() / 1000.0f; + + canvas->fillScreen(0); + drawLines(canvas, cube2, size, 1, (-time - 1) * 3.1415, (-time - 1) * 3.1415 * 1.3, 0xFFFF); + drawLines(canvas, cube, size, 3, time * 3.1415, time * 3.1415 * 1.3, -1); + queueDraw(); + } +} diff --git a/firmware/keira/src/apps/demos/cube.h b/firmware/keira/src/apps/demos/cube.h new file mode 100644 index 00000000..1411cfd0 --- /dev/null +++ b/firmware/keira/src/apps/demos/cube.h @@ -0,0 +1,11 @@ +#pragma once + +#include "app.h" + +class CubeApp : public App { +public: + CubeApp(); + +private: + void run() override; +}; diff --git a/firmware/keira/src/apps/icons/ram.h b/firmware/keira/src/apps/icons/ram.h index 6e699097..0080666d 100644 --- a/firmware/keira/src/apps/icons/ram.h +++ b/firmware/keira/src/apps/icons/ram.h @@ -200,31 +200,22 @@ const uint16_t ram[] = { 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, @@ -232,36 +223,24 @@ const uint16_t ram[] = { 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, 0x0000, 0xffff, 0x0000, @@ -269,35 +248,24 @@ const uint16_t ram[] = { 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, + 0x0000, 0xffff, 0x0000, 0x0000, @@ -305,22 +273,22 @@ const uint16_t ram[] = { 0x0000, 0x0000, 0x0000, - 0xffff, 0x0000, - 0xffff, 0x0000, - 0xffff, 0x0000, - 0xffff, 0x0000, 0x0000, - 0xffff, 0x0000, 0x0000, - 0xffff, 0x0000, 0x0000, - 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, 0x0000, 0xffff, 0x0000, @@ -330,66 +298,34 @@ const uint16_t ram[] = { 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, 0xffff, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0000, - 0xffff, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0000, 0x0000, - 0xffff, 0x0000, 0x0000, - 0xffff, 0x0000, 0x0000, 0x0000, @@ -410,10 +346,8 @@ const uint16_t ram[] = { 0x0000, 0x0000, 0x0000, - 0xffff, 0x0000, 0x0000, - 0xffff, 0x0000, 0x0000, 0x0000, @@ -435,19 +369,21 @@ const uint16_t ram[] = { 0x0000, 0x0000, 0xffff, - 0x0000, - 0x0000, + 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -456,6 +392,7 @@ const uint16_t ram[] = { 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, 0xffff, @@ -463,9 +400,14 @@ const uint16_t ram[] = { 0x0000, 0xffff, 0x0000, + 0xffff, 0x0000, 0x0000, + 0xffff, + 0xffff, 0x0000, + 0xffff, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -474,16 +416,20 @@ const uint16_t ram[] = { 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, + 0xffff, 0x0000, - 0x0000, + 0xffff, 0x0000, 0x0000, 0xffff, 0x0000, + 0xffff, 0x0000, 0xffff, 0x0000, @@ -494,33 +440,46 @@ const uint16_t ram[] = { 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, + 0xffff, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, + 0xffff, 0x0000, + 0xffff, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, - 0xffff, 0x0000, 0x0000, - 0xffff, 0x0000, 0x0000, 0x0000, + 0xffff, + 0xffff, + 0xffff, 0x0000, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, + 0xffff, 0x0000, + 0xffff, 0x0000, + 0xffff, 0x0000, 0x0000, 0x0000, @@ -529,6 +488,7 @@ const uint16_t ram[] = { 0x0000, 0x0000, 0x0000, + 0xffff, 0x0000, 0xffff, 0x0000, @@ -538,23 +498,63 @@ const uint16_t ram[] = { 0xffff, 0xffff, 0xffff, + 0x0000, 0xffff, + 0x0000, 0xffff, + 0x0000, 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, 0xffff, + 0x0000, + 0x0000, 0xffff, + 0x0000, 0xffff, + 0x0000, + 0x0000, + 0x0000, 0xffff, + 0x0000, 0xffff, + 0x0000, + 0x0000, + 0x0000, 0xffff, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, 0xffff, + 0x0000, + 0x0000, 0xffff, + 0x0000, 0xffff, + 0x0000, + 0x0000, + 0x0000, 0xffff, + 0x0000, 0xffff, + 0x0000, + 0x0000, + 0x0000, 0xffff, - 0xffff, - 0xffff, + 0x0000, + 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, diff --git a/firmware/keira/src/apps/icons/ram.png b/firmware/keira/src/apps/icons/ram.png index e7f26dee..dd21a90d 100644 Binary files a/firmware/keira/src/apps/icons/ram.png and b/firmware/keira/src/apps/icons/ram.png differ diff --git a/firmware/keira/src/apps/launcher.cpp b/firmware/keira/src/apps/launcher.cpp index dff32d60..8e8a4ab1 100644 --- a/firmware/keira/src/apps/launcher.cpp +++ b/firmware/keira/src/apps/launcher.cpp @@ -11,6 +11,7 @@ #include "demos/disk.h" #include "demos/ball.h" #include "demos/transform.h" +#include "demos/cube.h" #include "demos/epilepsy.h" #include "demos/letris.h" #include "demos/keyboard.h" @@ -74,6 +75,7 @@ void LauncherApp::appsMenu() { APP_ITEM("Диск", DiskApp), APP_ITEM("Перетворення", TransformApp), APP_ITEM("М'ячик", BallApp), + APP_ITEM("Куб", CubeApp), APP_ITEM("Епілепсія", EpilepsyApp), APP_ITEM("Летріс", LetrisApp), APP_ITEM("Клавіатура", KeyboardApp), diff --git a/firmware/keira/src/apps/statusbar.cpp b/firmware/keira/src/apps/statusbar.cpp index 084ac016..f380a01d 100644 --- a/firmware/keira/src/apps/statusbar.cpp +++ b/firmware/keira/src/apps/statusbar.cpp @@ -53,11 +53,11 @@ int16_t StatusBarApp::drawIcons(lilka::Canvas* iconCanvas) { // Draw RAM usage uint32_t freeRAM = ESP.getFreeHeap(); uint32_t totalRAM = ESP.getHeapSize(); - int16_t padding = 1; + int16_t padding = 2; int16_t barWidth = 24 - padding * 2; - int16_t barHeight = barWidth; + int16_t barHeight = 10; int16_t barWidthUsed = barWidth * (totalRAM - freeRAM) / totalRAM; - iconCanvas->fillRect(xOffset + padding, padding, barWidthUsed, barHeight, lilka::display.color565(255, 0, 0)); + iconCanvas->fillRect(xOffset + padding, padding, barWidthUsed, barHeight, lilka::display.color565(255, 128, 128)); iconCanvas->draw16bitRGBBitmapWithTranColor(xOffset, 0, ram, lilka::display.color565(0, 0, 0), 24, 24); xOffset += 4 + 24;