From f8f0652e469d3f81bc8122a80c426aebb8dc2242 Mon Sep 17 00:00:00 2001 From: Darren Croton Date: Sun, 23 Apr 2017 12:41:29 +1000 Subject: [PATCH] Can now change the colour of the graph, and also colour code by profile HR zones. Selectable in settings. --- bin/SnapshotWatch-settings.json | 2 +- bin/SnapshotWatch.prg | Bin 57136 -> 59272 bytes bin/SnapshotWatch.prg.debug.xml | 747 +++++++++++++++++--------------- manifest.xml | 1 + resources/resources.xml | 33 ++ source/SnapshotWatchView.mc | 35 +- 6 files changed, 458 insertions(+), 360 deletions(-) diff --git a/bin/SnapshotWatch-settings.json b/bin/SnapshotWatch-settings.json index a4964b6..864156d 100644 --- a/bin/SnapshotWatch-settings.json +++ b/bin/SnapshotWatch-settings.json @@ -1 +1 @@ -{"settings":[{"key":"showHeartRate","valueType":"boolean","defaultValue":true,"configTitle":"ShowHeartRateLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"boolean","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null},{"key":"showSecondTime","valueType":"boolean","defaultValue":false,"configTitle":"ShowSecondTimeLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"boolean","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null},{"key":"secondTimeOffset","valueType":"number","defaultValue":0,"configTitle":"SecondTimeOffsetLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"numeric","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null}],"languages":{"valyrian":{"ShowHeartRateLabel":"Show heart rate graph and min/max values","ShowSecondTimeLabel":"Show second (digital) time","SecondTimeOffsetLabel":"Second (digital) time hour offset (integer, +-24)","AppName":"SnapshotWatch"}}} \ No newline at end of file +{"settings":[{"key":"showHeartRate","valueType":"boolean","defaultValue":true,"configTitle":"ShowHeartRateLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"boolean","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null},{"key":"graphColour","valueType":"number","defaultValue":0,"configTitle":"GraphColourLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"list","configReadonly":false,"configRequired":true,"configOptions":[{"display":"DK_GRAY","value":0},{"display":"RED","value":1},{"display":"DK_RED","value":2},{"display":"ORANGE","value":3},{"display":"YELLOW","value":4},{"display":"GREEN","value":5},{"display":"DK_GREEN","value":6},{"display":"BLUE","value":7},{"display":"DK_BLUE","value":8},{"display":"PURPLE","value":9},{"display":"PINK","value":10}],"configMin":null,"configMax":null,"configMaxLength":null},{"key":"useZonesColour","valueType":"boolean","defaultValue":true,"configTitle":"UseZonesColourLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"boolean","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null},{"key":"showSecondTime","valueType":"boolean","defaultValue":false,"configTitle":"ShowSecondTimeLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"boolean","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null},{"key":"secondTimeOffset","valueType":"number","defaultValue":0,"configTitle":"SecondTimeOffsetLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"numeric","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null}],"languages":{"valyrian":{"UseZonesColourLabel":"Additionally colour code graph by profile heart rate zones?","DK_GRAY":"Dark Gray","DK_GREEN":"Dark Green","BLUE":"Blue","SecondTimeOffsetLabel":"Second (digital) time hour offset (integer, +-24)","PURPLE":"Purple","GREEN":"Green","DK_RED":"Dark Red","DK_BLUE":"Dark Blue","AppName":"SnapshotWatch","RED":"Red","PINK":"Pink","ShowHeartRateLabel":"Show heart rate graph and min/max values","GraphColourLabel":"Heart rate graph colour","ShowSecondTimeLabel":"Show second (digital) time","YELLOW":"Yellow","ORANGE":"Orange"}}} \ No newline at end of file diff --git a/bin/SnapshotWatch.prg b/bin/SnapshotWatch.prg index 6a8d2906c9b2befe0e9eed3dd3daf94a507ca9fc..4e06dc97d67632907755e44f2a0c268de7d22320 100644 GIT binary patch delta 23365 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 delta 21216 zcmbuH2V7Lw*0=XGKw+o~A|fD)QUn`T6gw&k_TGDoy|=;MjXL%odv9or#u{s4i<(5E zQDaT)dM%0ld)CYWPrP}*^84=Zy*#t_*=L`%*ZQxu&w%fpaMrYSziE15pZrQ0&ME$L zdB~pqO1XY9qvAuO>1%r-gMSg@E~Rn>C}r%Grc5$NrKubd-YWFb|3v#BL%cEcv3-l7 zg)z)v_cR6@!{Y1(1%>Q2jlp4Ih0}~5{aNDAL#tXmajfb5VFa$q%VM8o40UrZA6CSk z(-a&P)+kN2bm5l8X~sqQ%PTc3&A3$T9cjj8!u@H+uY|kpZA|`#VEcMwkilR-W=yg% z>hYaY@zCqCQpKU~OQlM{?4^_{2?Ka=DVTG$Ql(+gA*IT|T(^`;fT8_0XS(8rIKC*& zXk^^%mu56UOL&^mEG)pr#Jh%RCWY;>Ce36s$cK5dQ!a$FLn3Ir>!4SlQe_J{KB{sW z6E&7Etn!teqErRgxrtI0ik$9&v+)Ll@>K{&RgUp=eyC!f>=u)?yw&V9 z6YYoGde{=JE)j{$(gw?0P0p(otY$xpwt&^w5)!KlC=YENtFI}pe@y#h_WDemSaHGZ(HAk@zx4v~yl{yJyxALp6JB*6{MxtQIe$MSECTt3|s% z**UYC)yWz>I`Ph{!;X1rhG1*Pb86aWWX)ksmPNEXYuUffny+>;PyRHP;#{SIwptRa zmD#jmspbt{N0hl4*uiPmv|2JYSlKtjohtTd_ncW%iJv21DfU$NoQ6vFuI^EWTK3uQ zk^DU19&M;-f8ZWeMgr=bml-iXSLXm8xc={+ZLi=FXp_gdc^Umtw)QxyuUp0^v)M0; z^RrCL!ZiPQqru=DiuE;+XTy7Il$SvZN1Su$ont7U=+n>WYm^TOL6K^+^S(k>=a4a* zkFTHg z<}RXGpqq1nXlo2=jZ|J4rudU1m+L>rK7Rc8XKvR>l}nqIF_|r@HIDrRssQI;RJ79e z8|~Pm>+dsgqrMzLDv<;@VpQ!BFsVanlzP`9SX3Kwi&R;8f=ig6F;FGQb6w@RYLPXHVe<}q zVPC)aB32*g12okXwfcCOP=#p6Sd|?*H2%4JgMH(?O8sN|rPFu$_A?k_?J?Op@N;Ii zG=BPJFC1*y_|I*aKe=EjYj2ain6`Jb)>z`~F;Ri`ec3Dj*SNQT{Ssxghx&i&mj$B@ zp8qhN*-tYp7g-pkBK+(N{RFZ^Z@eG+1u|_0z?AXzw#i6LC(#&BOUyH@hSIdVzDlliPpVQFmE0@Wa{^@J> z%jWd4GV${B&F1Us>uX;YnBBDr70CbD7v;?7laW-vjCx2vpEJ~Ch_^ov&d1Nd+*SG6 zI=6ft$IpWHjk)uCmXHLnoKqI|8@VGsAIct5E<8pe;PjvZH~g!H4uoX4PY%fv9iu&7 zcTeg6`JUYWRVoidihbIO=2%>M;m{=p52v$^rx&tc2@9rsy$;Lcs~>jMN>=-gumIOW z+UJj9x&C`fHkrcxGxFs5=duU#$g)@S{L8Z8x@E)d|GI1e-IN0VKBb8Ez;?MHt$sK7e7^za7IsC84<<=%v&)3@M za>BkLU-@up?aBX#{^1#s@Lzds5)q$`dkwyhVpF{|Sw!2HN0clV&Rr>1wwztCW)ZMQ_mIDUrO>qaJ3u^jeu z@pYHAdpR_b@lcm?elGv_54{$dpNG0c(=TDa;h6V6Hpu3f=jng&+K_F$iETGT^D@tWES2%+9v_Nhn{{>xY^%;L ziOrV)$NWOfFM}PVvlFoEX!aJaCt^4FWZP7E23mg_P!+I8=&aUIFjD9-1E_O+s zT@Smv&aRKWLT5L?-jreUeASSFJsAVoO|Vbs?55b)b#@DHWlGiAt*|@m?AF*{=MyDQ&dH4QjY&|SXKqK`JrdCvU>u+c!KjfTuoIy(lt ztj>=oFyiMoN+@(U=ZZP`JYY{Xuqvo~R{(dK`{ z_3hXjbap!SPMy62o8PF315%Fa8|-5`dyluWc|6k%e9HtahmITec`K_$cYQy$77@qw z1K3*CIP62%nn)e?VQfT}>A(@}hC2J0w@q0)>IRN8VVKVT9($S2K8dYG!0~`n*iuFr zJ3Ni8MZj_W4EA2#^&hb{(K@c5L&esN&Lttb@R|LSxALU*Wz^|y7D|5X+usiGQ2iSu@ z**5iv0j;g_0t6P6nn1DeumBYpZS32*z0umOKgtU%hC0l8iRyMpdI?~LBbPTOXY38fflpqo${yOqu^gWX+c zCt?rK*}Ow~r|E3oA-yN*?26d4bT;R|w^Ktl<#3=f18a2?cpvcIuCqD+eeddQ-udKj z0}=t3`fQ*P_G_KZE8IWq=HANBLwB9y+b>dV>Ho4oO9oPP6Ix;S*V&xkelj=Xf$gy8 z=%FnH-tKr{ zA8buz4!bXZHPITC!|vz&D~fEue3a)6!sc{zod1r2Aq+HfKEPoQ!|tTBhhq=a*>ukA zT0|W4)3CKS9)~>=dzEhfXm91;TW53J`;XSnf5#0|7+9{G!1?cgNN02Y`}4M&xq}(b zzXv&NB4e0~?V?>5dp>quoxK3tDLQ4A>m2U^_cL}N1Dx+UitBDzj6F(cFTp;evzL0S zz??dJ8MbzqIUc}yAE=4gVXwgcpqsyvKV;doS1!i{&i|a+@#wJEIRDZmJ9IVS;0EmV z&IKGc?*lo1(b=2%i&!3=y%k&Q3y%5Qum|a`r*r+`H2NM|8xDJv(I3E)Y)f0vw!@|K97on{dG57z}DW;91q~U4^Grw=e!SYud^>> zXLLGo=n8hm=_fYFd+-I_{Hxfnbhho5x619R8@ThC&3XQh>wjWrydTH|?qPS<-G3h& zF=s~TA@&ZP&2gVw=a9|tgn^9HN)~*IopHR1{S5o1Zh`0CDx|*7eu1r(ts`Qb_aPbY z19Jag*n4#I|HeL&Y1@?H4S%Q2IL+jSxAJ#fZ34M88nH9pSj0ACkJer1ybqnGvt6*~ z>1@6hg)XLoLK(ZqE1t~%D#NxhAUEuA4p@p{XT{#F+3ZYtV()j_=7-q6*x%`FKkPqg ztLIpo(5pai6=rbSEvzALK8O5X}5I@1Tdhz(Ku}0Xu=lgZV1BOtg~}tf1|TQ zv43UvIN`XT2;{**r=32wQeLysC1?7EBsWW#nf>PF5~r{Hw$9Q3M!>!>KU`}MNr|<0 zPRVUwRx3WhTCYc&UVS_F?ANGGzjmF~hSM8PGq0F^SxPqhg_QiZV2(ItGVwzZaX#{2 zzbp>q&0=V+uE?kh*V4?>JTKa6tFeBQZoZAvKaQnmylai7C{_LMGcC%4e9pW zt?JNp6-8QHmUqJ@m?{f@zqGMwMQTf&g1Ay*FXTNVp%=6&HRxyP$%2I;@1VnHLvQ}A zz;H4>8RH#y8euH8BVn%k9N2#udVYpH)&qLDF z^eaeu#w~-SXHp6zJ@xv-0!lTHf{~ow!w&EPqfu`d&94@JfH6w-*$4{~S_xq+4vvO& z_D08GA*DvKm?A1oB_e1$P3|ws1K+`7O0|%U#gl@;u((p?Ns}r;=p}_EmFoR1EXA(M z5@uCesm?5_&|GJtpc0sK6_!=1*IZbRfBirhRU&H*h2@nRDAy|}HGy+TRaB~KeOO7U z>N8pauh5U^46mYw}T2Lb!X0V}!5u zQJBh97FV?iHKG*pm2C)3_&gMvNkwbOE~{RKE=qN=L&VoMD@1&0D-Z2>3lZPMEfDdQ zmJO9sYKCn)9}wRp@vIE$z6cRtg9i}t@mG&D5nr<>5b-rT3d<% zxDa3a>rlk!3G49S>98)Ts0HhBJtw3R`blaU@UOS>!-hn39&7}s!N#QgENnvkw~-w+ zrNq0!W_XqYn=94hHf#Y;!j?ET5w@bVSHRZfunBBKBqCv3cKRJ`$NimQd#Wc6cEFK) zkWwo>4t64?hhb+NF9EyQ@K8k874@1Sr8jK=>`srl55G{VlL_{qoJPQ&h)Fcki&h|x z({zS6gME1L4%nA@^I<NX`~gHnPAX7N`st zvv6~`1Tl_=OW8p-xD3%rXZwndSQjp*{-wjMz|p&KB`MheS0T3IaJ5q19>XI(m0v~pBzF6QMLVE;$OGJvmy`-QH+=pnA;C}31 z;Q>TA7#?Itq*)z8<+9*+)br2qFp-hmA3V7 z4}aiKS7+f#LRbKvqHJEn({wIL$r%>v2G4SSuZKTU?{DBa9w=3Co@4qLyg;K7M}Oi4 z!~lOrQ__%rA;q)cMNZ94@Dg&4m4@;wA$bHZ!#3~=xtRigLo|EgRUYI4uaPR*!F6)J z75>hGr{N6_7um>7QX>((#e+q(x2Xzo{0{XlDZ5KbM3jHfanC{ezbe#;5BF%Lli+>o z^)P(E0@>h0j?bd-5fRA&A9M7JD4$TS72s3UE)jdip(H8%5015h_k@C6T+@t34b zRR4-oQ>y1L&JZKC{f#H<`0$!?h=6Yh)nxdVGARV#(MUwq?`b$A;RmWgQu2{VRpoEq ziu-9O{2NWxqc1cv&dv-bc76ex>3CF!!GZ&%%HYCA-JvV*4Ns|mgBv^C!$1}q3Im3$ zyl~Wm?x>j@8axo?8fazSCFqG55s$$OQvU{Ta$XDi@Me?~`jWEM(2taS1+$?Qf0&&V z=7;{Mz9$TzJin#>4LMMIJ_Z8ubS%uti^g#nM5y|}T!^v}3?>2xU~b-!mcbAXEparI z$en~?h*KQSLm5-HhHyGuYnYevd=B$bEjwWZ;*;z7iEshx-%x;;$Xzg!dcFyxXfU#~ zXeMlgF+7Oe8w&EuB%a5jjR7!@P^Q8{ynqD3!rV6l7Qx|gSX8NY>981~o&e)1bBSPa zBK-|4!MZk1Awx-aO1T+IQQxT9P?`wD!!p$Cc9=lp$pgz0!j`ZcI}-;J5u+C@Pwwl( z3W%->tjI=WUM0%6IIK(rw!tbiv}v#^FTzD(67^qyARnqBA`w${s-YaL!Oo&!GId-L z)}$&ZCqpefmU$^eLL5(3DowOd8#U*Gb-_8_sRR zAaW?>GMKvM4aP8p2g$^te7QLbhoOyea5&X8r?=&jI3`EH3XPC)-N1>gNODbp4xag>c*_7{II0t){)c;&UE2^JI zj%&gBG?2}30UrMi7n1Yra1pO&S>R%J`V1~%d;wgFitoW?EF2HNqDsDl%Mq=lbOjDd zL{_4yG`NcAb%CpSQ<^UIzlIkA+2LA3UmLEYmv4pZDa+@3a40w2PT7if(h;lNzk`T9g*(~6E%-H}w3Xw-E;Jya{00qh7#Vi+ z!XYhr51~$h-%>Wda4*%+2=1fI-oX7tOmcjH7JMHbM2x-QAsmyPe#dFo6&|KB6@y2J z#6)J{(6BE#L{nvj~04=r0iZW$-69b`1VZHPnT_Q2)&&=NDE6j2`rd7tl%$Ikb$PY(N(DqF+3Q-b7Ly z@!`QT?o0ijgMM5m(#C95iL9R;N2^i)Mt^dj$Up$1>IrjDw?kkc>Q93?SzrweqW&kq zTr{kAFqj>RAZtz(S~eF)YkZ zsSaZij`1n5DE&n?P>k;Z*I+zvTDC)cD2^CBUl0CNr~&mqwiF*4vLg#@L~9lGHl_;R!X}7_ax^x@v7cZw$|ngn z=LJOALaElW!_mt@!pE ztkvNTXp@e&lLbVrUlYm$a2F}K3cq1Ta>H(3m%oI25LFTQEn>C8y&OWE1;%|ix*G1M zjOG3Vgq&A7<3SpaRL3D2%?7)|LBZzfqF+Lonp5>4@#=_$Hanv~oo}lOd z2EV85zK1`s6M5iCT4@1ziiP6fXco#}}{XwW?M}Ja|b>Tfi9|`aC z;1ciwt@Q|eh=VQQBUCNxJmz{f_=GZ*#`cuXC-*(0KXicq;d&$ZoI`INw7o#}vd~M^ zD)sw{+#iL1q3V_JZzA$7d`)O;!8eFbdiPr*B9VHBXnVo;v|_pbk+R|eCdJOTKm#hL zVaZ>(hO)lNOiBwv3mSPu{hM4UFFOOSi0CZLLhj1Ktdz|~=uYlFKo1(oH0VhgmWE!u z*^GcbgdRstexxiNW}|va!0c2F5j6P|QM6(Tz_CLx2a#$F1KGF-^>50FXEYR35FKd+ z%tgp#LNK8UhPm;y4-7%YIza5}6G z5u>RF_5X!d)#Z@s1nXgoHtLh2 zzOVtI?g$%F=lfwJLcJI^=1b{a*o2o_*?3dxKaLh^YDUP4z~-caL&nqsF}{Q?@z52v zq9G;2)|8!uz73(HF`3$u%RtzUSF(AqJ>ruHb|6($k*Op0W!MSFB~_gX{XN)))IEn? zZHT2PAG&dlH-p{jY~tw`RDmqmg9nQEdg7pntrtCBQqY@}tc86jC$ak?N*au*A74nK zVSnBQCFBE`Hw+G>pG<&*a8$H0m~~G>+YmaIsD7wYiIU@CgsLALP6(^Q5wzGB5J!`( zFpZrTh9eo5G8@I=^%Rcgi^-pG4ELGfSRx}27)KSz1ILpp8j)!N58ezXvY`r6|C1;) z$;o7PG8ayvkz9gPX+Yx8G$KK#GJVMxl;vikM>DVx2YSQBwAvYP31>oixD-(dzhbB7;c^<5 z)c*<^(_^@j4tW)>qC0Cd;U8s09{D$+JR&3f$Z@&QdaG!|rTkIxqABWRT zc!2(}9v&njTi_vD_BZf5B5jkL93eFA;ZZJ#$H&N(i10YC(NeD`c<(;|f1rUxz?1B_ zB0Q~BS`l~#ZAb*qayE$if24m%=+E)$)(f8JY?0JlAoN|}PdF}G`I(KEmkYmeLw$IW zvh#tLc%W3nuXMgr@G>1y9K1p*M0CHgP+52tF-pj<;lLm8I+2ma@;f^YgExqT?DQtB zS|WRkh)M^&&3f_)&p5L*!ZlN^g!?vbPK;e8?@k$FH%UIQO;j`xI* z=zt=^$5fF&e8NVK!>1fdec>}iTNVC?mr?12&#AJ`@C9$l!{JNHs^M5Zydvag_!m2p z9RH12q$9rOP?`we;J{k=mYvF}_KuzX4&S4VhwuaCCz1Hb8N$xZiWWQt8nBB&Bcc8p znv_bb1ewtMH)ykPPFwik!b{^*=t^C)L$e!VB*f+{R6$3Wl?UB|?(BFE^uPgjYPKRW za&Pve92Y__%99A1ebCA{=tn5BWBRIi8AP=BS%t7RE z8_dOf{$d!6I2*$d99aiLsdpI}PcgI0))Ih;l#56(+jB1&^Uay}SFQ0K2Nj1Q~%~Dax$NRXgU@uH^;DZ>epNl2dcq1C_5-jDhk1(R7p`7Ps+x?;ygGB zmf%n!RpwG0I{$&C5%WHnK+mrT%My{gupAqWfaQ5bTT1<#D{=;;!ODn8c3y=>at~Ie zGnR+dc%T=oPLFqkHCPxinUiTSgwR|QN~lv1T~}C}&UqBp#i35HK6XjifYecC=7v;} z%xgp$+kWChV{&m2HX)bOVN*o76E?%+>aaPd*+|#|@rYJh5{VwL6*+AWTce#runpRI z0^7oiupJGCPG@e`SDY!G81uU)Z1ZE5iYV{y7{-{g0>a z&4W0VB-eu}BLf`5D^m;{N{AM~VeCXwGn`I#8IGXUiY6%EgpM$cNc;*%!ZUCb5m*jK zLlNs3s^Bj;j+7pO<8f3{Hh~42`SD>QJCzVkLcPP`WWFGX$fnSkBo)&L-4Zw*wZDQh z=w!0vnT+Rwc2dv}&Y~BLl^9rh_GhB&gIBd+T5Tk^AHRW6p zuAyw}!L_t>7q|{l6LFh)J&mIZ0~^@+Ot_I7eBdThA)(q#`9#AlXkaAVN~$C^+n6sq z-p*ODAEwiiE5RL<^E$Yb&`YEGnpZH1+%8g87=A+vMbx|LsDq{c_t2wxK`?(yh-3$Q z5sf&sj|Uur`w>ekcz}ix3=cBDHatXM5XZhF=f&Y+9v}-J!4ZkzQNEyvCXS)2yoLi~;B|Ji6aJ24vV$AEDM^F5NkmS-TZrlpc$<`tfOqH{qM^G=%{0M3NR=o2 zlj=DD?-7~G(wXk#xv2I5xsjYcBn92zBh=poJ|<*I@CmIp7Ct59S>Q9YQWyS*`WF#C z$5A;$UJ%+a_>y_z_$$_x4gQ7LE5X01l2Y(B_22P#KDy(c3@cFul%u6Gxt7pXAw?3A zs_eWKOyX^K60Alqr^8vQ^WaXf1|4)EOs1ns&TF#cwXhZr<%B7;>O3%&vh}g?p$-!z zhxNFz4XjV@B(x2%QLCjP59kFOv%n14giuRLn$m!B!DggL9Bxj7LhY6owAx~@B@xR4 zTXFdO0$Zas`i7+qXNQQdEvKvvRa@GjR>^I9PCc2}fd%Boj)ZIr>_mA!hMi#p*oDUP zGwe#)&4t|%*HhS?dcO_7U}tw>55}WmPf~CT_To(03VUb#KMRgUBq4Ad9@FV84-t2w8a!8PpY0bI-BBlFf#wj#>)v}UP-4V0m5 zU?Yx;1~ySGCE;d59R|0s^EkMb2o{Ii5#tV(=3?2w8_aj3B)^Ala zRT-2epfkfqK4<3G#4aqyb2Qf70>giZeknmIr(Tcw{Xntq$t&Bh9lF5U^j@iHvE_z798;+9qK8wf&q}&ACO&uYmG25K ztbW#|d70K-`zEFCj%i+Vx$Vr7=(+a?)J_T<+_XmJZD)SiP{cLg=EvLozUla?$KZv7 z-XwoJY1&_2hl&o1m=xN2Omee2zrH-=|6}9fXU@en?&xyxhgU9B%4Iv9d&Svb%dIJY z{KEY%w{CP;>;B=)I`1uO(??xe6X>>cYOk9`f=y{#%XK=kyR%p8;(zBn(({*}MrFNq zH}7%V>{7KJ`?kB3`1RM{e>wPLEuTCSuX_(UX&;yMXtiYtC%i(kP2bdK+tI~exA^$| z_2m1v1ILefwxUkRo%VU-&dl)}=s&Gf)95l^Rv5oBD%ZY*V~M7sxz_YOT=7w#n_u-h zIeKsD_o4NUj2z$Nb=yR1&kf;+^4AU+eq>e950No1%ya%&Zr*#xwxapYm0cp*yjf9w zM0mlOBjdg9M90|H#GQ$nboIT5?F;j_JvzpZ8#JcW>_c(<|0Q~Mu&}~vo3^->49xeu>60tf@|^UrzYF={eYYHCk6o?b zWl*GTYSEUx`V^e8uE3Nm11CO8u5XSy_SXDvMvWEqhqw%zHqy&7W|c?%s4HEvPk&Nz by=g-0`WJVMD^mN&m_~IX&ZG~!<6- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + + - + - + + - + - + - - + + + + - + - + - - + + - + - - - - - - + + + + + + + - - + + + - + - + + + + - - + + + - - - - + + + + + + - - + + + - + - - + + + - + - - - - - + + + + + + - - + + + - - - + + + + @@ -388,69 +418,70 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -493,6 +524,10 @@ + + + + diff --git a/manifest.xml b/manifest.xml index 49b1a42..83af5e1 100644 --- a/manifest.xml +++ b/manifest.xml @@ -7,6 +7,7 @@ + diff --git a/resources/resources.xml b/resources/resources.xml index 56910b9..1ab1ef5 100644 --- a/resources/resources.xml +++ b/resources/resources.xml @@ -2,12 +2,27 @@ true + 0 + true false 0 Show heart rate graph and min/max values + Heart rate graph colour + Dark Gray + Red + Dark Red + Orange + Yellow + Green + Dark Green + Blue + Dark Blue + Purple + Pink + Additionally colour code graph by profile heart rate zones? Show second (digital) time Second (digital) time hour offset (integer, +-24) @@ -16,6 +31,24 @@ + + + @Strings.DK_GRAY + @Strings.RED + @Strings.DK_RED + @Strings.ORANGE + @Strings.YELLOW + @Strings.GREEN + @Strings.DK_GREEN + @Strings.BLUE + @Strings.DK_BLUE + @Strings.PURPLE + @Strings.PINK + + + + + diff --git a/source/SnapshotWatchView.mc b/source/SnapshotWatchView.mc index 0cc45df..dc7e8e4 100644 --- a/source/SnapshotWatchView.mc +++ b/source/SnapshotWatchView.mc @@ -9,6 +9,7 @@ using Toybox.Application as App; using Toybox.ActivityMonitor as ActMon; using Toybox.SensorHistory as Sensor; using Toybox.Activity as Activity; +using Toybox.UserProfile as User; enum { @@ -24,6 +25,11 @@ class SnapshotWatchView extends Ui.WatchFace { var showSecondTime = false; var secondTimeOffset = 0; + var arrayColours = new [11]; + var graphColour = 0; + var useZonesColour = true; + var heartRateZones; + var background_color = Gfx.COLOR_BLACK; // var background_color = Gfx.COLOR_DK_GRAY; @@ -43,6 +49,10 @@ class SnapshotWatchView extends Ui.WatchFace { width_screen = dc.getWidth(); height_screen = dc.getHeight(); + arrayColours = [Gfx.COLOR_DK_GRAY, Gfx.COLOR_RED, Gfx.COLOR_DK_RED, Gfx.COLOR_ORANGE, Gfx.COLOR_YELLOW, Gfx.COLOR_GREEN, Gfx.COLOR_DK_GREEN, Gfx.COLOR_BLUE, Gfx.COLOR_DK_BLUE, Gfx.COLOR_PURPLE, Gfx.COLOR_PINK]; + heartRateZones = User.getHeartRateZones(User.getCurrentSport()); +// heartRateZones = [98, 127, 146, 166, 185, 195]; + //get hash marks position for(var i = 0; i < 60; i+=1) { @@ -69,6 +79,8 @@ class SnapshotWatchView extends Ui.WatchFace { if (usePreferences) { showHeartRate = Application.getApp().getProperty("showHeartRate"); + graphColour = Application.getApp().getProperty("graphColour"); + useZonesColour = Application.getApp().getProperty("useZonesColour"); showSecondTime = Application.getApp().getProperty("showSecondTime"); secondTimeOffset = Application.getApp().getProperty("secondTimeOffset"); } @@ -198,8 +210,6 @@ class SnapshotWatchView extends Ui.WatchFace { if (sample.getMax() != null) { heartMax = sample.getMax(); } - dc.setColor(Gfx.COLOR_DK_GREEN, Gfx.COLOR_TRANSPARENT); - var maxSecs = 14355; //14400 = 4 hours var totHeight = 44; var totWidth = 165; @@ -275,10 +285,12 @@ class SnapshotWatchView extends Ui.WatchFace { // only plot bar if we have valid values if (heartBinMax > 0 && heartBinMax >= heartBinMin) { - var height = ((heartBinMax+heartBinMin)/2-heartMin*0.9) / (heartMax-heartMin*0.9) * totHeight; + var heartBinMid = (heartBinMax+heartBinMin)/2; + var height = (heartBinMid-heartMin*0.9) / (heartMax-heartMin*0.9) * totHeight; var xVal = (width_screen-totWidth)/2 + totWidth - i*binPixels -2; var yVal = height_screen/2+28 + totHeight - height; + dc.setColor(arrayColours[getHRColour(heartBinMid)], Gfx.COLOR_TRANSPARENT); dc.fillRectangle(xVal, yVal, binPixels, height); // Sys.println(i + ": " + binWidthSecs + " " + secsBin + " " + heartBinMin + " " + heartBinMax); @@ -294,6 +306,23 @@ class SnapshotWatchView extends Ui.WatchFace { } + function getHRColour(heartrate) + { + if (!useZonesColour || heartrate == null || heartrate < heartRateZones[1]) + { return graphColour; } +// else if (heartrate >= heartRateZones[0] && heartrate < heartRateZones[1]) +// { return 0; } + else if (heartrate >= heartRateZones[1] && heartrate < heartRateZones[2]) + { return 7; } + else if (heartrate >= heartRateZones[2] && heartrate < heartRateZones[3]) + { return 6; } + else if (heartrate >= heartRateZones[3] && heartrate < heartRateZones[4]) + { return 3; } + else + { return 2; } + } + + //! Draw the watch hand function drawHand(dc, angle, whichHand, width, handColour) {