From 8427b92b89ed64680b6536f9e1910e006080ef01 Mon Sep 17 00:00:00 2001 From: Andrew Dunai Date: Wed, 27 Mar 2024 17:38:22 +0200 Subject: [PATCH] keira: cube demo, RAM icon fix (#70) --- firmware/keira/src/apps/demos/cube.cpp | 119 ++++++++++++++++++ firmware/keira/src/apps/demos/cube.h | 11 ++ firmware/keira/src/apps/icons/ram.h | 166 ++++++++++++------------- firmware/keira/src/apps/icons/ram.png | Bin 4553 -> 4777 bytes firmware/keira/src/apps/launcher.cpp | 2 + firmware/keira/src/apps/statusbar.cpp | 6 +- 6 files changed, 218 insertions(+), 86 deletions(-) create mode 100644 firmware/keira/src/apps/demos/cube.cpp create mode 100644 firmware/keira/src/apps/demos/cube.h 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 e7f26dee84d1e27d7c01c521663660375428769d..dd21a90d066955b3ea1dd6568f3dc8769ee32cbb 100644 GIT binary patch delta 781 zcmX@9yi#?-Z8alv1w#`nQ$s65O9n;;#s$nkk^zi?6hmghm3SbpWilh9Z2eJwExs~= z(h~u5bvn8%u4#!ZbXp-ARcf&F3->G&6-~XqrtE_U`;V?_?%uqPZ(WnZ55`At9xQpG zr20=^b4$m^2Rr27zq5UJkI`xG8I#q@Y#F<9mkAXbPL37b9Vd9iz-fj<{~4WRze$rm z$i{!?`0!Ql)aF0u|62aKGUsSRgNICVeOsn*zQFmMTWrs39~o$$()wumafhe4O5KxP zk3LF2Z#vC%o@e&UD>j8QB6PNFymV|$M%IzbM+8GJYsR0bSW|TG(VD5N*HrrdI~3p- zANkDctf0z<4pk3 z^}WfgSKe??-PtTPoa>Uvr^*L^d-iE^^W0(Dn;n;bwswvkL*^^3N@f`urexMrao;P; z%d7MM&&&Mwoq4KH(U$r}4Mq$M{C1fk5hW46K32*3n`bdKFsYbY8W>m_Bq!>co2QxU znwXlW=_Vx^8t9s(q#7idSs0pGB&AHYV_nW`Xli0?VQy(`X<%V)KKT=C0k@HP2rQ~6 z=dvjy^Ec0C`@%SR4SS4=X-ZmBlBuPcZi=NL(EOw%bKOK!V`E(t3lobpOGDEn6ARPH zIvidox*Iw2IK;N>ZvP8RGHglS?k)`fL8-@Bz2@^|RzZb&X&z(Y{w*%uK(Pi-7sn8f z<8MP9`5F{>vU&giFS4DXsdZS@z+dN~fl!#&b|(g>BoT%QMFt*n4Aai=?EcdBB!YoE zf$_ntCnmd3nC<>=I-x}G{DDO~PdBJ|+~f18dVAH?mbZQW2?yKV{ESyvqja2dZ!NNY xEUaaFE1rpO>q}w9BQ5zGUm5z&Z~o$WkJ0j)liFgXsy84Pdb;|#taD0e0sxRbH8lVL delta 728 zcmZ3fdQy49Z8bw91w&ISBV#K=QwBx`#s$nkk^zi?6vIbe(*Pi^c`_rTZ2eLtUA{1Z z!V>{=-#ilUi)vL0;n?c5non(do#W&-m7_-k3v?}hY>X%^D7<#{V5k6#y~7;YIU=!3 zj{H|`6*H8R`TqFs-s5+z9Wp{@q?Mj!nw2;EWs1|8XJJP#Xg6^vH!=F0JY)1sMU(aZ z$I^a=`1g-&PXE6%UwP3pT{ae%N0DjuGt54+ef+X4x8R<7-=;}xgyswP&n$6#KhX_KepuHyclxVAHvuTGt%cdaipeYU#14?@#o3o`0R1 zy6&=!n^1Q|6N?~Mmd0Wx>B6YeAe|+d_75M+7yT95DN;1`;E9b5S|%sf$^YT6E6)~H zJ66AUNdeP~y23gAf(l!>Ookvy`Ny6blmrGt0^Ltjl=~j7%)eEzOKA42{h#Cx2!w;5IZ0fkpM? zJT_%y{^mJsUl=zRb0%YP!eEZ`02d6e)3B}g?b)daRKefk8MD) z7Ec$)5Rc<;r`+Z`pupoS{PBOiW%UHU?Ul(<5@(wDxxPub{(%9DAn^$bTMm3gfillRect(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;