From 665b017cf01fdd97562b9033c522b9cb435ba532 Mon Sep 17 00:00:00 2001 From: Daniel Bernard Date: Sun, 7 Oct 2018 09:57:00 -0500 Subject: [PATCH] Add support to display current charge, and indicate whether or not device is charging. Added menuExit function to handle deinit for psm Not certain how you want that handled for PC, so psm isolated to switch Updated Makefile.pc to incorporate new icon binaries --- Makefile.pc | 11 ++++++ common/common.h | 1 + common/menu.c | 62 ++++++++++++++++++++++++++++++ data/charging_icon_black.bin | Bin 0 -> 158720 bytes data/charging_icon_white.bin | Bin 0 -> 158720 bytes nx_main/main.c | 1 + resources/charging_icon_black.png | Bin 0 -> 3350 bytes resources/charging_icon_white.png | Bin 0 -> 4019 bytes 8 files changed, 75 insertions(+) create mode 100644 data/charging_icon_black.bin create mode 100644 data/charging_icon_white.bin create mode 100644 resources/charging_icon_black.png create mode 100644 resources/charging_icon_white.png diff --git a/Makefile.pc b/Makefile.pc index 1d5dc2f..1e28197 100644 --- a/Makefile.pc +++ b/Makefile.pc @@ -26,6 +26,7 @@ test : pc_main/main.cpp pc_main/pc_launch.c \ build_pc/invalid_icon.bin.o build_pc/folder_icon.bin.o \ build_pc/hbmenu_logo_light.bin.o build_pc/hbmenu_logo_dark.bin.o \ build_pc/theme_icon_dark.bin.o build_pc/theme_icon_light.bin.o \ + build_pc/charging_icon_black.bin.o build_pc/charging_icon_white.bin.o \ #build_pc/tahoma24.o build_pc/tahoma12.o build_pc/interuimedium20.o build_pc/interuimedium30.o build_pc/interuiregular14.o build_pc/interuiregular18.o gcc -Wall -O2 -g -DVERSION=\"v$(APP_VERSION)\" $(EXTRA_CFLAGS) `pkg-config freetype2 --cflags` $^ -lsfml-graphics -lsfml-window -lsfml-system -lstdc++ `pkg-config freetype2 --libs` -lm -lz -lconfig -lturbojpeg $(EXTRA_LDFLAGS) -I. -iquote $(DEVKITPRO)/libnx/include -Ibuild_pc -g -o $@ @@ -89,6 +90,16 @@ build_pc/theme_icon_dark.bin.o : data/theme_icon_dark.bin @echo $(notdir $<) @$(bin2o) +build_pc/charging_icon_black.bin.o : data/charging_icon_black.bin + mkdir -p $(dir $@) + @echo $(notdir $<) + @$(bin2o) + +build_pc/charging_icon_white.bin.o : data/charging_icon_white.bin + mkdir -p $(dir $@) + @echo $(notdir $<) + @$(bin2o) + clean: rm -rf build_pc/ test test.* diff --git a/common/common.h b/common/common.h index fa11c5e..77e277f 100644 --- a/common/common.h +++ b/common/common.h @@ -63,6 +63,7 @@ void menuStartupPath(void); void menuStartup(void); void themeMenuStartup(void); void menuLoop(void); +void menuExit(void); static inline uint8_t BlendColor(uint32_t src, uint32_t dst, uint8_t alpha) { diff --git a/common/menu.c b/common/menu.c index d9970d6..eff5790 100644 --- a/common/menu.c +++ b/common/menu.c @@ -6,6 +6,8 @@ #include "folder_icon_bin.h" #include "theme_icon_dark_bin.h" #include "theme_icon_light_bin.h" +#include "charging_icon_black_bin.h" +#include "charging_icon_white_bin.h" char rootPathBase[PATH_MAX]; char rootPath[PATH_MAX+8]; @@ -320,17 +322,49 @@ void menuStartupPath(void) { } } +uint8_t *charging_icon_small; +#ifdef __SWITCH__ +static bool psmInitialized = false; +#endif + void menuStartup(void) { menuScan(rootPath); folder_icon_small = downscaleImg(folder_icon_bin, 256, 256, 140, 140, IMAGE_MODE_RGB24); invalid_icon_small = downscaleImg(invalid_icon_bin, 256, 256, 140, 140, IMAGE_MODE_RGB24); if(themeGlobalPreset == THEME_PRESET_DARK) + { theme_icon_small = downscaleImg(theme_icon_dark_bin, 256, 256, 140, 140, IMAGE_MODE_RGB24); + charging_icon_small = downscaleImg(charging_icon_white_bin, 155, 256, 14, 23, IMAGE_MODE_RGBA32); + } else + { theme_icon_small = downscaleImg(theme_icon_light_bin, 256, 256, 140, 140, IMAGE_MODE_RGB24); + charging_icon_small = downscaleImg(charging_icon_black_bin, 155, 256, 14, 23, IMAGE_MODE_RGBA32); + } computeFrontGradient(themeCurrent.frontWaveColor, 280); //menuCreateMsgBox(780, 300, "This is a test"); + + #ifdef __SWITCH__ + if (!psmInitialized) + { + Result rc = psmInitialize(); + if (R_SUCCEEDED(rc)) + { + psmInitialized = true; + } + } + #endif + +} + +void menuExit(void) { + #ifdef __SWITCH__ + if (psmInitialized) + { + psmExit(); + } + #endif } void themeMenuStartup(void) { @@ -406,6 +440,33 @@ void drawTime() { } +void drawCharge() { + + char chargeString[5]; + + uint32_t batteryCharge; + ChargerType chargeType = 0; + + #ifdef __SWITCH__ + psmGetBatteryChargePercentage(&batteryCharge); + #else + batteryCharge = 100; + #endif + + sprintf(chargeString, "%d%%", (int)batteryCharge); + + int tmpX = GetTextXCoordinate(interuimedium20, 1180, chargeString, 'r'); + + DrawText(interuimedium20, tmpX, 0 + 47 + 10 + 32, themeCurrent.textColor, chargeString); + + #ifdef __SWITCH__ + psmGetChargerType(&chargeType); + #endif + + if (chargeType > (ChargerType)ChargerType_None) + drawImage(tmpX - 20, 0 + 47 + 10 + 9, 14, 23, charging_icon_small, IMAGE_MODE_RGBA32); +} + void drawBackBtn(menu_s* menu, bool emptyDir) { int x_image = 1280 - 252 - 30 - 32; int x_text = 1280 - 216 - 30 - 32; @@ -462,6 +523,7 @@ void menuLoop(void) { #endif drawTime(); + drawCharge(); if (menu->nEntries==0 || hbmenu_state == HBMENU_NETLOADER_ACTIVE) { diff --git a/data/charging_icon_black.bin b/data/charging_icon_black.bin new file mode 100644 index 0000000000000000000000000000000000000000..ea98019ec9bb72489b52b4dea3cd0febf3b0e76e GIT binary patch literal 158720 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 N&KQ5sq85O_e*q+VlwSY< literal 0 HcmV?d00001 diff --git a/data/charging_icon_white.bin b/data/charging_icon_white.bin new file mode 100644 index 0000000000000000000000000000000000000000..2275e8ad4e52460060a6fb1c803ae5d439f8dcc4 GIT binary patch literal 158720 zcmeI53(#hB9mnl1t+k7UT#CI(Eg6?CZcDkfxs+*1nnYz{gbgvHYTwtKnzN|Z5X1z>6fah}1I+fInNZ}sM00r)yH$Jo%}9`37A##j{qs%gYa zLvZE3PL8#2_2pIpxOy+~M2@ea!~e1)U*L8mQD%dq<%v6nz$*B9MU;)JDW?j+)kxx! z0=}}RPIOw7l0~TiKpmfjs>l9kqikMHIa2_xrW3F9;46E2U1vopQFICb(uTw{S)h9C zKh61((Fvf2oG1W0D--whU@L$6DknuLNpuPT($d70d7%0npA?-4YRHKKFm*~Fu8JPo z%SmBM5|sjgw099q!Sl~LtwDgX=PiR}ATaoE~+bDOp5 zUg0VLQAO`p)f#BrXl}UbsPZ-yfQ9*Of>m&@1KO-t_X<-1xHzJKjkZs18m2m`x-A6& zYCEC}FOX%`?mwojnsuM>6kz@nh)1$ebhN)9JatrYTMEFGd4ZccVk>{!Guop(q%^k}7Sg0CboaIKMI_?JPK?Y5iIs zjshSvyB%z5-DRtAlv1Tl6o8JMiI;0p(tMHSUA{^ES{sG}%z0g+*XLL?Cu#UQ+!cmW zswMVmY}AYvd#eC&4fmOLuKANM@RpYPg#l5S z&$M&RntVb1k$Srlh>md$Qi*(1y%kJ_)lz_&?@GKk4SJ zeyMyx#hLneIaGX#@XZTkVKrYc&PVN3Q+WlL;S|D0FOX$TzM%X_y}XiP`s@X=texeh zfGVn#0u0i;z%R1{^>}|qsit(1mkPkucRgk+U)q*lim0N7Re(WGCw%q-S=QtWhMlON z7cj&PiD$CI^n71`ckCxheXD}0cM$h@&Q`uW`GUSv_3uFjIEuI|Kga-%BkDU@zaC_OpDP+-0O$06M1G;vw;Fibh*_cyabAhv!FaNfpUUhD83NWD6h=1n? z6~XbDgHu(R^9sPzGQ{s9;HszveXd!4-~&8nKy!+Q6v;XHf&sFXO$|?bN5WK58|Dj^ z%l51N!6?8SHX&m30$Jwd3kHMM5?L8YtX?3?nm+G%iK)9kU>N2FuF4K2()|P7tE-Gz z1>oujk+PLlP`D^0cU#*;)g}Ui2U59&IDGXR~3M#{Uc|psJ%s; z93uqWDS+Nv5HA)DBl2@k)1N(;#}bFRqo#T$bWY6+#QM+YDH>b9IstB0P@8#yYho2Y zp}y=r6nAq&O}#ACcUnU8h`H6H>k;5)6~Z47v-k=1b}_wIAr1L2YXg_s1rBg8i5mSkDbL)w59BXyW<==Mr1XA$Wngv5B5&KSx!6rg67|nH-ep zTw-hcA{vqxh;6F=^%H^@c)&l|R8d6*eD?y&(vQ4A#i4q5xqW8QF7AHfs-B7ZPWMnZ zl~i4U+101-ZUybksNRxRc&LDRff4S=sg{Y_wj@&g9U%`0uv)QVoq1c%0SiRQqn`?rLf?FYu>E z9cr-;3YZtz$sIY>Gg04}J_w~68Y}Si>eF|(g6f!pcR;3 zpMvgJqU;WYyg<;1y;}UO{MYB#1z5WK+o z;mfQJP~gyd&o*vWQQwi8QWOgO$PF>|vY_zC2zi0FTs;c9Uqx;2A)W|d=HxpF z!3*4;{FK5Mz`iF<>;9RkUIuEj*9CqOzRcs(yVaf+M$ z{rC8K&o)|BM*;Nybb_GS->_{{M=!0ZuK=3c^Ji+?jQWacWnBe;%)Y0lw4GB|E3K=q z0D#&5w@K-DQoQ#9^{46gN;sR8&=Z>do0{nNMB=Ru?Njju<^?_)?24EwG@28*>O+N|L)){1z&J8eU9;e8gW<13}W{M57OgWaZfRf?wCW&zQ8{7<|AQD zBK|6wMa;h7!1yN^PKU4-t1plj@CZXVi`5t0L~rr}ez6v#FEB6gZjWSEDJZ~9V)F&^ z0-ll$Yq9x)13Z;F`LbXwCSPz?@&ol$062@u7hFd_qdk>6`LdWzEWSWqz;l{mEe2m; zUSMm_rB1#)W)y=j*gyF}1|R^eh3*UH1t4?sCBj+gzCd0e5Q<@KA`$BL0EMp^h}6lK z$*e;41?B~|N`8O=3BbHU^#%I{B(q9I0ay#s7o4i$g{1(Th3E_ZK;3#>AS~4EIW4r; z3;sjR?+Q$2m5Tz*EhJxHUSO&Q7p4NtE+k*@*XMZP;ygoW64p@^H z7!p`t-%tR~F7AM}W8O%h9Vzg-0&sR;%dGv1`^gK4uq70LiPc)>>@VE!?Mo!lffPUi zxY(&h*31j6FJYxXkpi$WyCv4l3+!H$L+7M`DF7cAw#3@ErKl9>rvRMUd$Tm%e!&e! z_RFKk(pCUIR%r?u>;Fuwn6{GYemDhSWLiVko?^Ycz;HtAar;?qRs+_|3+yHtr9c@4 zVC82GSo>y~9J)pdm;!KSzk^X{v)8ob1%y#41z=?*!oCky-R@?Ayg(_Hb&)9mFWXmz zjO)z{tS1GfKotdGW@bg!Ugr8;s^rkMQos~|oAWEOHe1R`fjSDn+21O#b`jT(sFO!) z(pCU&RwT;$g1fkOg|rn@_jMJ3oo$FR+ml>0rEVUrlLGK_cnQ$V3+yblq(Bn|U}$~` z)@C)yp|w)L6o51P-Hd*l{Z5;_fN*J~01S;I?E7P{?M@z$7igri7MlWav~@4YIR7}Y zj+BxDZ72XshxTC2p6hmMBZuxG1xx{WI;RI~Go_FeXj1_=v!BQE+XbAE7id%H#P0=9 z<_liRfwq9-v58Bg_FGl}rl#gNGcPc?2{;tm`<}HK+ZdG4V4CPof7wQ&G@8-OSPIvYT_%JWjJ2+1nz3ZxC9+;S8Ac=# zW-O`fvQ1o#_9ApG6}kPU{^xnlbIy03^S0kJL3b{wNt1CR*E7Q?hadquY#((|_>~Emi^z)2_l*PzU#a*I!{sI)bwv-y zTx`Y>*0i{Po1(t z2I>I}LcgtTwO}T64nF56&rFJ(ypp_dDr+_MBz(o!y6(xHQ{4aS(0Sp^bx3h1cMn7I zCid#Xo5;;a{$^&Le9c;B%Hw~$gyCl~qVIz{+$Nk(KP|hIb*yH*Q@D&|zoz4xCoVHR zj#bWGvGXzUa#`}+lqu)w)s#zNFf6)qfVA+>vW{Q3MfO>>Z2sgcY3f2#4r z7rVtZlHBO(+0U91gM4<1?`6r|{LK6*2)x*NHsE`4Maf8B5;u)2tK_D`XPA4nyv0%7 z#+nKm_;HFGUmk?D-QD>BouDJ2J6{4@uLW7&*$RXqUWhpEmoQ9Uc0~3iF`hHD9&wK)>y%EtkzrX zyc+UC#`-1G1aKzbXfmSv^J3PbyX#t=PMseiT{k6M>9oo_Y4fx4dLT(}w9x&$yp#D!X@Q_+5tK!hsmP_@aSWi^vTZ!h(J&vCJMawu;D153VZP->|N0nJNx{2--f)ABw zbEml$Gx6f*!o6hrozhr4P5IYjbrg55Zqp=|3r2yWE2huLpxiSc%*-lL&|?ES~cRM>M5jX*4CC%Di z6egb;g7&eWSpqy;;|EJZK6}1wxRHr&!{((xn-SIldVgqsd9# zOGTcGoAiD5t%L*Lu6{%qZ^ZNh-@I(`7dc)ov@G)UR3yoxUWX)qq~pLu15udBy3ERh zcDXyR{d!4(MR8ps?j}pzd|`^Nq#@6x;71&#-^{f5$M32RLY9p%R<=EPIeaG;)lXKT_EH7g}ie1+uWxb&YI+IgV+b=LvArQvOz3q*lghoxoX|^lh?fH zSBZ$6omOc_ASyGMAeYfu=Rg@MBnmvGZ+zH%JNMPxIy$;yhgbdhHm6jju3I+i+pJ#* z>soUuwyvb4G8j(x1zz5#fgEntAWgYLSMR-w7)-8d?KcO=Vk+K_qBW2z(Tu&ZX1ATH zoes_~o~v_~*|u(CrhX3=0MHm*D-m7mu88y!F!)-1?Fg%k!(ifpA=N-k0RPs+zg__S z^nNf;lk*#2_6sln|M=#>0m>V~ez@7Vb;lWqew*5Z0oTKGn16Rgdmbf;LC$x6x6}sr zlBhtO(`qY-XirHQIWVWWCsf1!#ZvH_MK9+%S|9#Rd0R$x+GdtjX6AD{AVCaL2xBNq z<;}A8m^I6fOr9{uMIkt+MR7s8NBx!7ahIgMNzLh5`@70C-zey=Y4)e(qtcR)gjcKY z+De2`$@^0WY5V2#3r8-v)^bQulU0^H#?%sl#z;TGAYD>^gC9;yp41(E%*d|XaU#58 z3ABC*aR-(Du%8`hq1(f&BWuZXUruv0*DpNLtCK+{hweH?^1)ZT#NW>>E>iQdneenQ;;dUY{z9^m^ThyddV541eM$A+YyBYo157SA;H+2X4Tny*2;jhXlpNn_NW-hR8Y z^u&y(V&;?Y#kaVIGf+9YEWIX7%KT0Eiv6AZju&ICNdX_hmw1bS=G-VWwm^}iM>yUE zqOEzqcx7chHj~Tn*ImCVI3>Jx$X-Jk-?^pi6ra=Pa9GdwN#}C!J4l4mjT5rs!paOu4F?u?c^oP12?Nc)`>| zr8&7E)lFK}mLHq29us!BJBvU0dI*bDId8fourGN}xn5aGrz>mm);8g#xzdPaamdBs zHNM%0*&UV#RtssH#a}t4_$?(&$~`n#5@!EbsgzXQLLUo6q|h?DE=Nq`sMSA@nHCmB zwn;i396!QVgA57t-F(z*NEcPKZ^7R+?n64Nk7pS>90xZ`UlKH7k)Eaj_K5!^Xo{Xk zahTZ>^%@3S`Dk#Y=3gj*FimCoVo!MY$;Wf=H-f5!hGU4;vlw(Kkqh!e8;! z6TvHd>$O=sU}+`G9!@#uwJ~tVAI+5c&a91-X4ZJQlg1T)!kJ<;nsFT_F#* zXvenw?lLWbnvMsvPve}UEucyq4Wn;=+^4TsaQY6|Rmvh(DXcOFYf;!(1z}wG)E2F7 z(@zwF$Fziv9plCded1Ii5e#HhZg0{4UY=rVlt~j7vP@r>q;8DI9xrx@XzP-Ax$7_R zS(unB-}f+o1cxe0Hkh|L5jW4_8}=xB&@t+lj&@J{7Y8D~&QCK(=PNOMMlcB_>f!p= zVfhKW_2la$FXvLCV57YSPX>Pne`yQo`sS@zqCkx6!Fp-z$z2oajAj@t{z>|D{7BJ6z&RG7;mXma)a~P1 z>c0k~inJ)sz!j+=l)L&dSRB%{^#EK+a{UFyLw4!L#ZK%eIO*ggrd!3H6cnTlaeg)H za|3oV~|GF6TR=!EsMK&%hRhdxGM-0dKCVLVEz^eWUbBe$GX zp4n2Ft7+RRqLA|Qh?)lkP9eFu+`xK1yrb(q6`+rBkS>$8(w}|)PklJcyr3LXQXNvE z-jDy!HnEYPJKD#yrpgrJ$Ra2sZ%QP1Zn~CY6`Kn(`eUi=06cG>@EJXNKefBQ*xRlc zn_MHu_tC2$pwDPQ9s1TO&M_d?dVhlaqE8dhfPd>~RF)Y*P6H(l_(RZrL#9{EUT3pD zyzz=v`Gq{r-xIQBLZA-RVPuEmEPkQwxLNK~B25k+eu8ZRIULU%XN>Ux^fT+JR_f*S zMt7mNZT`o~LzRR(L82ZhQ@*|*3X;kPGwp*0gHw8&5%3nKN6>?{q~7mmlQz-{CvX>H Qg?|`;DcOS5Xheo1};X(b2GQUGx9&do;9360U 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 Bfs+6L literal 0 HcmV?d00001