From 8657f71d489df8ad692c92d16afb25e37a11d530 Mon Sep 17 00:00:00 2001 From: Eve C Date: Thu, 30 May 2024 08:39:51 +0200 Subject: [PATCH] The watchface infineat is modified with alarm status and time set shown in the bottom right corner. This feature can be enabled / disabled using the settings menu that is updated accordingly. The alarm time is shown in the same time format as the hour. Doc with screenshots is in doc/alarmStatusOnInfineat/alarmStatusOnInfineat.md --- .gitignore | 1 + .../alarmStatusOnInfineat.md | 22 +++ .../infineat_alarm_notset.png | Bin 0 -> 6312 bytes .../infineat_alarm_set_12hrs.png | Bin 0 -> 6649 bytes .../infineat_alarm_set_24hrs.png | Bin 0 -> 6286 bytes .../infineat_settings.png | Bin 0 -> 7646 bytes package-lock.json | 183 ++++++++++++++++++ package.json | 5 + src/CMakeLists.txt | 1 + src/components/settings/Settings.h | 14 +- src/displayapp/fonts/fonts.json | 2 +- src/displayapp/screens/AlarmIcon.cpp | 11 ++ src/displayapp/screens/AlarmIcon.h | 14 ++ src/displayapp/screens/Symbols.h | 1 + src/displayapp/screens/WatchFaceInfineat.cpp | 95 ++++++++- src/displayapp/screens/WatchFaceInfineat.h | 11 ++ 16 files changed, 357 insertions(+), 3 deletions(-) create mode 100644 doc/alarmStatusOnInfineat/alarmStatusOnInfineat.md create mode 100644 doc/alarmStatusOnInfineat/infineat_alarm_notset.png create mode 100644 doc/alarmStatusOnInfineat/infineat_alarm_set_12hrs.png create mode 100644 doc/alarmStatusOnInfineat/infineat_alarm_set_24hrs.png create mode 100644 doc/alarmStatusOnInfineat/infineat_settings.png create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/displayapp/screens/AlarmIcon.cpp create mode 100644 src/displayapp/screens/AlarmIcon.h diff --git a/.gitignore b/.gitignore index 81e49ae0..32ae7f6f 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ cmake_install.cmake Makefile build tools +node_modules # Resulting binary files *.a diff --git a/doc/alarmStatusOnInfineat/alarmStatusOnInfineat.md b/doc/alarmStatusOnInfineat/alarmStatusOnInfineat.md new file mode 100644 index 00000000..22885a84 --- /dev/null +++ b/doc/alarmStatusOnInfineat/alarmStatusOnInfineat.md @@ -0,0 +1,22 @@ +# [InfiniTime : show alarm status on infineat watchface](https://github.com/Eve1374/InfiniTime/tree/alarm-status-on-infineat) +- I forked from [InfiniTime](https://github.com/InfiniTimeOrg/InfiniTime) and added a branch alarm-status-on-infineat +- I modified the watchface settings to have the possibility to show alarm status on watchface + +Here are pictures with alarm set in 12 and 24hrs format : + +![alarm set and shown, 12hrs format](infineat_alarm_set_12hrs.png "alarm set and shown, 12hrs format") +![alarm set and shown, 24hrs format](infineat_alarm_set_24hrs.png "alarm set and shown, 24hrs format") + +Alarm not set : + +![alarm shown and not set](infineat_alarm_notset.png "alarm shown and not set") + +Settings view : + +![settings](infineat_settings.png "settings modified with a button to turn on or off alarm display") + + +## Possible further development : +- Move this setting to the Alarm app and include alarm display in all watchfaces ? + + diff --git a/doc/alarmStatusOnInfineat/infineat_alarm_notset.png b/doc/alarmStatusOnInfineat/infineat_alarm_notset.png new file mode 100644 index 0000000000000000000000000000000000000000..a8883db00ecbc263f434564fa9b143e69fd31ae3 GIT binary patch literal 6312 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 azudktU3C@JdxQ7~0?=01S1VJ6zWqPFIzyQN literal 0 HcmV?d00001 diff --git a/doc/alarmStatusOnInfineat/infineat_alarm_set_12hrs.png b/doc/alarmStatusOnInfineat/infineat_alarm_set_12hrs.png new file mode 100644 index 0000000000000000000000000000000000000000..259c09833f9e8cdfee2144c64412497e07b1f15c GIT binary patch literal 6649 zcmW+*bzGBO6y6v$IzGA)QIQf6l$3!;Dj_K`1f)BK0Ru*-w4iiIH&TNMl0&*AMoCGG z?)avEyzzVP^PY3=x#ymH?|CCMUcDqIVI~0p0OZO_3R<}5-rtLu5OIjK`_o-5Y+#z+Cp6!zfqg_>z2aLS`e zN|vk4LIM?X!oD{2>^3VZ?Q&9JZAg`v@)Nmm+`)(4`i!*O%DaU_%EYg62>RfchmjG| z8T7E7PsH~XBq9D6pq4MI+<{aZB>Q4hKDh6YIw4<;Fiq#&K1ofDVj#Cw`OZ(C3=t+M z{p#T#E$~>dTa^Q|4ezhyK0uE^7K4+3`H3ACHE%x73DHVu`inW;I0Lb;fK0O}V&&Is zc&tq@48eO-WMGJw-n3YF{C}2$D1y7N^KBW|N6(&yEn`(!4HcApMChP8quC8153_y} zalBU2F9L&k0z~K*t5)5Lt)Z@PUY_`?{x|T>q#^X}^*#c@CZVoy@bEE^LR&`Y%ALA) zp_yRVhC9LS6WDne*X@?WwDty6(-TBE*JGgI{TR@;gy8!&Pmn5h1c5&)B|;6Ygz0YG z%*}W{I_}_C3CIS6^P4QVQ8E2ihnW%8fzOh#V>aBQFcIoSpH;WbQ$k+Tv;rK*2F!s2 z4wuU<2PhVDJxZ0dX=PCL{p%UG4R9}BYX}}!2ho|vc`NBa?A(uz*>mG>wgCYPUKuGV zDfoso>XWlsPas5%%`i`nrnIXA)<}+F1U`fhLE&5gYhc%BbP584<$Q!bS|YCvc--Nn zDnik@5!DRu&75#%Lt<&fP$l`_&y1P0O*8Ex!C(U{vIcWghJ$yF308y#MsXx&DlwF} zsew)U-h1R}zt81|lAHN)7C)!Dn1z+NE(cD^6Jr!crG>7q_aZ}fYiCG;%NM#L?mqCa zx$K)P`Q_#1z)&FRFVMO)${^s-3VE%(@?j~`S=yN$yyWVC7&9;Gp@r8Zp)O)5b|L|2SGc)c9pWtGVA-?(s*$1ZnZk zTnvRo4O7K1-t$i1-CALwn7=Ags4wnofvd-2Fv2vACcWP(;brUVAuu)6HwyRuI)?XN z6{i9`=G}?!!q*;&T%+e7k58;37M_fl-Oxi=K`dLpD22Ifl%!E7^iZdwc@jv?gJT*A z%GJkQ6MSKGniXXv53d0WIe_sGnJ>|4W1fKoP9pcA`K1}{-^?1=gR_{aqk0CaqWmt zKR{}ELx`$G*k3y0lLE*HgJ<-Y!8-!b#`)uI-#;yBD*UL`e_skz16b_FFKIdqUH>Yi zTB8B~Rk-(2>7Rr+i+>7@oGJgIozj1e>!7^-CrsQ3^w%1g3;Dmsu78$y(6s|*`EVkf zy9H37`Gx0l0((9_5aOqVXGZH(yzL@=Tbp36#s8qje?n#o&3+%=*%C24} zrgUyUuyFD{C{AQN?;zeXrXD>?`y1aCo~sY_vfb~OdA(H9HfLTmTy+a6DM|CT30mDH zw((H|8I{5+#10CmH_``PQxT$13V{`RGJ3rZA{Bnu%xGhp(eX5bM$L1hovtBd_~W9% zsu=+;^%w*Ab^p4pQ|lFB>HI&+bS11}(kqveVbBCxZwE=IPXrJNWR?De`4J}YR8LED zsYfaQO&WAFF64RZFAcUc;|sfZP-ZwOv_k6H&Y#!FXlZn|0WTk9J+v_Bo~Sg5nZ<{s z>;6MZ$z{c(F|xio)}IDbB9nrYHr7d|UE#fLX%-8)Vz*T=m zAQKfp07ptcm!zl*$h}dIz9~L@JG|N!`r6vxVj0sdZ68oa&I+n~MLx4&9WTSRbY{vH z#*ePzCtWQU;h%+UnKnRDR-1>WCMQD&+joClUBT+~l$2uGnv+I_nVnekarxB;DRffO z)wY6IS zU--=fHe3V^R)EaWa09U%4_o1HYF{Hs3bX?&{y4KgyFZITrOfHJGZ4Z*aSSciUT2Zt zk|>XrAT~xzQ*Hg*M}}hkv-D<5bg*OCb-FMgs28R1pJ+uQCcl(fi_cOXG?Dqx6%1iy z!2OOn5z6E46o>DPPAC`@uN;1pw98@w*pMBIBQ?z_uvR|N2~c`-qZ6=zU7yHIi>Wgx zil)$#k&F$FsVDyr`=41VOKSIIEP?qL+zek<7UprmhwC1m-BI^Y)IB_V$L6p&(~(A4 zLxVtBMR~`Z7#CXP$dS#EYdVD8wj~mh187nYJ?w3n?)0&km^Yd7i1wFUzy$$#B_hw* zYe=#n-%ECP^Qzx!%F}F`a6p~bP)qH$?d$s4Y5UUmA#X~%&$Wq zvllk7rS6TbyvF@q@}#`MV4fc@r_D!1eb3U@qs7RdWBso@hNHxdrb4Q102y#Cjcf+@ z4P%LcFy1+72E!IY9i6486x(59WV2S&Erj**UAVwpmFY#z+}!vtI=nzmb8XmB)n88t zB7HWYb&V#)#&*w3G3Hm00QZHmaifo&b3R6jr*$tgB&<^%l6F%U8!1H9gH47hJKhTV zuEX<~{Vf@#hr(s8yaNJm7fos6%*&hE%w}kgU3gm4ffY$3fMEu+U-|{wazl@$H@0?y zNf}s9#ae--L?&^iTM{_umEAc-TN%{^cjqNSPvBur#HeoZZn7Q# z*SXIEM4qKP1O_A7Y*SDJ-LD0fmDd~0^fLOybTE^IKV~PVr%m{ree4NScDNO{>|u#d zu!UUZT1mjtA^Tzq>GR+Z_=9(dT*Jtk{evq;JZhjHsNzqR8x}SIeMm-PxeJ9Dg|QKUK@@?{|A~!7=Ga zYA6>xS)5b(jdHSqAkUsPX)xx^`+GV;b_VqJv!Oi7fq3@zOzI4nKi4(H&(nJfmBXHf z8}{V14tiIeL9H1VyDp=uSV>Eae5;Cwb>QbY;FUH8p7KRD(CL>y!IlQXXx{Cx*CrqD zena1Pr{_eAu=WJnq=zXMkcL3Nv9kF(@DF>o=1U9HiUVxEwU378%k$4X=zTh6E>2d} zvi{D@4=7(0W_x3lg8Y8}GKYK{xRwHTLm&A}1VtuF-$RZmzQw#?ux%0lD3^kKSUEt% zTlS^1DDk)FGYzcoC305(qW$i|4)Ok-gGV(S3zCoL3|l7l*6Rf`>Ks_QjX|YdIslA= zHf}AbD-zA76D9+7r|c_u1GBTwPTOKvpjRy`ZL|A45G;X$Q`r3-q93+V9J<;B20wjl zr$L|_%es=1_?ZIvV7&w$xvhiPC^m2D@|Jaojb1h%-;p32ZpL5c_&I~`F0#?0*=~^7 z?fPHiaem4t7EMLvJ>Q5tPmKmD#ZAcbMoCq7Fb@ja#{4uS=osG;Msm<2t9CvVrHSq0 z5{|XcY~~)XOm6~%Vf$7#5SM}8T`Uv@w~9F`Y(2^~+Pur0=|HoSmb&_Rg+99TR9t-T z2;hIM66}%gh1?7zN>y?6lZwcR)E%ZcZU9j5p6b27L$K)=CP=n4Da4$5+}h<=JHcGH zwEy{dZ$>YnlBN-l)*TX%4alQA+c=KP_7rV98gXI8&05<` zNC_Pj^)Q3fIOKWaMXFv(h<@^&KP*prS(4V>?$yWfn1J^2TaX*oWqg-stH3&BVx| z6UYNriki7y^^2*jQBd*#oj9f`a5=0CHG9atynlzP)i}3-gQ~?LmqZs5usx(55IRZi zZ<}M2?(AiB|4UqDGYKwvF8yBk^4~j}fFyB)B=(3Y{{-8B(Mwz1Kwl`QK9e!}J3hfe zqHevq=_h*bRzx`O8@LmL)1mE4<8En?o9ri5SUbW(?khmZLGU}w;=-wScol0D+QM+d z`x_yO+hG&J&n1`8*2j$`*N9zT=09J%76eJ2m}OCo;Eob$BOCgjwSF_<@jM8Mz5X>4 zvZz~+UN@(~52tjzh;cdz6u{Z{3l^GE?_hRtnfPzppg^)$&b?swv8YX!VD_Zlj*IK3 z;CKk@#Ldw~R(9#OQ!BE%A@KF7pJ8~&pHT${*LY6uW1N^viY$?f1H04=nN|co-80k} zwl*u#_wpJy8%zy(!{W2KiKbKR?d_d}?ZQ`{GTy#wM*pTtc=8cMrqC|doboGcSmc?@ z@1^NSl$BgIABm~~*+s*_G1wp25OwsAd$%WvIrJezk1@frW?8bua{MID-qk*fT1^P@ z$Numh3|rnF34cEk$7D17ji_ns$Ql`=1NL_F2;T|phqH*iyYNahq)rrn)m@pl)6Fkr5kwhiBt zmB<_`_7dxR6nk8M^MbB^J<|8}U1}4M867lhwsKtL8Y9|2Tc`Gl^@I1y`qGp92xWLo z7@;ml8Q}s(RQM9ZA7v~qK<{)_*O_>7a|l<42Ri4Cm^;Odh&+2#1zRbi<0cVe8Ng$8 z7xi&*pgw%KU9o7(Dg6+!a-wNL^)rYn^b0+GSa)vI4$l%BH9MBe}f`M6twQe`i^h?vaeH)Dq` z?pxQ@ZY>_ny3c%djV#2pm-Thp^^yt#+mLI?BW~^K!Dgc(&-|A|Ig8oLG$m^fm=8i# z;b=+AIYCVKk-*7Ay)^?GX(sHmo^h6YQL1nt^y=DW+A(}gk-$WtkDeM7|04*&J)fMi z1`IUE?&!8@z?TOG2Rp$#Q$~uspCIC4%Pde%Bc^$Z>BMjfqI34kj*`zkB1tHM1I;)GjDN~fDg$k@M@y6IpdH* zn>0p_{e?Et=l4!^U8byk%;*c*-{Tlbui!v_dOZNZugKSVzZ6JVkI$F4(tq)J30GWr ztwrj*?+>25LkbXfHv?F`5;f7&&5x2$kklm|V;`9@;j(Q}NHxR_v?bDe@3wk9Ec=1s zb&RB(mlNmjaQf&w^%q5_o9qLvB0hWd)ei5r=M5Tt9e0SX*qvp+9@hRBt|7tuq-H=H zNLIQfzU$Hec-zPhCqR z8KvARPP&8Ukz70Crk}5i=1<=1%xBcZ`@k8dbTiK|d%xt4JWt2xOzJGH#z^p@t_#_g z>rS)seG1%+iisNQY*2M&_u6EA{29}=R+v?Q=#Bh^aQ@TORmyCB===(MvJX74GjD{h zgx_rWia3Arjaifx>Bw|OOkl!)&cGXZF z_XQvNyB+vDV!r1t*4$HotG=zrb?B*A2?MAoj?5P9e@d8Q_EkzRL0W3dPqT6h?8<6n zm!TL(%Z&n5c^7#Kkpb=uk>?hb+OBCS?qaB(z?8!#E6H7EUVrzaL9e_s!)vWM`R(Fd zA92W#Qzy$lPO~}M&l%fR%yLbu`L}2_wb0Cdf1?AxvCa}TC$@ECw4?FpgFmBIfqP+# zczpDt2ML(!K2DduxoETDkhVl~VtDiEGuMMcNUAi&p!ONVapGyo_|V^nLLJkBozst7fdc)))cSdS zU>C3s1cW;H(rqaUP;#KDXmzJnX-O)LxXJ%;7IKC=YvHj;k}@n7EW2j!j8o9%t%tc) zo6vJm^!f$Nb!`}xcoK>*(f}52BCr+C`2sTN!aTeBJ_4vX!{NOmGF zynAXu440Z0!>Eo7)o8=+o)N0cFYkyiqs^=$js@=w)7& zfN&RFiN$A~ZOh?hO@Zqq*T#p{0etTd4g`5alt70^SzpN;MQ+KB{$zw2H+-rSApdW8 zyY!gL2rIRB{H^Ts{8tiF9w-ka|~e_CZj3#k=LyJ8D^viAmUG`Tf6@W#(-P z6_l+t3+ghZ;*PbaMwEiDC`AHHASKnA0x89EWszOWd>6jcLK%;bkieuHYv`)pzR}< z3qtQ~g=NwE@v#0mPTj74pNMmuBX16oje8R1kJNvh+*0P~t%KH|&ES6N0F+<6QmBAH GgZ>8t;MQ3H literal 0 HcmV?d00001 diff --git a/doc/alarmStatusOnInfineat/infineat_alarm_set_24hrs.png b/doc/alarmStatusOnInfineat/infineat_alarm_set_24hrs.png new file mode 100644 index 0000000000000000000000000000000000000000..d31de7980157ae4cbe52482f1f9393cca795abde GIT binary patch literal 6286 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 ICFuMA0c@dJw*UYD literal 0 HcmV?d00001 diff --git a/doc/alarmStatusOnInfineat/infineat_settings.png b/doc/alarmStatusOnInfineat/infineat_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..0dffd5e781ae4b945d25c629d4f88d9c7435a770 GIT binary patch literal 7646 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 literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..b8320c49 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,183 @@ +{ + "name": "InfiniTime", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "lv_font_conv": "^1.5.2" + } + }, + "node_modules/lv_font_conv": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/lv_font_conv/-/lv_font_conv-1.5.2.tgz", + "integrity": "sha512-0UapRSTkVP/pnB8Z4r2HDHx5p2dJx/xUG1+14u/WXo59mwuC7BahR+Bnx/66jKoDrG1wFQwn9ZzoyMxRHOD9bg==", + "bundleDependencies": [ + "argparse", + "bit-buffer", + "debug", + "make-error", + "mkdirp", + "opentype.js", + "pngjs" + ], + "dependencies": { + "argparse": "^2.0.0", + "bit-buffer": "^0.2.5", + "debug": "^4.1.1", + "make-error": "^1.3.5", + "mkdirp": "^1.0.4", + "opentype.js": "^1.1.0", + "pngjs": "^6.0.0" + }, + "bin": { + "lv_font_conv": "lv_font_conv.js" + } + }, + "node_modules/lv_font_conv/node_modules/argparse": { + "version": "2.0.1", + "inBundle": true, + "license": "Python-2.0" + }, + "node_modules/lv_font_conv/node_modules/bit-buffer": { + "version": "0.2.5", + "inBundle": true, + "license": "MIT" + }, + "node_modules/lv_font_conv/node_modules/debug": { + "version": "4.3.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/lv_font_conv/node_modules/make-error": { + "version": "1.3.6", + "inBundle": true, + "license": "ISC" + }, + "node_modules/lv_font_conv/node_modules/mkdirp": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lv_font_conv/node_modules/ms": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/lv_font_conv/node_modules/opentype.js": { + "version": "1.3.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string.prototype.codepointat": "^0.2.1", + "tiny-inflate": "^1.0.3" + }, + "bin": { + "ot": "bin/ot" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/lv_font_conv/node_modules/pngjs": { + "version": "6.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/lv_font_conv/node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/lv_font_conv/node_modules/tiny-inflate": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT" + } + }, + "dependencies": { + "lv_font_conv": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/lv_font_conv/-/lv_font_conv-1.5.2.tgz", + "integrity": "sha512-0UapRSTkVP/pnB8Z4r2HDHx5p2dJx/xUG1+14u/WXo59mwuC7BahR+Bnx/66jKoDrG1wFQwn9ZzoyMxRHOD9bg==", + "requires": { + "argparse": "^2.0.0", + "bit-buffer": "^0.2.5", + "debug": "^4.1.1", + "make-error": "^1.3.5", + "mkdirp": "^1.0.4", + "opentype.js": "^1.1.0", + "pngjs": "^6.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "bundled": true + }, + "bit-buffer": { + "version": "0.2.5", + "bundled": true + }, + "debug": { + "version": "4.3.1", + "bundled": true, + "requires": { + "ms": "2.1.2" + } + }, + "make-error": { + "version": "1.3.6", + "bundled": true + }, + "mkdirp": { + "version": "1.0.4", + "bundled": true + }, + "ms": { + "version": "2.1.2", + "bundled": true + }, + "opentype.js": { + "version": "1.3.3", + "bundled": true, + "requires": { + "string.prototype.codepointat": "^0.2.1", + "tiny-inflate": "^1.0.3" + } + }, + "pngjs": { + "version": "6.0.0", + "bundled": true + }, + "string.prototype.codepointat": { + "version": "0.2.1", + "bundled": true + }, + "tiny-inflate": { + "version": "1.0.3", + "bundled": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..d339766c --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "lv_font_conv": "^1.5.2" + } +} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fd8ece62..0229ce17 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -371,6 +371,7 @@ list(APPEND SOURCE_FILES displayapp/screens/StopWatch.cpp displayapp/screens/BatteryIcon.cpp displayapp/screens/BleIcon.cpp + displayapp/screens/AlarmIcon.cpp displayapp/screens/NotificationIcon.cpp displayapp/screens/SystemInfo.cpp displayapp/screens/Label.cpp diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 06312077..73225ac1 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -47,7 +47,8 @@ namespace Pinetime { struct WatchFaceInfineat { bool showSideCover = true; - int colorIndex = 0; + bool showAlarmStatus = true; + int colorIndex = 0; }; Settings(Pinetime::Controllers::FS& fs); @@ -123,6 +124,17 @@ namespace Pinetime { return settings.watchFaceInfineat.showSideCover; }; + void SetInfineatShowAlarmStatus(bool show) { + if (show != settings.watchFaceInfineat.showAlarmStatus) { + settings.watchFaceInfineat.showAlarmStatus = show; + settingsChanged = true; + } + }; + + bool GetInfineatShowAlarmStatus() const { + return settings.watchFaceInfineat.showAlarmStatus; + }; + void SetInfineatColorIndex(int index) { if (index != settings.watchFaceInfineat.colorIndex) { settings.watchFaceInfineat.colorIndex = index; diff --git a/src/displayapp/fonts/fonts.json b/src/displayapp/fonts/fonts.json index 41c383c0..793b8851 100644 --- a/src/displayapp/fonts/fonts.json +++ b/src/displayapp/fonts/fonts.json @@ -7,7 +7,7 @@ }, { "file": "FontAwesome5-Solid+Brands+Regular.woff", - "range": "0xf294, 0xf242, 0xf54b, 0xf21e, 0xf1e6, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf06e, 0xf015, 0xf00c, 0xf0f3, 0xf522, 0xf743" + "range": "0xf294, 0xf242, 0xf54b, 0xf21e, 0xf1e6, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf06e, 0xf015, 0xf00c, 0xf0f3, 0xf522, 0xf743, 0xf0f3, 0xf1f6" } ], "bpp": 1, diff --git a/src/displayapp/screens/AlarmIcon.cpp b/src/displayapp/screens/AlarmIcon.cpp new file mode 100644 index 00000000..fda87130 --- /dev/null +++ b/src/displayapp/screens/AlarmIcon.cpp @@ -0,0 +1,11 @@ +#include "displayapp/screens/AlarmIcon.h" +#include "displayapp/screens/Symbols.h" +using namespace Pinetime::Applications::Screens; + +const char* AlarmIcon::GetIcon(bool isSet) { + if (isSet) { + return Symbols::bell; + } + + return Symbols::notbell; +} diff --git a/src/displayapp/screens/AlarmIcon.h b/src/displayapp/screens/AlarmIcon.h new file mode 100644 index 00000000..678a4cb7 --- /dev/null +++ b/src/displayapp/screens/AlarmIcon.h @@ -0,0 +1,14 @@ +#pragma once + +#include "components/alarm/AlarmController.h" + +namespace Pinetime { + namespace Applications { + namespace Screens { + class AlarmIcon { + public: + static const char* GetIcon(bool isSet); + }; + } + } +} diff --git a/src/displayapp/screens/Symbols.h b/src/displayapp/screens/Symbols.h index bd958b28..cf1b8aad 100644 --- a/src/displayapp/screens/Symbols.h +++ b/src/displayapp/screens/Symbols.h @@ -12,6 +12,7 @@ namespace Pinetime { static constexpr const char* shoe = "\xEF\x95\x8B"; static constexpr const char* clock = "\xEF\x80\x97"; static constexpr const char* bell = "\xEF\x83\xB3"; + static constexpr const char* notbell = "\xEF\x87\xB6"; static constexpr const char* info = "\xEF\x84\xA9"; static constexpr const char* list = "\xEF\x80\xBA"; static constexpr const char* sun = "\xEF\x86\x85"; diff --git a/src/displayapp/screens/WatchFaceInfineat.cpp b/src/displayapp/screens/WatchFaceInfineat.cpp index 4c6fc196..20d0beb3 100644 --- a/src/displayapp/screens/WatchFaceInfineat.cpp +++ b/src/displayapp/screens/WatchFaceInfineat.cpp @@ -4,9 +4,11 @@ #include #include "displayapp/screens/Symbols.h" #include "displayapp/screens/BleIcon.h" +#include "displayapp/screens/AlarmIcon.h" #include "components/settings/Settings.h" #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" +#include "components/alarm/AlarmController.h" #include "components/ble/NotificationManager.h" #include "components/motion/MotionController.h" @@ -122,6 +124,7 @@ namespace { WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, const Controllers::Battery& batteryController, const Controllers::Ble& bleController, + Controllers::AlarmController& alarmController, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController, Controllers::MotionController& motionController, @@ -130,6 +133,7 @@ WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, dateTimeController {dateTimeController}, batteryController {batteryController}, bleController {bleController}, + alarmController {alarmController}, notificationManager {notificationManager}, settingsController {settingsController}, motionController {motionController} { @@ -144,6 +148,7 @@ WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, font_bebas = lv_font_load("F:/fonts/bebas.bin"); } + // Side Cover static constexpr lv_point_t linePoints[nLines][2] = {{{30, 25}, {68, -8}}, {{26, 167}, {43, 216}}, @@ -230,6 +235,31 @@ WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, lv_label_set_text_static(bleIcon, Symbols::bluetooth); lv_obj_align(bleIcon, dateContainer, LV_ALIGN_OUT_BOTTOM_MID, 0, 0); + labelAlarm = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(labelAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, grayColor); + lv_obj_set_style_local_text_font(labelAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); + lv_obj_align(labelAlarm, dateContainer, LV_ALIGN_OUT_BOTTOM_MID, -10, 0); + lv_obj_align(labelAlarm, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -3, 0); + lv_label_set_text_static(labelAlarm, "00:00"); + + labelTimeAmPmAlarm = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_font(labelTimeAmPmAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); + lv_label_set_text_static(labelTimeAmPmAlarm, ""); + lv_obj_set_style_local_text_color(labelTimeAmPmAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, grayColor); + lv_obj_align(labelTimeAmPmAlarm, labelAlarm, LV_ALIGN_OUT_TOP_RIGHT, 0, 0); + + alarmIcon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(alarmIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, grayColor); + lv_label_set_text_static(alarmIcon, Symbols::notbell); + lv_obj_align(alarmIcon, labelAlarm, LV_ALIGN_OUT_LEFT_MID, -3, 0); + + // don't show the icons jsut set if we don't show alarm status + if (!settingsController.GetInfineatShowAlarmStatus()) { + lv_obj_set_hidden(labelAlarm, true); + lv_obj_set_hidden(alarmIcon, true); + lv_obj_set_hidden(labelTimeAmPmAlarm, true); + } + stepValue = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(stepValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, grayColor); lv_obj_set_style_local_text_font(stepValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); @@ -275,7 +305,7 @@ WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, btnToggleCover = lv_btn_create(lv_scr_act(), nullptr); btnToggleCover->user_data = this; lv_obj_set_size(btnToggleCover, 60, 60); - lv_obj_align(btnToggleCover, lv_scr_act(), LV_ALIGN_CENTER, 0, 80); + lv_obj_align(btnToggleCover, lv_scr_act(), LV_ALIGN_CENTER, 0,0); lv_obj_set_style_local_bg_opa(btnToggleCover, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_70); const char* labelToggle = settingsController.GetInfineatShowSideCover() ? "ON" : "OFF"; lblToggle = lv_label_create(btnToggleCover, nullptr); @@ -283,6 +313,17 @@ WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, lv_obj_set_event_cb(btnToggleCover, event_handler); lv_obj_set_hidden(btnToggleCover, true); + btnToggleAlarm = lv_btn_create(lv_scr_act(), nullptr); + btnToggleAlarm->user_data = this; + lv_obj_set_size(btnToggleAlarm, 60, 60); + lv_obj_align(btnToggleAlarm, lv_scr_act(), LV_ALIGN_CENTER, 0, 80); + lv_obj_set_style_local_bg_opa(btnToggleAlarm, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_70); + const char* labelToggleAlarm = settingsController.GetInfineatShowAlarmStatus() ? Symbols::bell : Symbols::notbell; + lblAlarm = lv_label_create(btnToggleAlarm, nullptr); + lv_label_set_text_static(lblAlarm, labelToggleAlarm); + lv_obj_set_event_cb(btnToggleAlarm, event_handler); + lv_obj_set_hidden(btnToggleAlarm, true); + // Button to access the settings btnSettings = lv_btn_create(lv_scr_act(), nullptr); btnSettings->user_data = this; @@ -332,6 +373,7 @@ void WatchFaceInfineat::CloseMenu() { lv_obj_set_hidden(btnNextColor, true); lv_obj_set_hidden(btnPrevColor, true); lv_obj_set_hidden(btnToggleCover, true); + lv_obj_set_hidden(btnToggleAlarm, true); } bool WatchFaceInfineat::OnButtonPushed() { @@ -346,6 +388,7 @@ void WatchFaceInfineat::UpdateSelected(lv_obj_t* object, lv_event_t event) { if (event == LV_EVENT_CLICKED) { bool showSideCover = settingsController.GetInfineatShowSideCover(); int colorIndex = settingsController.GetInfineatColorIndex(); + bool showAlarmStatus = settingsController.GetInfineatShowAlarmStatus(); if (object == btnSettings) { lv_obj_set_hidden(btnSettings, true); @@ -353,6 +396,7 @@ void WatchFaceInfineat::UpdateSelected(lv_obj_t* object, lv_event_t event) { lv_obj_set_hidden(btnNextColor, !showSideCover); lv_obj_set_hidden(btnPrevColor, !showSideCover); lv_obj_set_hidden(btnToggleCover, false); + lv_obj_set_hidden(btnToggleAlarm, false); } if (object == btnClose) { CloseMenu(); @@ -368,6 +412,18 @@ void WatchFaceInfineat::UpdateSelected(lv_obj_t* object, lv_event_t event) { const char* labelToggle = showSideCover ? "OFF" : "ON"; lv_label_set_text_static(lblToggle, labelToggle); } + + if (object == btnToggleAlarm) { + settingsController.SetInfineatShowAlarmStatus(!showAlarmStatus); + bool newShowAlarmStatus = settingsController.GetInfineatShowAlarmStatus(); + lv_obj_set_hidden(labelAlarm, !newShowAlarmStatus); + lv_obj_set_hidden(alarmIcon, !newShowAlarmStatus); + lv_obj_set_hidden(labelTimeAmPmAlarm, !newShowAlarmStatus); + const char* labelToggleAlarm = newShowAlarmStatus ? Symbols::bell : Symbols::notbell; + lv_label_set_text_static(lblAlarm, labelToggleAlarm); + } + + if (object == btnNextColor) { colorIndex = (colorIndex + 1) % nColors; settingsController.SetInfineatColorIndex(colorIndex); @@ -452,6 +508,43 @@ void WatchFaceInfineat::Refresh() { lv_obj_align(bleIcon, dateContainer, LV_ALIGN_OUT_BOTTOM_MID, 0, 3); } + if (settingsController.GetInfineatShowAlarmStatus()) { + alarmState = alarmController.State()==Pinetime::Controllers::AlarmController::AlarmState::Set; + // sets the icon as bell or barred bell + lv_label_set_text_static(alarmIcon, AlarmIcon::GetIcon(alarmState)); + //displays the time of the alarm or nothing if the alarm is not set + if (alarmState) { + uint8_t alarmHours = alarmController.Hours(); + uint8_t alarmMinutes = alarmController.Minutes(); + //handles the am pm format. + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { + char ampmChar[3] = "AM"; + if (alarmHours == 0) { + alarmHours = 12; + } else if (alarmHours == 12) { + ampmChar[0]='P'; + } else if (alarmHours > 12) { + alarmHours = alarmHours - 12; + ampmChar[0]='P'; + } + lv_label_set_text(labelTimeAmPmAlarm, ampmChar); + lv_obj_set_style_local_text_font(labelTimeAmPmAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); + lv_obj_align(labelTimeAmPmAlarm, labelAlarm, LV_ALIGN_OUT_TOP_RIGHT, 0, 0); + } + + lv_label_set_text_fmt(labelAlarm, "%02d:%02d", alarmHours, alarmMinutes); + + lv_obj_align(alarmIcon, labelAlarm, LV_ALIGN_OUT_LEFT_MID, -3, 0); + lv_obj_align(labelAlarm, dateContainer, LV_ALIGN_OUT_BOTTOM_MID, -10, 0); + lv_obj_align(labelAlarm, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -3, 0); + + } + else { + lv_label_set_text_static(labelAlarm, Symbols::none); + lv_obj_align(alarmIcon, dateContainer, LV_ALIGN_OUT_BOTTOM_MID, 0, 0); + lv_obj_align(alarmIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -3, 0); + } + } stepCount = motionController.NbSteps(); if (stepCount.IsUpdated()) { lv_label_set_text_fmt(stepValue, "%lu", stepCount.Get()); diff --git a/src/displayapp/screens/WatchFaceInfineat.h b/src/displayapp/screens/WatchFaceInfineat.h index 55c43f98..7ea134f2 100644 --- a/src/displayapp/screens/WatchFaceInfineat.h +++ b/src/displayapp/screens/WatchFaceInfineat.h @@ -28,6 +28,7 @@ namespace Pinetime { WatchFaceInfineat(Controllers::DateTime& dateTimeController, const Controllers::Battery& batteryController, const Controllers::Ble& bleController, + Controllers::AlarmController& alarmController, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController, Controllers::MotionController& motionController, @@ -52,6 +53,7 @@ namespace Pinetime { Utility::DirtyValue isCharging {}; Utility::DirtyValue bleState {}; Utility::DirtyValue bleRadioEnabled {}; + bool alarmState {}; Utility::DirtyValue> currentDateTime {}; Utility::DirtyValue stepCount {}; Utility::DirtyValue notificationState {}; @@ -71,22 +73,28 @@ namespace Pinetime { lv_obj_t* dateContainer; lv_obj_t* labelDate; lv_obj_t* bleIcon; + lv_obj_t* labelAlarm; + lv_obj_t* labelTimeAmPmAlarm; + lv_obj_t* alarmIcon; lv_obj_t* stepIcon; lv_obj_t* stepValue; lv_obj_t* notificationIcon; lv_obj_t* btnClose; lv_obj_t* btnNextColor; lv_obj_t* btnToggleCover; + lv_obj_t* btnToggleAlarm; lv_obj_t* btnPrevColor; lv_obj_t* btnSettings; lv_obj_t* labelBtnSettings; lv_obj_t* lblToggle; + lv_obj_t* lblAlarm; lv_obj_t* lines[nLines]; Controllers::DateTime& dateTimeController; const Controllers::Battery& batteryController; const Controllers::Ble& bleController; + Controllers::AlarmController& alarmController; Controllers::NotificationManager& notificationManager; Controllers::Settings& settingsController; Controllers::MotionController& motionController; @@ -94,6 +102,8 @@ namespace Pinetime { void SetBatteryLevel(uint8_t batteryPercent); void ToggleBatteryIndicatorColor(bool showSideCover); + void ToggleShowAlarmStatus(bool showAlarmStatus); + lv_task_t* taskRefresh; lv_font_t* font_teko = nullptr; lv_font_t* font_bebas = nullptr; @@ -109,6 +119,7 @@ namespace Pinetime { return new Screens::WatchFaceInfineat(controllers.dateTimeController, controllers.batteryController, controllers.bleController, + controllers.alarmController, controllers.notificationManager, controllers.settingsController, controllers.motionController,