From b2ec802b7bf2d1910f300f55dc11bdbf9564c49e Mon Sep 17 00:00:00 2001 From: YYGIRL Date: Tue, 29 Jul 2014 11:29:50 -0400 Subject: [PATCH 1/9] UI changes (Kate F), New Features, Other Fixes * Implemented UI design from Kate F * New battery indicator from Jon M * Bigger fonts in general, especially for time * New special value icons instead of special value numbers (??? instead of "10") * Switched black and white backgrounds, to improve readability * New space for T1D name * Made JS faster based on inputs from John C and Christine D, to help with reliability and refresh problems * New "two time" fix, to quickly diagnose refresh problem (when pebble app has crashed or gotten lost) * Time and date are from system, so always up to date and watch can function like a watch * More descriptive error messages * Implemented bug fixes, especially for Rajat build users * Commented code in much greater detail * Will publish FAQ to quickly identify problems and address faster --- appinfo.json | 101 +++++++- resources/images/batt10.png | Bin 0 -> 1509 bytes resources/images/batt20.png | Bin 0 -> 1511 bytes resources/images/batt30.png | Bin 0 -> 1500 bytes resources/images/batt40.png | Bin 0 -> 1498 bytes resources/images/batt50.png | Bin 0 -> 1512 bytes resources/images/batt60.png | Bin 0 -> 1500 bytes resources/images/batt70.png | Bin 0 -> 1498 bytes resources/images/batt80.png | Bin 0 -> 1491 bytes resources/images/batt90.png | Bin 0 -> 1489 bytes resources/images/battempty.png | Bin 0 -> 1708 bytes resources/images/battfull.png | Bin 0 -> 1497 bytes resources/images/battnone.png | Bin 0 -> 1193 bytes resources/images/blooddrop.png | Bin 0 -> 1729 bytes resources/images/brokenantenna.png | Bin 0 -> 2867 bytes resources/images/down.png | Bin 4602 -> 411 bytes resources/images/down45.png | Bin 4602 -> 1347 bytes resources/images/downdown.png | Bin 4602 -> 494 bytes resources/images/flat.png | Bin 4602 -> 1283 bytes resources/images/hourglass.png | Bin 0 -> 1807 bytes resources/images/logo.png | Bin 4833 -> 3462 bytes resources/images/menuicon.png | Bin 0 -> 3462 bytes resources/images/none.png | Bin 959 -> 961 bytes resources/images/questionmarks.png | Bin 0 -> 2300 bytes resources/images/stoplight.png | Bin 0 -> 1862 bytes resources/images/up.png | Bin 4602 -> 1181 bytes resources/images/up45.png | Bin 4602 -> 1353 bytes resources/images/upup.png | Bin 4602 -> 1273 bytes resources/img/batt10.png | Bin 0 -> 1509 bytes resources/img/batt20.png | Bin 0 -> 1511 bytes resources/img/batt30.png | Bin 0 -> 1500 bytes resources/img/batt40.png | Bin 0 -> 1498 bytes resources/img/batt50.png | Bin 0 -> 1512 bytes resources/img/batt60.png | Bin 0 -> 1500 bytes resources/img/batt70.png | Bin 0 -> 1498 bytes resources/img/batt80.png | Bin 0 -> 1491 bytes resources/img/batt90.png | Bin 0 -> 1489 bytes resources/img/battempty.png | Bin 0 -> 1708 bytes resources/img/battfull.png | Bin 0 -> 1497 bytes resources/img/battnone.png | Bin 0 -> 1193 bytes resources/img/blooddrop.png | Bin 0 -> 1729 bytes resources/img/brokenantenna.png | Bin 0 -> 2867 bytes resources/img/down.png | Bin 4602 -> 411 bytes resources/img/down45.png | Bin 4602 -> 1347 bytes resources/img/downdown.png | Bin 4602 -> 494 bytes resources/img/flat.png | Bin 4602 -> 1283 bytes resources/img/hourglass.png | Bin 0 -> 1807 bytes resources/img/logo.png | Bin 4833 -> 3462 bytes resources/img/menuicon.png | Bin 0 -> 3462 bytes resources/img/none.png | Bin 959 -> 961 bytes resources/img/questionmarks.png | Bin 0 -> 2300 bytes resources/img/stoplight.png | Bin 0 -> 1862 bytes resources/img/up.png | Bin 4602 -> 1181 bytes resources/img/up45.png | Bin 4602 -> 1353 bytes resources/img/upup.png | Bin 4602 -> 1273 bytes src/cgm.c | 393 +++++++++++++++++++++++------ src/js/pebble-js-app.js | 197 ++++++++++----- 57 files changed, 544 insertions(+), 147 deletions(-) create mode 100644 resources/images/batt10.png create mode 100644 resources/images/batt20.png create mode 100644 resources/images/batt30.png create mode 100644 resources/images/batt40.png create mode 100644 resources/images/batt50.png create mode 100644 resources/images/batt60.png create mode 100644 resources/images/batt70.png create mode 100644 resources/images/batt80.png create mode 100644 resources/images/batt90.png create mode 100644 resources/images/battempty.png create mode 100644 resources/images/battfull.png create mode 100644 resources/images/battnone.png create mode 100644 resources/images/blooddrop.png create mode 100644 resources/images/brokenantenna.png create mode 100644 resources/images/hourglass.png create mode 100644 resources/images/menuicon.png create mode 100644 resources/images/questionmarks.png create mode 100644 resources/images/stoplight.png create mode 100644 resources/img/batt10.png create mode 100644 resources/img/batt20.png create mode 100644 resources/img/batt30.png create mode 100644 resources/img/batt40.png create mode 100644 resources/img/batt50.png create mode 100644 resources/img/batt60.png create mode 100644 resources/img/batt70.png create mode 100644 resources/img/batt80.png create mode 100644 resources/img/batt90.png create mode 100644 resources/img/battempty.png create mode 100644 resources/img/battfull.png create mode 100644 resources/img/battnone.png create mode 100644 resources/img/blooddrop.png create mode 100644 resources/img/brokenantenna.png create mode 100644 resources/img/hourglass.png create mode 100644 resources/img/menuicon.png create mode 100644 resources/img/questionmarks.png create mode 100644 resources/img/stoplight.png diff --git a/appinfo.json b/appinfo.json index 38d34c6..0d9d5fb 100644 --- a/appinfo.json +++ b/appinfo.json @@ -9,14 +9,16 @@ "readtime": 2, "bg": 1, "icon": 0, - "alert": 3 + "alert": 3, + "battlevel": 6, + "t1dname": 7 }, "resources": { "media": [ { "name": "IMAGE_MENU_ICON", "type": "png", - "file": "images/logo.png", + "file": "images/menuicon.png", "menuIcon": true }, { @@ -58,15 +60,106 @@ "name": "IMAGE_NONE", "type": "png", "file": "images/none.png" + }, + { + "name": "IMAGE_LOGO", + "type": "png", + "file": "images/logo.png" + }, + { + "name": "IMAGE_BROKEN_ANTENNA", + "type": "png", + "file": "images/brokenantenna.png" + }, + { + "name": "IMAGE_BLOOD_DROP", + "type": "png", + "file": "images/blooddrop.png" + }, + { + "name": "IMAGE_STOP_LIGHT", + "type": "png", + "file": "images/stoplight.png" + }, + { + "name": "IMAGE_HOURGLASS", + "type": "png", + "file": "images/hourglass.png" + }, + { + "name": "IMAGE_QUESTION_MARKS", + "type": "png", + "file": "images/questionmarks.png" + }, + { + "name": "IMAGE_BATTFULL", + "type": "png", + "file": "images/battfull.png" + }, + { + "name": "IMAGE_BATT90", + "type": "png", + "file": "images/batt90.png" + }, + { + "name": "IMAGE_BATT80", + "type": "png", + "file": "images/batt80.png" + }, + { + "name": "IMAGE_BATT70", + "type": "png", + "file": "images/batt70.png" + }, + { + "name": "IMAGE_BATT60", + "type": "png", + "file": "images/batt60.png" + }, + { + "name": "IMAGE_BATT50", + "type": "png", + "file": "images/batt50.png" + }, + { + "name": "IMAGE_BATT40", + "type": "png", + "file": "images/batt40.png" + }, + { + "name": "IMAGE_BATT30", + "type": "png", + "file": "images/batt30.png" + }, + { + "name": "IMAGE_BATT20", + "type": "png", + "file": "images/batt20.png" + }, + { + "name": "IMAGE_BATT10", + "type": "png", + "file": "images/batt10.png" + }, + { + "name": "IMAGE_BATTEMPTY", + "type": "png", + "file": "images/battempty.png" + }, + { + "name": "IMAGE_BATTNONE", + "type": "png", + "file": "images/battnone.png" } ] }, - "versionCode": 5, + "versionCode": 6, "shortName": "CGM", "longName": "CGM", "watchapp": { "watchface": true }, "companyName": "Nightscout contributors", - "versionLabel": "2.1.1" + "versionLabel": "3.1.1" } + diff --git a/resources/images/batt10.png b/resources/images/batt10.png new file mode 100644 index 0000000000000000000000000000000000000000..e786bb5298f0371073501d0157c437938575547e GIT binary patch literal 1509 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 N002ovPDHLkV1fm3=xG1| literal 0 HcmV?d00001 diff --git a/resources/images/batt30.png b/resources/images/batt30.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf60bd433ae8d9d91bb91d3dc099b4c6f2f9586 GIT binary patch literal 1500 zcmV<21ta>2P)KLZ*U+@Om_!p#rO2g^M0T2_xn8WlYz|VRo{2h z7R-8~s+989_{5}@xj~v|SVK2!s&?S#%H<(|s_(lza_;?13gFuImGA%atf|SshSU>4 zvliI1kU9psYx^n$;})>zXy}KKc^2qW;}esR$pT&VC@uh9Q&Bt)bg9uwKV)3Mv>VkL zWafdMsYJe>h$9aGbd{thm1A3#Qr;@7=CtF=gx$wn|Iah)wwCoa0c(Sqkwd^%NF8ga zfl3^IVpoeJz>AQ&?1%XZuo+T+v}VR~z&1!fHLVVeMfmiqCmN$~0_z}MbHc&VIDf*M z8a^D=rq9eY4^?8!WjpAf1fGZV&4wHtiu`EQWT6Q3fVQd88i@I|gTdTLahc~tqklN! z(bPNDgJqx_wD(oBayas=osn*-67g#n{jeN+&=x&+cqrl&rVNTB%lWV|IuO;0-Ju$d zYsKWWb6_yW&--q9DDo!Gs#awz#$2tcVkzPge@kyH=F~UTs)a+q4$${=BvnPyWD1Fm z$9*g+l*nV@qi8aXgG&jCheY9|o@54R6KaTg@e5cCQ`T^W13>U$ckMe zEB1;Zu}|y~eOTf(@w(VA3L-1|#NKvoIiYV+=XRUtU0O&iDjXqyy1TWtqjyrh?bugN z-Fcw8`G{w^>?b(^0%qFC?aBTx&40I{!*N}ld+XZTOY};n7Us9#EY2PIq^1>?^14$oGct4Rf-m zlg<8;{WE(#`)T%U_V9}@3pVBZ?qq=wDZ~p?Fa3m_NDf1;;mNSkM`S> zOLQyoR-CoOHS^|1^98eDK4-pU4t4m<^=7X*U~VxB=EnBBCH0cMI85NSr@FFMgd4-d z;V2SCKou8{;}7kBTrD<q>F#F8d-?{zwzYCfM=KrKKRh9pVC`FsYz7{hN+RYZhJ zr9!Dx!Wcsk1OV7HO(_%#jK^aZiv`wN!Z1WtzZ$e0alL^D&5a%3OmfeL!1XX3T z*|6PiF~*>(FY#UW`#k`~Vv#6{IGs+|M>3boy%awL9)j;+?Y(Wk-)A2|xsas1C)TrL*?n$0EvX_~Uz?GO=+h^R4!!{P9;hpkqt zl*?u2^ErdTfGo@I)?KexYPA}TM&o055|J0{zXkx}m-i9}eiXz20000KLZ*U+@Om_!p#rO2g^M0T2_xn8WlYz|VRo{2h z7R-8~s+989_{5}@xj~v|SVK2!s&?S#%H<(|s_(lza_;?13gFuImGA%atf|SshSU>4 zvliI1kU9psYx^n$;})>zXy}KKc^2qW;}esR$pT&VC@uh9Q&Bt)bg9uwKV)3Mv>VkL zWafdMsYJe>h$9aGbd{thm1A3#Qr;@7=CtF=gx$wn|Iah)wwCoa0c(Sqkwd^%NF8ga zfl3^IVpoeJz>AQ&?1%XZuo+T+v}VR~z&1!fHLVVeMfmiqCmN$~0_z}MbHc&VIDf*M z8a^D=rq9eY4^?8!WjpAf1fGZV&4wHtiu`EQWT6Q3fVQd88i@I|gTdTLahc~tqklN! z(bPNDgJqx_wD(oBayas=osn*-67g#n{jeN+&=x&+cqrl&rVNTB%lWV|IuO;0-Ju$d zYsKWWb6_yW&--q9DDo!Gs#awz#$2tcVkzPge@kyH=F~UTs)a+q4$${=BvnPyWD1Fm z$9*g+l*nV@qi8aXgG&jCheY9|o@54R6KaTg@e5cCQ`T^W13>U$ckMe zEB1;Zu}|y~eOTf(@w(VA3L-1|#NKvoIiYV+=XRUtU0O&iDjXqyy1TWtqjyrh?bugN z-Fcw8`G{w^>?b(^0%qFC?aBTx&40I{!*N}ld+XZTOY};n7Us9#EY2PIq^1>?^14$oGct4Rf-m zlg<8;{WE(#`)T%U_V9}@3pVBZ?qq=wDZ~p?Fa3m_NDf1;;mNSkM`S> zOLQyoR-CoOHS^|1^98eDK4-pU4t4m<^=7X*U~VxB=EnBBCH0cMI85NSr@FFMgd4-d z;V2SCKou8{;}7kBTrD<q>F#F8d zL_t(|+N_gJjzK{bg}-{KCxj3`GXswamS9VUrbZTE4cLHPScAj}iJ8F*d0rHCZx2Lw z>vX68oXHu~%{g_>%|%4iIj7!xeI~s3I+;u~o6Rbq79b2m;yC7XIssse;V)2CM1)eQ zM4?c?7();Q0N5l+$mMd3MkD6)Io4XjFho^f1y-xouMEfIF@wPX=NxI8-i$;9Rb{Ig(P%ViwOVw$UE1w7olfV0ze{mGp8=@X>i{H4!gjkwL@*+v#u)bd{nHM%TrN{A z7Maav^!t6%G`&@Kxm>7JD%5JVr|n5Z9;$yC042Nl0$EBOFaQ7m07*qoM6N<$f>I~k AVE_OC literal 0 HcmV?d00001 diff --git a/resources/images/batt50.png b/resources/images/batt50.png new file mode 100644 index 0000000000000000000000000000000000000000..266d9f6050c078ba1daba38905055dfc25e1325b GIT binary patch literal 1512 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 AJOBUy literal 0 HcmV?d00001 diff --git a/resources/images/batt80.png b/resources/images/batt80.png new file mode 100644 index 0000000000000000000000000000000000000000..7e385be40176886fffb1565800efa0cf30572031 GIT binary patch literal 1491 zcmV;^1uXiBP)KLZ*U+@Om_!p#rO2g^M0T2_xn8WlYz|VRo{2h z7R-8~s+989_{5}@xj~v|SVK2!s&?S#%H<(|s_(lza_;?13gFuImGA%atf|SshSU>4 zvliI1kU9psYx^n$;})>zXy}KKc^2qW;}esR$pT&VC@uh9Q&Bt)bg9uwKV)3Mv>VkL zWafdMsYJe>h$9aGbd{thm1A3#Qr;@7=CtF=gx$wn|Iah)wwCoa0c(Sqkwd^%NF8ga zfl3^IVpoeJz>AQ&?1%XZuo+T+v}VR~z&1!fHLVVeMfmiqCmN$~0_z}MbHc&VIDf*M z8a^D=rq9eY4^?8!WjpAf1fGZV&4wHtiu`EQWT6Q3fVQd88i@I|gTdTLahc~tqklN! z(bPNDgJqx_wD(oBayas=osn*-67g#n{jeN+&=x&+cqrl&rVNTB%lWV|IuO;0-Ju$d zYsKWWb6_yW&--q9DDo!Gs#awz#$2tcVkzPge@kyH=F~UTs)a+q4$${=BvnPyWD1Fm z$9*g+l*nV@qi8aXgG&jCheY9|o@54R6KaTg@e5cCQ`T^W13>U$ckMe zEB1;Zu}|y~eOTf(@w(VA3L-1|#NKvoIiYV+=XRUtU0O&iDjXqyy1TWtqjyrh?bugN z-Fcw8`G{w^>?b(^0%qFC?aBTx&40I{!*N}ld+XZTOY};n7Us9#EY2PIq^1>?^14$oGct4Rf-m zlg<8;{WE(#`)T%U_V9}@3pVBZ?qq=wDZ~p?Fa3m_NDf1;;mNSkM`S> zOLQyoR-CoOHS^|1^98eDK4-pU4t4m<^=7X*U~VxB=EnBBCH0cMI85NSr@FFMgd4-d z;V2SCKou8{;}7kBTrD<q>F#F8dolXFV2(QS@P*tkc zD&=w+5us2h01zCHN8&hUG#as3EC_;tFbpxX&jRc9`YFTlcubNcIOoXo{AQ%8m>HYR zhV6EXh+t+f#k+R99RQ_LiB_vcmSqI@!zhX#y1HL{1!EB0%62*(X0sXI`!A#4cz=)2 z?h2sMXwYuA0Vw>H{GW+_8UlY$^dH@uOVgCqYW0ZDIrlbn*XtF4<#NezIOK3RAX%1K z9LEd>gU{z3MbXm+BEtE62B6>XlOzd~$%JmVi>e~3Y9hjZzkl0@t<`E&Di!AQIlW$w tJkM|FE|&}SdYxvo`L;c&>I3?Z0RVvt3R(4T1}p#o002ovPDHLkV1jI7-DLm( literal 0 HcmV?d00001 diff --git a/resources/images/batt90.png b/resources/images/batt90.png new file mode 100644 index 0000000000000000000000000000000000000000..02a5e2e863ecfcb2317f197fc42b342a30f351fa GIT binary patch literal 1489 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 X7(V0DUo{gV00000NkvXXu0mjfS6M8v literal 0 HcmV?d00001 diff --git a/resources/images/brokenantenna.png b/resources/images/brokenantenna.png new file mode 100644 index 0000000000000000000000000000000000000000..90ed898de6947661530315f16a611d83cf6d1212 GIT binary patch literal 2867 zcmWlb2{e>l7{}j{!bD06VUT5H_bFtn>|?7TlcnskXA0AVA}vyeP{uA)$WB5GqZ(q! zAX~&Bjmeswv3$34-h1yk_nh}G&-4HPo*Q$?%7h1g0uDhC56aZg8jL#s8s`DfYi$qR z0s|M;)IJD;4t@F8U@zql34=*-cT;Oi2nv;kpvVUhw7CaHCIp43K+qo-@M{VL2?QoO zQ;Z=9UWYQga2fw&HZ8*9WuI8DYsFL>p|mHDaGot=iJz3{V1 zoWEL0$x~ioxP>f+PIi#fdeFBz#u{kPsE8orl&XBvo7$7ii*|-Gx@f*wrB$b(c|N;&mTIKnOInGD;z)QuP$tD zZT$*URHjTnG8h+kNJKAO&?Fu~VfN;aV>Ri^oAh;7jx5|%|Bdy9yl!zhIrz<+H|-km zs`HJk8y=pX5@*hwal1CHY>DQ#>f<*WuM1+--dVmriW?4yjf<0sL=!PZZzyiAV7qFE zxfBK(jkd6~oN6Hm4~>rMmEbHqdhqfk=Wcfv4bkc1?}~~lf*4l8I2;?a5~@2fG4cH6 z%SWvFdfv9SHkA_unr}4(l?^;=ZoUv45|UF_Cp30~6 zylQB>D`pW~A~ii-KKHa=zryd|zbh*$5{SyqS?`sJR7zRn*3-?+&G&W+pPX?x^@#1i zt>uRJ7P521&KUtk2SezEXDYAWhB&W?rpn}FQLW%7b#--M4ob<$=(x*T+aZxz>kD4` z`fMQggp@8o2a)Mg01 zcPJSlg{{X%=Ife^Y2&y(Jw2!A=O0ttn$rUtV~|;RHgG<lp<-0{DhZr|1*DqS;!PN#Qn(;x5}rmoHm#HZfL z59{mihc|_Ugfy)7J90((`1mwn$3ImwdzxLIcb(hQfnCb$#twf7;C`e(vH8ZFn39}q z41H$?U#)Q4ui-yPj*4PSe(?f3RO$IbDyF-;yQ8hm6^%ZU9lnIpTkcS6m?^E7Me)JP z%geDZoD)Z?{RBd^L}A#UA467HI|&?m_(kzECwO4kxgXUc2n53BZDV5=RA60bhels0 z8!!i%$jOnwU@+Dt7&UeElqv0CnN6jI(O(jLl_69d6D+ zHKwrdj}L)y3dYOBqpGc)4%K4E^|N&DEGdtL)c@@0>Jpf;%FvX^vbD8EmtcB*tCt2V z+$Zi?TJm&WSA&&TR$6~wSl+aAbfoS-c>Kw9e7KTxV}=q@{uViGef~|e%PR$HaX~=} z?eF?ngz`scSJxcxLB~Ln^vRKt5ry2E@XcFn^h!^vcg-*=v1xnhV0P%AQ%7t|FjS)R zz0`E|fLyEmJWSD4t5}4H5Zy)PD+nQ*i?ubMwzf7hc=j)TW8#@IALQ=lR_oP;Nc=S% z*rXU4kI*$ULfZj(K;LIp{k^?k4a`h2vLlp!M@CDL(0j9{OYG|;(zr`lsN>x=gp;BSFj*;aa z7N)Hc@I&f6!C3Oy)2H~|?M-x}xw-i%6kk$e;>Ks*a}UL8L4ra_Sz4J^#ji_0XrlRz zV(smd>%dX_zkgTJ(n{mv;?lXdt?3-flvYKPmfGckB#x9n6HvYmBK)A4o`M5RK$i{J z0AVq{WsY-4kaNd6pE>-sbHStsi#o@g-@?)>FVCS#Y6NQ319An zBF~FQUXtb4b7>mmjc=7aaqi_87j`9WZQ*#`wZQ^0^F*m)hiW*1K#)~Zdfeub*261w z?AVzcDeVAD^Sti!`MojT7maulq_~=04l61udItnN%9Wkim5kSk`uI^xko&QZ*JT@9 zE#&^fc6OW(njs_fTOA92qx&GhFrgTn zT_nLcZ~DfyYu7j*>0c_me6;Z>Cp&FqBzA7NCa9=kSc51ltNdzwQ2^kEsxnyWF$?`>uV=a!TNd>^c|uk z0Pu_eX-DysJpb1EroHeGtg;fTl~7$>Jw8Es1`ur1TaK*n(F$8ru(7rViORmW#Z;Zj zv_b+xp7r`BQt{*~mFjL|(_3&$8#gPMq-fdN-rg=t{g2U+`gyW7-bBXHq3Svy6_D%f zpFezE4h{|}L?ZGbEUE2FiDS(Ypn=%rdRfos!XGc+wF9qMlnn@{hS%og+&9hx2CD*K zfnvQaAv`eP(&G5%$+!OF&}fA_hppVPY6nF>U*D5R2(N=k;FOY8jOVxt`+R}u7s>bcCG}K#v59c9Z_HM8 z!AY~d7tawIo-kHJ?XO-{h+L>+AXG7uTq5vC8}s!GOK;O}oP>_^^V25(UQN&BsQ>v* zd%o7d!ew=JHK`Q)kqpX0EP)^mDLK4<0-gy2xT2}A36gH<6t@cOKgds(YA;exU8fu7!8*Q%jceZCT? z#OHT_LXbesxg?TkW@hHevoQpMk-fc;y8qz6(i+X+Hmi+gBL;>Ss9k;uunK>&>me z-XjVUEDz?N=5%mU{Ua2`KDD96Yeloy0WQ83EHVM?#r}Kl=DmyJ+I@3oi+a!@aidHp z0|o{8Df&M*2>2KrtoP<{>@oZ=ciH4)3#ZzQgeH8%1Gb-bzZ1PYgX+EbpMS5l-}uPhk^dhG%jgH^l z;JtqS-(BxsWt)H49C!cb^>q&}S-!5EH~Z^W>m4bv*VStO>bCJ80lPc?PuKAeAb&h4 cKY5-(Hr{=CU%hY(Fc=v;UHx3vIVCg!0IbHBHUIzs literal 4602 zcmeAS@N?(olHy`uVBq!ia0vp^HXzIaBpBqUx2*$GoCO|{#S9GG!XV7ZFl&wk0|T=} zrn7TEKt_H^esM;Afr6*AvqC{pep+TuDg#5st>lD+c@JJZdU8tTz=42(kf0}WPb4G- zC6^wko7dReII|H16b*OoIAEx7pdG~4x7VM_C~9D2P_z5kffEM~94Lsqe(~tZsf{KF zX2k@A90Ce7G&Ua8P~B<))cuf~nc2Cj($kTXnK_wP zJ+oYaYM7gg>l{-9)2iG$n-(rzy0j_Tt1f7jQ$cE>XI9?Eru4X?x-QsPY*>|-Tv#T;UGc+?bGd43jGdL?b z+a6|WTg;O$aa1x^!do)j;9jy&GFQ^910{`-Gb|@nDt?w0^Pa{xEqYDWnzd`b-_W_a zY-4RQfBOBi3y)kp`mxn`;%BDm%Gbs6eBZI!1la^vwpOTr2S5odwDpoG*la z=n7bMf&XEgpy+04zE%OPB{WdLT{+{kX@~vyT zTD_{g@~2*3C9-1Hihm*2EAA~7T(xq^Psi5{-&E#?#A@3*?hXIt&LbvqP3ow`?O7*g z8_nKlvO8hl<)qH1EUT?v$IQ04?O+{Voz0%?E~{>ut}4zNUTMx+p2}b9AFD5%FD+kw zKVd)1|33}C4s<$tHHs${2TRr!8`R;d?yY+MaH#b|h*U4qttJT#U z^?V)t{G7`Czom7TT;F=TuUCotTV8w4cXo97`z!Z@_tig2yqCOD{rCLTeFBx0A4>m4 z|11}`GpRND`{&i`ruPr+S?lKhy8P?>$N%*VybSy%zovbR1!f$DWRDIK+t(9@R`#Fd-C;1{fkNh+>Tf7*WB5P&67~h_E1vH5y<<1rtKiNDMF* zg!e%#1qBEn*!DvL0uB()hYLu8SeOOK^)ed!yZ{yrC_)DB(X_z1^HJ1c=LnpKD@S1@ zU{{VVIv+(7g!3LX6wtLG@e?p~6ZS4byTN@_?ZkK&p<7@-vhDxNhRTi!eC> z8fT<<7oi*Caniht&@Hh3|NjI8msD0g(XmUa$)oB?4gp36hX4Pw8}?3ppUnUq#9?6Y MboFyt=akR{0Dfslf&c&j diff --git a/resources/images/down45.png b/resources/images/down45.png index 8bd49c117f70e93f8beeebeb8614d63de46a74f0..00d3a9099b80dc475fde468cd355caa5e1d63c7c 100644 GIT binary patch delta 1288 zcmV+j1^4>;Bf|=i85{-x0027t*>V5?00d`2O+f$v;QV1wEtUWP0{4+R8v;1Xkyjso z0Spq8iwhhB0(?O1y!^aW22{Yv!0_!Fh-6^6tP3)Wfi%FH473C8-r4y$sIz1(ija=@}&ohL)C=3XUoH zNvR6KmBl5gxy1^edCB=j1^GpZC8;TYK($aiK!DdJzeK@3F*8rW$Uv2W$^aCO5EdeQ z5Ml_BTv}8H4@w3G0R{yI0|p0%0ER?{dWHoIM;YEQiZi+}mNKqjyvHQQ6vQ-v=>oGb zb0qUZ<~J;sEFCPjSoK(2S?{q~vQ1Yln@Cf+ta?!Li(3I6#3^??(EmIm(%xfuE~oGC&s(kdz32ceF zNnyziDQi-1rgLOiWM*c~&Ayn+o@bw5QLw4-U9omaR_Us;Hx>GoB~`nBY8Y$1>ZaB| zY}9M2X+GO3*H+kmv{SmPsQYxUYF}gj-HA4nW>5Y*HGbOR85%SDXMLZOF!%I)^94&6 zi7aki@@-k>@_Q>oR-InsvUcBk%MIH$nQY#&)nwcD9acN{?{?jDc3;^32M2Qw{XEis zO#JwYlh&usok>3X>-?mDi`titUP-+A@A{mZHn;BHslTUu|HQ+*$6`k7RA@u(+JSAtFc5`dw-aOo7=aCdO<)t4gb`qWgNy(xFad0k`bBqD zgo3co_Qf&&B`YDcw4aqMc{B6tvedTmsq)jOLE^2BSHn zMPM{nv>1%$hzEy}94-bju@x z2d6dD*tXeh`ky%*4z$(1Xke5Yjdg6}`|X}Z_qZ1oj8dV0U$GcjfKdwcD;8ro`>rJc zquA)NAt@Ocr9>~6OZqE*CH>^V?uJocvW8hOt@)Mwqn1=?>Eo$%i|xn`DM@t&3}3 zT>DB2IsVmK!J$|rJUmy0xVkU8{BYV-`FW2jJ50;|Uz++fofMUR6vFMjWXzbL$ ym&@h<*kkAv)o;X?UImw41(#k0mtF;zoiTsX2z1uMHX^+M0000lD+c@JJZdU8tTz=42(kf0}WPb4G- zC6^wko7dReII|H16b*OoIAEx7pdG~4x7VM_C~9D2P_z5kffEM~94Lsqe(~tZsf{KF zX2k@A90Ce7G&Ua8P~B<))cuf~nc2Cj($kTXnK_wP zJ+oYaYM7gg>l{-9)2iG$n-(rzy0j_Tt1f7jQ$cE>XI9?Eru4X?x-QsPY*>|-Tv#T;UGc+?bGd43jGdL?b z+a6|WTg;O$aa1x^!do)j;9jy&GFQ^910{`-Gb|@nDt?w0^Pa{xEqYDWnzd`b-_W_a zY-4RQfBOBi3y)kp`mxn`;%BDm%Gbs6eBZI!1la^vwpOTr2S5odwDpoG*la z=n7bMf&XEgpy+04zE%OPB{WdLT{+{kX@~vyT zTD_{g@~2*3C9-1Hihm*2EAA~7T(xq^Psi5{-&E#?#A@3*?hXIt&LbvqP3ow`?O7*g z8_nKlvO8hl<)qH1EUT?v$IQ04?O+{Voz0%?E~{>ut}4zNUTMx+p2}b9AFD5%FD+kw zKVd)1|33}C4s<$tHHs${2TRr!8`R;d?yY+MaH#b|h*U4qttJT#U z^?V)t{G7`Czom7TT;F=TuUCotTV8w4cXo97`z!Z@_tig2yqCOD{rCLTeFBx0A4>m4 z|11}`GpRND`{&i`ruPr+S?lKhy8P?>$N%*VybSy%zovbR1!f$DWRDl2A*)UrykSvHA7*H8bGWEwCS0H4^~1bPJsS|KEXtUIrX?gY*)i8M|(f z-v7iDjo4fcj(LKv1}VUy`#w>cap>NUqL~SWhs3$y_yLIrW1@=T)XacY_XU_KU>dh( z?7C4j+inz#33433Ndrz0RFA9xoSxxY|DQ*eBg972`yVxpFyIX^ zf&B)k#y>#ivY>KNc*uG`TwplBa1c#1BZ_hq4p{Gn4-XzZd;rvn4dBrn@PXk1YFfr- kz^K@02+%GBfXVa!{}p%So_`g%QvtHZ)78&qol`;+07(|9od5s; diff --git a/resources/images/downdown.png b/resources/images/downdown.png index 3d05b335d1c39ab7d9e797eb7894a6a055e1c3d0..593b1f2444340879c1977698cf007dc38c3ab507 100644 GIT binary patch delta 438 zcmeyR{Em5oq%0c)1B2C{n?*p1v%n*=n1O-s2naJy)#j6)9L20x&sgH=;uunK>&>mZ zxy=S5tPi}eGTJn`f8feFz#-Qtn82czz;c6O#(^YeGXv>4c3ZuoJ$~$T$tvzUBFyzo z{heZv2NT05r^?CV+y_~N|C~SQIVs2PlF8nb$*Ga=Zn@w8zUMHDu#W*y4m(kQ@K>d{ zVCLJ1d?5*r3y^+?pvg> zLDl#20g2+1a&w9~6dm%!zua4`A9CIFn@Y=qzOr+Q$2b`7A7lu)zV(#SF^Q7ccI8gP zLzc@o@xT8oUM9H4FzQ-Vi$H;zlj$=JMOORp1mzh^`gw$`HvS*wKc5{ zQN1Xo``&ilnQ5~mljXuZP295IPyUhd?rKi<)F)>$B$F?g@XnjLbXIEQww+!@C0n-j zoS*vQ{H(WYC&|dJ)t2+CE`CyN_i%qEr`n8!CLr-3{a?rQ4}73ts8^L|X872e-YvG} TIPW=N)G&Cu`njxgN@xNA)=j(w literal 4602 zcmeAS@N?(olHy`uVBq!ia0vp^HXzIaBpBqUx2*$GoCO|{#S9GG!XV7ZFl&wk0|T=} zrn7TEKt_H^esM;Afr6*AvqC{pep+TuDg#5st>lD+c@JJZdU8tTz=42(kf0}WPb4G- zC6^wko7dReII|H16b*OoIAEx7pdG~4x7VM_C~9D2P_z5kffEM~94Lsqe(~tZsf{KF zX2k@A90Ce7G&Ua8P~B<))cuf~nc2Cj($kTXnK_wP zJ+oYaYM7gg>l{-9)2iG$n-(rzy0j_Tt1f7jQ$cE>XI9?Eru4X?x-QsPY*>|-Tv#T;UGc+?bGd43jGdL?b z+a6|WTg;O$aa1x^!do)j;9jy&GFQ^910{`-Gb|@nDt?w0^Pa{xEqYDWnzd`b-_W_a zY-4RQfBOBi3y)kp`mxn`;%BDm%Gbs6eBZI!1la^vwpOTr2S5odwDpoG*la z=n7bMf&XEgpy+04zE%OPB{WdLT{+{kX@~vyT zTD_{g@~2*3C9-1Hihm*2EAA~7T(xq^Psi5{-&E#?#A@3*?hXIt&LbvqP3ow`?O7*g z8_nKlvO8hl<)qH1EUT?v$IQ04?O+{Voz0%?E~{>ut}4zNUTMx+p2}b9AFD5%FD+kw zKVd)1|33}C4s<$tHHs${2TRr!8`R;d?yY+MaH#b|h*U4qttJT#U z^?V)t{G7`Czom7TT;F=TuUCotTV8w4cXo97`z!Z@_tig2yqCOD{rCLTeFBx0A4>m4 z|11}`GpRND`{&i`ruPr+S?lKhy8P?>$N%*VybSy%zovbR1!f$DWRDyc_OBxXHK0YkuhBw+;eJg|+& zz%U;nfM6xS^)fIRVAFkG0HPuRp$E!(?|`J2fkEIrhKl)6y$l!*yAO5|l70-o^&?55 zIt=C_Bn4=GOF))FaTvly$V!m>hUO`tx8Q+3A6W|$8y@KI(LDuJG#?Tu2}tTunNYuB z^ArOE$YJjTP&J_Nz=6IV9?U3mz(B|5A|y3Hzv1!}Fg4&X6`|h&!5n3ch5!*Ez{tSx Y|NqufsdsLxtiZ|3)78&qol`;+0Nc-`E&u=k diff --git a/resources/images/flat.png b/resources/images/flat.png index 7daecc06ff5619b09f0919219dd7fbe2920c72fa..0cf6ac85590b5a30153d596acab043a719170526 100644 GIT binary patch delta 1224 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 diff --git a/resources/images/hourglass.png b/resources/images/hourglass.png new file mode 100644 index 0000000000000000000000000000000000000000..422fd64d8e6b7493ca4d6a69d8c7fd73c7fce7b5 GIT binary patch literal 1807 zcmV+q2k`ibP)U8P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4n162kpgNVo|1qcff zJ_s=cNG>fZg9jx8g8+j9g8_pBLjXe}Lp{R+hNBE`7{wV~7)u#fFy3PlV+vxLz;uCG zm^qSpA@ds+OO_6nTdaDlt*rOhEZL^9ePa)2-_4=K(Z%tFGm-NGmm}8}ZcXk5JW@PU zd4+f<@d@)yL(o<5icqT158+-B6_LH7;i6x}CW#w~Uy-Pgl#@Irl`kzV zeL|*8R$ca%T%Wv){2zs_iiJvgN^h0dsuZZ2sQy$tsNSU!s;Q*;LF<6_B%M@UD?LHI zSNcZ`78uqV#TeU~$eS{ozBIdFzSClfs*^S+dw;4dus<{M;#|MXC)T}S9v!D zcV!QCPhBq)ZyO(X-(bH4|NMaZz==UigLj2o41F2S6d@OB6%`R(5i>J(Puzn9wnW{e zu;hl6HK{k#IWjCVGqdJqU(99Cv(K+6*i`tgSi2;vbXD1#3jNBGs$DgVwO(~o>mN4i zHPtkqZIx>)Y(Ls5-Br|mx>vQYvH$Kwn@O`L|D75??eGkZnfg$5<;Xeg_o%+-I&+-3%01W^SH2RkDT>t<8AY({UO#lFTB>(_`g8%^e z{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZI*G=-nZ79KoD1`Yd+(cX&OPUzd+rI!zakNIz#Z^^44g|h z?Ofv@20#K5ntJB?V|ud#*VxZH$;8mWNl5T>;Fua+Y-1PY6yUIQ0GXtFNqb35M2=~y ze9q0;Xk6qe_9Z_*e|hJgIV2)N;BkghEp<3F2oRd|4(xwmcXWh8qumzgQH`R*y+V-+9rW&7lI9Am@{ z;wB3Y`lOR>IakZzx7;XVuN&+)7O(fn@`GQqC>HIp+x7NYcBMJ<4m;B#xFs8pu!|Xb zh@0|E>EjBXW%u$q*FN?TQ=q;e#g#m(d6_*efl~*N^9*s80ud1rfhh(UBS(Q4$Wh}Q z#~T?+h8n-ZSwJ9A|4CPUGGw1`Dnb@ov9TPy3KL^RD)4E3R^_ zKV|LJ$E}F5Iq@0~dQq(>r|~AS-!)e3ax`nNp5!7>qsneR;Xzh3oa+wWXP9v&$Wdb| zYa7?70y$pf0BaVE4e$(ysB-~YNa$07XVdR(JhsUA?L5jD)7e)9*0Y1dY~gEuYpMWT z+Rr5h7-WDQ*_R@E*~|$(Lt;$s!gKe;K%m5SVt%BO-FB+`s%0bd1~DWpYP5nSyX>*g zD=m5;8mb$=x-X)h@Or2+678GB~+`_e4#_F-es?ndo xG)hl_It9A2J|sFN#SXXw?tnYs{~!2|0RYRzH<%CoOxyqf002ovPDHLkV1jD7Fq!}W literal 0 HcmV?d00001 diff --git a/resources/images/logo.png b/resources/images/logo.png index 2e2d18c85e74c6d5d525fb2798e0ec22266276a0..17f96a46cf655648db28b80de4aa40ef4ee7b34b 100644 GIT binary patch literal 3462 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 literal 4833 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 AjsO4v diff --git a/resources/images/menuicon.png b/resources/images/menuicon.png new file mode 100644 index 0000000000000000000000000000000000000000..17f96a46cf655648db28b80de4aa40ef4ee7b34b GIT binary patch literal 3462 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 literal 0 HcmV?d00001 diff --git a/resources/images/none.png b/resources/images/none.png index bda52a3035c125818668fee6f7ca706ade45763d..a81333320a7990d5959d82c242e32f8b0c1d9891 100644 GIT binary patch delta 899 zcmdnbevo~FqzoGa1B2C{n?*p1CEd~2k%8gCpTq#&X$%ZZ-zQp0Gg+LT7%pGW$Rjkl zn_GsNsm9^WoM?ZK<`HBzBbFg4y`9C9`KB%pkB^P&N>PQqJm-G0PIaC6Qc{(xZQ8VHTz#59 zJy&uaoO)Ds<<6sA^D0mNbY=bN+Nruyv)*BAfVD%zb=CbY2W<_F{STgSnA&)XL8MPW zOsPg7iDN=cR0tct7aJQR8!H<#8+#i=n@d|&8!L~yRjMgRWIj(X{}b8+`$?sTQ+ta|S2bnnc% z!(Csoq+;18u8)3?grChmrhj;UgoArR`-0UEL>GoEls~jrNlU5P^|0&y4qqX2q5VpM zikj+`K3efnQNLPzX0F-wMt7%OrT9;Ku4qy2sb8kt(^?;@8DJXtcV$_?UT@`)V9(FZ z*BIY=TCLm_R@GFs{!71vj=>t!F2il66U|f2YBS5~57sO{Ds-ANtn}JWv%+nSW$V6O z<2%-8<(GBNOOI>ar#!BAr{rGE+ZCsF&&=-KzJqm~|9&!lZ4_>v#`d0Tr^GL#Ihsy- zm$bB$b}6N$y_vUzoinF%muKQhUd`;F{AI-{5h-bDXV31Nae7|*{P@5PD?h|;Eb|O| zxoVTS=&z}&p}Xs|B(nFuT6WDo=SudfOuO4!*TZhqZ3*7Bdd2UO^;z-B|L=C1O-}Rw zXKh+{>!GBS@$dB7`I8O4f2sM*>Mh=>lNb9bH}cu1YHjDRxp9v-mEEs8&3oHyX3o7$ zS5t0(lMS=}{=V#PaasJ0f9&kVe1B~&)%pDS(KY$n@^f=N?S8-hv!uTJ*7UwO&pp51 z|C%$~Z2P-=EB7z2`G4f_p5saW-|SDFVdQ&MBb@0D6L->i_@% delta 948 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

v$JVgc zJOi!LXA(cu+RaI5w^?Ktht<&jJ&eEda!yL!q)~#EJL?SqL>=?Sby0Bx% z4(RoIc)eZ>4GrP(+8eB!~~Q|C3f%Ljg1>O0{FY0 zovMQS{~B5{41+IUzTo`%^XTvIM>rftR#p~*!62?*zmCnDH>0(+H6a&H%Oec{!^6Wk zaNqz0LBPqAC$WG3ekhen2!eotfdRC&wV}Sg9#*RrCX-3r#fZ()UayzR%gd>xq=Y_x z{7BJgG-2G#%na4m)>2+x9*vHUruUbJo}M0zj*h}+vtj-E^+|Qtu3d|J_wIpV7__&y zr)P;LMm~1C9c5)@*tKidlFX~u>rq=2%A|)$8?`ot;H6 z7))Sm$tMr71(ubSVQg${SqmN+89`xTVbWMSZITDG*^G&aiA5jDh$vwLTrL*|1_sd5 z(gL366WS(Hc14NJ(!pSm8X6iXH#e7hdU}$Md-LWE6%`dxX=!Pkjm2VV(eGioTn?+% zik6lZG&eWn?%lhnudhdOaWTGr{R*ek3A^2nf`S5ccXvah(TG}?7R|y=r*qM}Kp;RC zi-imZ1LfuAkxHeayu3WBtgNIk2QpfC9$5X7>UJd zTt9v{7OP;F)Q3rGCRp|1Rluu&R{^gA{zv{A0BdhFH(6q^%>V!Z07*qoM6N<$f*_)U AZ2$lO literal 0 HcmV?d00001 diff --git a/resources/images/up.png b/resources/images/up.png index d522dbce52c16abfc1f5f071337b901b71d63c2c..ea1b3c096794aa22668744746d54db5bf411586d 100644 GIT binary patch delta 1121 zcmV-n1fKi)Bb^D585{-x0027t*>V5?00d`2O+f$v;QV1wEtUWP0{4+R8v;1Xkyjso z0Spq8iwhhB0(?O1y!^aW22{Yv!0_!Fh-6^6tP3)Wfi%FH473C8-r4y$sIz1(ija=@}&ohL)C=3XUoH zNvR6KmBl5gxy1^edCB=j1^GpZC8;TYK($aiK!DdJzeK@3F*8rW$Uv2W$^aCO5EdeQ z5Ml_BTv}8H4@w3G0R{yI0|p0%0ER?{dWHoIM;YEQiZi+}mNKqjyvHQQ6vQ-v=>oGb zb0qUZ<~J;sEFCPjSoK(2S?{q~vQ1Yln@Cf+ta?!Li(3I6#3^??(EmIm(%xfuE~oGC&s(kdz32ceF zNnyziDQi-1rgLOiWM*c~&Ayn+o@bw5QLw4-U9omaR_Us;Hx>GoB~`nBY8Y$1>ZaB| zY}9M2X+GO3*H+kmv{SmPsQYxUYF}gj-HA4nW>5Y*HGbOR85%SDXMLZOF!%I)^94&6 zi7aki@@-k>@_Q>oR-InsvUcBk%MIH$nQY#&)nwcD9acN{?{?jDc3;^32M2Qw{XEis zO#JwYlh&usok>3X>-?mDi`titUP-+A@A{mZHn;BHslTUu|HQ+*$6`q6kmZG+S%mvg^qDm;@Id$8k>6bW`>f*)Bgy41x-`ZTmcRwYH zjSNRH;dQ_6N$9?RRu}%(ufCD-p-ypCVV{2Wjnt8P+NcTd=~v%KJ*lgSity2X^^Mfm z;*_vPzxqb2uMZ1r_N#AXe`o)?R4-aBE;i(4jCo6h`M_!p1xRB+Lo2Tfj<`00000NkvXXu0mjf74-*4 literal 4602 zcmeAS@N?(olHy`uVBq!ia0vp^HXzIaBpBqUx2*$GoCO|{#S9GG!XV7ZFl&wk0|T=} zrn7TEKt_H^esM;Afr6*AvqC{pep+TuDg#5st>lD+c@JJZdU8tTz=42(kf0}WPb4G- zC6^wko7dReII|H16b*OoIAEx7pdG~4x7VM_C~9D2P_z5kffEM~94Lsqe(~tZsf{KF zX2k@A90Ce7G&Ua8P~B<))cuf~nc2Cj($kTXnK_wP zJ+oYaYM7gg>l{-9)2iG$n-(rzy0j_Tt1f7jQ$cE>XI9?Eru4X?x-QsPY*>|-Tv#T;UGc+?bGd43jGdL?b z+a6|WTg;O$aa1x^!do)j;9jy&GFQ^910{`-Gb|@nDt?w0^Pa{xEqYDWnzd`b-_W_a zY-4RQfBOBi3y)kp`mxn`;%BDm%Gbs6eBZI!1la^vwpOTr2S5odwDpoG*la z=n7bMf&XEgpy+04zE%OPB{WdLT{+{kX@~vyT zTD_{g@~2*3C9-1Hihm*2EAA~7T(xq^Psi5{-&E#?#A@3*?hXIt&LbvqP3ow`?O7*g z8_nKlvO8hl<)qH1EUT?v$IQ04?O+{Voz0%?E~{>ut}4zNUTMx+p2}b9AFD5%FD+kw zKVd)1|33}C4s<$tHHs${2TRr!8`R;d?yY+MaH#b|h*U4qttJT#U z^?V)t{G7`Czom7TT;F=TuUCotTV8w4cXo97`z!Z@_tig2yqCOD{rCLTeFBx0A4>m4 z|11}`GpRND`{&i`ruPr+S?lKhy8P?>$N%*VybSy%zovbR1!f$DWRDT#fVkpM{^hk6&G zeLnF{hkF;H`@8~?9!K&nLic+IqI9Er7ooj?uxk(Rjta_-6 z(ZigHuul*wJ|LK27D<}X^fHWUMh_7J{Lug-5J2eCqXC8e?4cL}j0_C_|I0cb6PSDEK_18hp00i_>zopr0R8Jv-~a#s diff --git a/resources/images/up45.png b/resources/images/up45.png index bab14c6927bdf41074d5efa7f21f7a75c229ed38..2e0e4ed34fcb2bdf35afdf94ebe4ac1f62821a08 100644 GIT binary patch delta 1294 zcmV+p1@Zd&BgqPo85{-x0027t*>V5?00d`2O+f$v;QV1wEtUWP0{4+R8v;1Xkyjso z0Spq8iwhhB0(?O1y!^aW22{Yv!0_!Fh-6^6tP3)Wfi%FH473C8-r4y$sIz1(ija=@}&ohL)C=3XUoH zNvR6KmBl5gxy1^edCB=j1^GpZC8;TYK($aiK!DdJzeK@3F*8rW$Uv2W$^aCO5EdeQ z5Ml_BTv}8H4@w3G0R{yI0|p0%0ER?{dWHoIM;YEQiZi+}mNKqjyvHQQ6vQ-v=>oGb zb0qUZ<~J;sEFCPjSoK(2S?{q~vQ1Yln@Cf+ta?!Li(3I6#3^??(EmIm(%xfuE~oGC&s(kdz32ceF zNnyziDQi-1rgLOiWM*c~&Ayn+o@bw5QLw4-U9omaR_Us;Hx>GoB~`nBY8Y$1>ZaB| zY}9M2X+GO3*H+kmv{SmPsQYxUYF}gj-HA4nW>5Y*HGbOR85%SDXMLZOF!%I)^94&6 zi7aki@@-k>@_Q>oR-InsvUcBk%MIH$nQY#&)nwcD9acN{?{?jDc3;^32M2Qw{XEis zO#JwYlh&usok>3X>-?mDi`titUP-+A@A{mZHn;BHslTUu|HQ+*$6`~$b#DQz z+2L@&1I!-Ho=`V`4@SM&Z0gJ9LR;gf4o2JUwio3(_WM0;iC+{j8iK}5ON(}vuBys3 zXu79Y)TbqTV&aA~zBrm`^_m&(-CbRWv?$=ASPbczT78%P^jxf!D%dCX@p#Y@FEz05 znSHBcU~OHrlD+c@JJZdU8tTz=42(kf0}WPb4G- zC6^wko7dReII|H16b*OoIAEx7pdG~4x7VM_C~9D2P_z5kffEM~94Lsqe(~tZsf{KF zX2k@A90Ce7G&Ua8P~B<))cuf~nc2Cj($kTXnK_wP zJ+oYaYM7gg>l{-9)2iG$n-(rzy0j_Tt1f7jQ$cE>XI9?Eru4X?x-QsPY*>|-Tv#T;UGc+?bGd43jGdL?b z+a6|WTg;O$aa1x^!do)j;9jy&GFQ^910{`-Gb|@nDt?w0^Pa{xEqYDWnzd`b-_W_a zY-4RQfBOBi3y)kp`mxn`;%BDm%Gbs6eBZI!1la^vwpOTr2S5odwDpoG*la z=n7bMf&XEgpy+04zE%OPB{WdLT{+{kX@~vyT zTD_{g@~2*3C9-1Hihm*2EAA~7T(xq^Psi5{-&E#?#A@3*?hXIt&LbvqP3ow`?O7*g z8_nKlvO8hl<)qH1EUT?v$IQ04?O+{Voz0%?E~{>ut}4zNUTMx+p2}b9AFD5%FD+kw zKVd)1|33}C4s<$tHHs${2TRr!8`R;d?yY+MaH#b|h*U4qttJT#U z^?V)t{G7`Czom7TT;F=TuUCotTV8w4cXo97`z!Z@_tig2yqCOD{rCLTeFBx0A4>m4 z|11}`GpRND`{&i`ruPr+S?lKhy8P?>$N%*VybSy%zovbR1!f$DWRDg9iu!3>F^E3<>i=%0FCSIKXg_;lc+Dz4!&{|09F@``0_*SC1+? zA6YYy-H$3wfQP1gKLO=v(x|#g)SQ6oa5SUwbJ6qyOGe@Wy59c|6zC;EGlsqY{}-Ux z%!I;2;Xo1?iVy=oDi!w-UM(; zRls2zLKv%F1_qFB2ZSo@EF5~lx&yFlfs5kQ3({Q=SB8~=M=ww}{^9_yUIvB)tQJBA z3FyVAm0?ux|NnRc7b)}%P|Ha$k669HD8$fByk1P*r07N0O`2X*-K6S8)=j!zgl=;5 z!gQ0T7owY7y&&DFl?nq%z=0&yql$-p2mo8X|NmG2jLFsE+@AyTt*5J>%Q~loCIAXu B<=y}Q diff --git a/resources/images/upup.png b/resources/images/upup.png index 19e4e8d86276a0b8d742d439bd178ebe56a4feda..1e12c091447b0fe777464ac7f31086516de1e2c9 100644 GIT binary patch delta 1214 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 N002ovPDHLkV1fm3=xG1| literal 0 HcmV?d00001 diff --git a/resources/img/batt30.png b/resources/img/batt30.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf60bd433ae8d9d91bb91d3dc099b4c6f2f9586 GIT binary patch literal 1500 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 AVE_OC literal 0 HcmV?d00001 diff --git a/resources/img/batt50.png b/resources/img/batt50.png new file mode 100644 index 0000000000000000000000000000000000000000..266d9f6050c078ba1daba38905055dfc25e1325b GIT binary patch literal 1512 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 AJOBUy literal 0 HcmV?d00001 diff --git a/resources/img/batt80.png b/resources/img/batt80.png new file mode 100644 index 0000000000000000000000000000000000000000..7e385be40176886fffb1565800efa0cf30572031 GIT binary patch literal 1491 zcmV;^1uXiBP)KLZ*U+@Om_!p#rO2g^M0T2_xn8WlYz|VRo{2h z7R-8~s+989_{5}@xj~v|SVK2!s&?S#%H<(|s_(lza_;?13gFuImGA%atf|SshSU>4 zvliI1kU9psYx^n$;})>zXy}KKc^2qW;}esR$pT&VC@uh9Q&Bt)bg9uwKV)3Mv>VkL zWafdMsYJe>h$9aGbd{thm1A3#Qr;@7=CtF=gx$wn|Iah)wwCoa0c(Sqkwd^%NF8ga zfl3^IVpoeJz>AQ&?1%XZuo+T+v}VR~z&1!fHLVVeMfmiqCmN$~0_z}MbHc&VIDf*M z8a^D=rq9eY4^?8!WjpAf1fGZV&4wHtiu`EQWT6Q3fVQd88i@I|gTdTLahc~tqklN! z(bPNDgJqx_wD(oBayas=osn*-67g#n{jeN+&=x&+cqrl&rVNTB%lWV|IuO;0-Ju$d zYsKWWb6_yW&--q9DDo!Gs#awz#$2tcVkzPge@kyH=F~UTs)a+q4$${=BvnPyWD1Fm z$9*g+l*nV@qi8aXgG&jCheY9|o@54R6KaTg@e5cCQ`T^W13>U$ckMe zEB1;Zu}|y~eOTf(@w(VA3L-1|#NKvoIiYV+=XRUtU0O&iDjXqyy1TWtqjyrh?bugN z-Fcw8`G{w^>?b(^0%qFC?aBTx&40I{!*N}ld+XZTOY};n7Us9#EY2PIq^1>?^14$oGct4Rf-m zlg<8;{WE(#`)T%U_V9}@3pVBZ?qq=wDZ~p?Fa3m_NDf1;;mNSkM`S> zOLQyoR-CoOHS^|1^98eDK4-pU4t4m<^=7X*U~VxB=EnBBCH0cMI85NSr@FFMgd4-d z;V2SCKou8{;}7kBTrD<q>F#F8dolXFV2(QS@P*tkc zD&=w+5us2h01zCHN8&hUG#as3EC_;tFbpxX&jRc9`YFTlcubNcIOoXo{AQ%8m>HYR zhV6EXh+t+f#k+R99RQ_LiB_vcmSqI@!zhX#y1HL{1!EB0%62*(X0sXI`!A#4cz=)2 z?h2sMXwYuA0Vw>H{GW+_8UlY$^dH@uOVgCqYW0ZDIrlbn*XtF4<#NezIOK3RAX%1K z9LEd>gU{z3MbXm+BEtE62B6>XlOzd~$%JmVi>e~3Y9hjZzkl0@t<`E&Di!AQIlW$w tJkM|FE|&}SdYxvo`L;c&>I3?Z0RVvt3R(4T1}p#o002ovPDHLkV1jI7-DLm( literal 0 HcmV?d00001 diff --git a/resources/img/batt90.png b/resources/img/batt90.png new file mode 100644 index 0000000000000000000000000000000000000000..02a5e2e863ecfcb2317f197fc42b342a30f351fa GIT binary patch literal 1489 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 X7(V0DUo{gV00000NkvXXu0mjfS6M8v literal 0 HcmV?d00001 diff --git a/resources/img/brokenantenna.png b/resources/img/brokenantenna.png new file mode 100644 index 0000000000000000000000000000000000000000..90ed898de6947661530315f16a611d83cf6d1212 GIT binary patch literal 2867 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 literal 4602 zcmeAS@N?(olHy`uVBq!ia0vp^HXzIaBpBqUx2*$GoCO|{#S9GG!XV7ZFl&wk0|T=} zrn7TEKt_H^esM;Afr6*AvqC{pep+TuDg#5st>lD+c@JJZdU8tTz=42(kf0}WPb4G- zC6^wko7dReII|H16b*OoIAEx7pdG~4x7VM_C~9D2P_z5kffEM~94Lsqe(~tZsf{KF zX2k@A90Ce7G&Ua8P~B<))cuf~nc2Cj($kTXnK_wP zJ+oYaYM7gg>l{-9)2iG$n-(rzy0j_Tt1f7jQ$cE>XI9?Eru4X?x-QsPY*>|-Tv#T;UGc+?bGd43jGdL?b z+a6|WTg;O$aa1x^!do)j;9jy&GFQ^910{`-Gb|@nDt?w0^Pa{xEqYDWnzd`b-_W_a zY-4RQfBOBi3y)kp`mxn`;%BDm%Gbs6eBZI!1la^vwpOTr2S5odwDpoG*la z=n7bMf&XEgpy+04zE%OPB{WdLT{+{kX@~vyT zTD_{g@~2*3C9-1Hihm*2EAA~7T(xq^Psi5{-&E#?#A@3*?hXIt&LbvqP3ow`?O7*g z8_nKlvO8hl<)qH1EUT?v$IQ04?O+{Voz0%?E~{>ut}4zNUTMx+p2}b9AFD5%FD+kw zKVd)1|33}C4s<$tHHs${2TRr!8`R;d?yY+MaH#b|h*U4qttJT#U z^?V)t{G7`Czom7TT;F=TuUCotTV8w4cXo97`z!Z@_tig2yqCOD{rCLTeFBx0A4>m4 z|11}`GpRND`{&i`ruPr+S?lKhy8P?>$N%*VybSy%zovbR1!f$DWRDIK+t(9@R`#Fd-C;1{fkNh+>Tf7*WB5P&67~h_E1vH5y<<1rtKiNDMF* zg!e%#1qBEn*!DvL0uB()hYLu8SeOOK^)ed!yZ{yrC_)DB(X_z1^HJ1c=LnpKD@S1@ zU{{VVIv+(7g!3LX6wtLG@e?p~6ZS4byTN@_?ZkK&p<7@-vhDxNhRTi!eC> z8fT<<7oi*Caniht&@Hh3|NjI8msD0g(XmUa$)oB?4gp36hX4Pw8}?3ppUnUq#9?6Y MboFyt=akR{0Dfslf&c&j diff --git a/resources/img/down45.png b/resources/img/down45.png index 8bd49c117f70e93f8beeebeb8614d63de46a74f0..00d3a9099b80dc475fde468cd355caa5e1d63c7c 100644 GIT binary patch delta 1288 zcmV+j1^4>;Bf|=i85{-x0027t*>V5?00d`2O+f$v;QV1wEtUWP0{4+R8v;1Xkyjso z0Spq8iwhhB0(?O1y!^aW22{Yv!0_!Fh-6^6tP3)Wfi%FH473C8-r4y$sIz1(ija=@}&ohL)C=3XUoH zNvR6KmBl5gxy1^edCB=j1^GpZC8;TYK($aiK!DdJzeK@3F*8rW$Uv2W$^aCO5EdeQ z5Ml_BTv}8H4@w3G0R{yI0|p0%0ER?{dWHoIM;YEQiZi+}mNKqjyvHQQ6vQ-v=>oGb zb0qUZ<~J;sEFCPjSoK(2S?{q~vQ1Yln@Cf+ta?!Li(3I6#3^??(EmIm(%xfuE~oGC&s(kdz32ceF zNnyziDQi-1rgLOiWM*c~&Ayn+o@bw5QLw4-U9omaR_Us;Hx>GoB~`nBY8Y$1>ZaB| zY}9M2X+GO3*H+kmv{SmPsQYxUYF}gj-HA4nW>5Y*HGbOR85%SDXMLZOF!%I)^94&6 zi7aki@@-k>@_Q>oR-InsvUcBk%MIH$nQY#&)nwcD9acN{?{?jDc3;^32M2Qw{XEis zO#JwYlh&usok>3X>-?mDi`titUP-+A@A{mZHn;BHslTUu|HQ+*$6`k7RA@u(+JSAtFc5`dw-aOo7=aCdO<)t4gb`qWgNy(xFad0k`bBqD zgo3co_Qf&&B`YDcw4aqMc{B6tvedTmsq)jOLE^2BSHn zMPM{nv>1%$hzEy}94-bju@x z2d6dD*tXeh`ky%*4z$(1Xke5Yjdg6}`|X}Z_qZ1oj8dV0U$GcjfKdwcD;8ro`>rJc zquA)NAt@Ocr9>~6OZqE*CH>^V?uJocvW8hOt@)Mwqn1=?>Eo$%i|xn`DM@t&3}3 zT>DB2IsVmK!J$|rJUmy0xVkU8{BYV-`FW2jJ50;|Uz++fofMUR6vFMjWXzbL$ ym&@h<*kkAv)o;X?UImw41(#k0mtF;zoiTsX2z1uMHX^+M0000lD+c@JJZdU8tTz=42(kf0}WPb4G- zC6^wko7dReII|H16b*OoIAEx7pdG~4x7VM_C~9D2P_z5kffEM~94Lsqe(~tZsf{KF zX2k@A90Ce7G&Ua8P~B<))cuf~nc2Cj($kTXnK_wP zJ+oYaYM7gg>l{-9)2iG$n-(rzy0j_Tt1f7jQ$cE>XI9?Eru4X?x-QsPY*>|-Tv#T;UGc+?bGd43jGdL?b z+a6|WTg;O$aa1x^!do)j;9jy&GFQ^910{`-Gb|@nDt?w0^Pa{xEqYDWnzd`b-_W_a zY-4RQfBOBi3y)kp`mxn`;%BDm%Gbs6eBZI!1la^vwpOTr2S5odwDpoG*la z=n7bMf&XEgpy+04zE%OPB{WdLT{+{kX@~vyT zTD_{g@~2*3C9-1Hihm*2EAA~7T(xq^Psi5{-&E#?#A@3*?hXIt&LbvqP3ow`?O7*g z8_nKlvO8hl<)qH1EUT?v$IQ04?O+{Voz0%?E~{>ut}4zNUTMx+p2}b9AFD5%FD+kw zKVd)1|33}C4s<$tHHs${2TRr!8`R;d?yY+MaH#b|h*U4qttJT#U z^?V)t{G7`Czom7TT;F=TuUCotTV8w4cXo97`z!Z@_tig2yqCOD{rCLTeFBx0A4>m4 z|11}`GpRND`{&i`ruPr+S?lKhy8P?>$N%*VybSy%zovbR1!f$DWRDl2A*)UrykSvHA7*H8bGWEwCS0H4^~1bPJsS|KEXtUIrX?gY*)i8M|(f z-v7iDjo4fcj(LKv1}VUy`#w>cap>NUqL~SWhs3$y_yLIrW1@=T)XacY_XU_KU>dh( z?7C4j+inz#33433Ndrz0RFA9xoSxxY|DQ*eBg972`yVxpFyIX^ zf&B)k#y>#ivY>KNc*uG`TwplBa1c#1BZ_hq4p{Gn4-XzZd;rvn4dBrn@PXk1YFfr- kz^K@02+%GBfXVa!{}p%So_`g%QvtHZ)78&qol`;+07(|9od5s; diff --git a/resources/img/downdown.png b/resources/img/downdown.png index 3d05b335d1c39ab7d9e797eb7894a6a055e1c3d0..593b1f2444340879c1977698cf007dc38c3ab507 100644 GIT binary patch delta 438 zcmeyR{Em5oq%0c)1B2C{n?*p1v%n*=n1O-s2naJy)#j6)9L20x&sgH=;uunK>&>mZ zxy=S5tPi}eGTJn`f8feFz#-Qtn82czz;c6O#(^YeGXv>4c3ZuoJ$~$T$tvzUBFyzo z{heZv2NT05r^?CV+y_~N|C~SQIVs2PlF8nb$*Ga=Zn@w8zUMHDu#W*y4m(kQ@K>d{ zVCLJ1d?5*r3y^+?pvg> zLDl#20g2+1a&w9~6dm%!zua4`A9CIFn@Y=qzOr+Q$2b`7A7lu)zV(#SF^Q7ccI8gP zLzc@o@xT8oUM9H4FzQ-Vi$H;zlj$=JMOORp1mzh^`gw$`HvS*wKc5{ zQN1Xo``&ilnQ5~mljXuZP295IPyUhd?rKi<)F)>$B$F?g@XnjLbXIEQww+!@C0n-j zoS*vQ{H(WYC&|dJ)t2+CE`CyN_i%qEr`n8!CLr-3{a?rQ4}73ts8^L|X872e-YvG} TIPW=N)G&Cu`njxgN@xNA)=j(w literal 4602 zcmeAS@N?(olHy`uVBq!ia0vp^HXzIaBpBqUx2*$GoCO|{#S9GG!XV7ZFl&wk0|T=} zrn7TEKt_H^esM;Afr6*AvqC{pep+TuDg#5st>lD+c@JJZdU8tTz=42(kf0}WPb4G- zC6^wko7dReII|H16b*OoIAEx7pdG~4x7VM_C~9D2P_z5kffEM~94Lsqe(~tZsf{KF zX2k@A90Ce7G&Ua8P~B<))cuf~nc2Cj($kTXnK_wP zJ+oYaYM7gg>l{-9)2iG$n-(rzy0j_Tt1f7jQ$cE>XI9?Eru4X?x-QsPY*>|-Tv#T;UGc+?bGd43jGdL?b z+a6|WTg;O$aa1x^!do)j;9jy&GFQ^910{`-Gb|@nDt?w0^Pa{xEqYDWnzd`b-_W_a zY-4RQfBOBi3y)kp`mxn`;%BDm%Gbs6eBZI!1la^vwpOTr2S5odwDpoG*la z=n7bMf&XEgpy+04zE%OPB{WdLT{+{kX@~vyT zTD_{g@~2*3C9-1Hihm*2EAA~7T(xq^Psi5{-&E#?#A@3*?hXIt&LbvqP3ow`?O7*g z8_nKlvO8hl<)qH1EUT?v$IQ04?O+{Voz0%?E~{>ut}4zNUTMx+p2}b9AFD5%FD+kw zKVd)1|33}C4s<$tHHs${2TRr!8`R;d?yY+MaH#b|h*U4qttJT#U z^?V)t{G7`Czom7TT;F=TuUCotTV8w4cXo97`z!Z@_tig2yqCOD{rCLTeFBx0A4>m4 z|11}`GpRND`{&i`ruPr+S?lKhy8P?>$N%*VybSy%zovbR1!f$DWRDyc_OBxXHK0YkuhBw+;eJg|+& zz%U;nfM6xS^)fIRVAFkG0HPuRp$E!(?|`J2fkEIrhKl)6y$l!*yAO5|l70-o^&?55 zIt=C_Bn4=GOF))FaTvly$V!m>hUO`tx8Q+3A6W|$8y@KI(LDuJG#?Tu2}tTunNYuB z^ArOE$YJjTP&J_Nz=6IV9?U3mz(B|5A|y3Hzv1!}Fg4&X6`|h&!5n3ch5!*Ez{tSx Y|NqufsdsLxtiZ|3)78&qol`;+0Nc-`E&u=k diff --git a/resources/img/flat.png b/resources/img/flat.png index 7daecc06ff5619b09f0919219dd7fbe2920c72fa..0cf6ac85590b5a30153d596acab043a719170526 100644 GIT binary patch delta 1224 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 diff --git a/resources/img/hourglass.png b/resources/img/hourglass.png new file mode 100644 index 0000000000000000000000000000000000000000..422fd64d8e6b7493ca4d6a69d8c7fd73c7fce7b5 GIT binary patch literal 1807 zcmV+q2k`ibP)U8P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4n162kpgNVo|1qcff zJ_s=cNG>fZg9jx8g8+j9g8_pBLjXe}Lp{R+hNBE`7{wV~7)u#fFy3PlV+vxLz;uCG zm^qSpA@ds+OO_6nTdaDlt*rOhEZL^9ePa)2-_4=K(Z%tFGm-NGmm}8}ZcXk5JW@PU zd4+f<@d@)yL(o<5icqT158+-B6_LH7;i6x}CW#w~Uy-Pgl#@Irl`kzV zeL|*8R$ca%T%Wv){2zs_iiJvgN^h0dsuZZ2sQy$tsNSU!s;Q*;LF<6_B%M@UD?LHI zSNcZ`78uqV#TeU~$eS{ozBIdFzSClfs*^S+dw;4dus<{M;#|MXC)T}S9v!D zcV!QCPhBq)ZyO(X-(bH4|NMaZz==UigLj2o41F2S6d@OB6%`R(5i>J(Puzn9wnW{e zu;hl6HK{k#IWjCVGqdJqU(99Cv(K+6*i`tgSi2;vbXD1#3jNBGs$DgVwO(~o>mN4i zHPtkqZIx>)Y(Ls5-Br|mx>vQYvH$Kwn@O`L|D75??eGkZnfg$5<;Xeg_o%+-I&+-3%01W^SH2RkDT>t<8AY({UO#lFTB>(_`g8%^e z{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZI*G=-nZ79KoD1`Yd+(cX&OPUzd+rI!zakNIz#Z^^44g|h z?Ofv@20#K5ntJB?V|ud#*VxZH$;8mWNl5T>;Fua+Y-1PY6yUIQ0GXtFNqb35M2=~y ze9q0;Xk6qe_9Z_*e|hJgIV2)N;BkghEp<3F2oRd|4(xwmcXWh8qumzgQH`R*y+V-+9rW&7lI9Am@{ z;wB3Y`lOR>IakZzx7;XVuN&+)7O(fn@`GQqC>HIp+x7NYcBMJ<4m;B#xFs8pu!|Xb zh@0|E>EjBXW%u$q*FN?TQ=q;e#g#m(d6_*efl~*N^9*s80ud1rfhh(UBS(Q4$Wh}Q z#~T?+h8n-ZSwJ9A|4CPUGGw1`Dnb@ov9TPy3KL^RD)4E3R^_ zKV|LJ$E}F5Iq@0~dQq(>r|~AS-!)e3ax`nNp5!7>qsneR;Xzh3oa+wWXP9v&$Wdb| zYa7?70y$pf0BaVE4e$(ysB-~YNa$07XVdR(JhsUA?L5jD)7e)9*0Y1dY~gEuYpMWT z+Rr5h7-WDQ*_R@E*~|$(Lt;$s!gKe;K%m5SVt%BO-FB+`s%0bd1~DWpYP5nSyX>*g zD=m5;8mb$=x-X)h@Or2+678GB~+`_e4#_F-es?ndo xG)hl_It9A2J|sFN#SXXw?tnYs{~!2|0RYRzH<%CoOxyqf002ovPDHLkV1jD7Fq!}W literal 0 HcmV?d00001 diff --git a/resources/img/logo.png b/resources/img/logo.png index 2e2d18c85e74c6d5d525fb2798e0ec22266276a0..17f96a46cf655648db28b80de4aa40ef4ee7b34b 100644 GIT binary patch literal 3462 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 literal 4833 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 AjsO4v diff --git a/resources/img/menuicon.png b/resources/img/menuicon.png new file mode 100644 index 0000000000000000000000000000000000000000..17f96a46cf655648db28b80de4aa40ef4ee7b34b GIT binary patch literal 3462 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 literal 0 HcmV?d00001 diff --git a/resources/img/none.png b/resources/img/none.png index bda52a3035c125818668fee6f7ca706ade45763d..a81333320a7990d5959d82c242e32f8b0c1d9891 100644 GIT binary patch delta 899 zcmdnbevo~FqzoGa1B2C{n?*p1CEd~2k%8gCpTq#&X$%ZZ-zQp0Gg+LT7%pGW$Rjkl zn_GsNsm9^WoM?ZK<`HBzBbFg4y`9C9`KB%pkB^P&N>PQqJm-G0PIaC6Qc{(xZQ8VHTz#59 zJy&uaoO)Ds<<6sA^D0mNbY=bN+Nruyv)*BAfVD%zb=CbY2W<_F{STgSnA&)XL8MPW zOsPg7iDN=cR0tct7aJQR8!H<#8+#i=n@d|&8!L~yRjMgRWIj(X{}b8+`$?sTQ+ta|S2bnnc% z!(Csoq+;18u8)3?grChmrhj;UgoArR`-0UEL>GoEls~jrNlU5P^|0&y4qqX2q5VpM zikj+`K3efnQNLPzX0F-wMt7%OrT9;Ku4qy2sb8kt(^?;@8DJXtcV$_?UT@`)V9(FZ z*BIY=TCLm_R@GFs{!71vj=>t!F2il66U|f2YBS5~57sO{Ds-ANtn}JWv%+nSW$V6O z<2%-8<(GBNOOI>ar#!BAr{rGE+ZCsF&&=-KzJqm~|9&!lZ4_>v#`d0Tr^GL#Ihsy- zm$bB$b}6N$y_vUzoinF%muKQhUd`;F{AI-{5h-bDXV31Nae7|*{P@5PD?h|;Eb|O| zxoVTS=&z}&p}Xs|B(nFuT6WDo=SudfOuO4!*TZhqZ3*7Bdd2UO^;z-B|L=C1O-}Rw zXKh+{>!GBS@$dB7`I8O4f2sM*>Mh=>lNb9bH}cu1YHjDRxp9v-mEEs8&3oHyX3o7$ zS5t0(lMS=}{=V#PaasJ0f9&kVe1B~&)%pDS(KY$n@^f=N?S8-hv!uTJ*7UwO&pp51 z|C%$~Z2P-=EB7z2`G4f_p5saW-|SDFVdQ&MBb@0D6L->i_@% delta 948 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

v$JVgc zJOi!LXA(cu+RaI5w^?Ktht<&jJ&eEda!yL!q)~#EJL?SqL>=?Sby0Bx% z4(RoIc)eZ>4GrP(+8eB!~~Q|C3f%Ljg1>O0{FY0 zovMQS{~B5{41+IUzTo`%^XTvIM>rftR#p~*!62?*zmCnDH>0(+H6a&H%Oec{!^6Wk zaNqz0LBPqAC$WG3ekhen2!eotfdRC&wV}Sg9#*RrCX-3r#fZ()UayzR%gd>xq=Y_x z{7BJgG-2G#%na4m)>2+x9*vHUruUbJo}M0zj*h}+vtj-E^+|Qtu3d|J_wIpV7__&y zr)P;LMm~1C9c5)@*tKidlFX~u>rq=2%A|)$8?`ot;H6 z7))Sm$tMr71(ubSVQg${SqmN+89`xTVbWMSZITDG*^G&aiA5jDh$vwLTrL*|1_sd5 z(gL366WS(Hc14NJ(!pSm8X6iXH#e7hdU}$Md-LWE6%`dxX=!Pkjm2VV(eGioTn?+% zik6lZG&eWn?%lhnudhdOaWTGr{R*ek3A^2nf`S5ccXvah(TG}?7R|y=r*qM}Kp;RC zi-imZ1LfuAkxHeayu3WBtgNIk2QpfC9$5X7>UJd zTt9v{7OP;F)Q3rGCRp|1Rluu&R{^gA{zv{A0BdhFH(6q^%>V!Z07*qoM6N<$f*_)U AZ2$lO literal 0 HcmV?d00001 diff --git a/resources/img/up.png b/resources/img/up.png index d522dbce52c16abfc1f5f071337b901b71d63c2c..ea1b3c096794aa22668744746d54db5bf411586d 100644 GIT binary patch delta 1121 zcmV-n1fKi)Bb^D585{-x0027t*>V5?00d`2O+f$v;QV1wEtUWP0{4+R8v;1Xkyjso z0Spq8iwhhB0(?O1y!^aW22{Yv!0_!Fh-6^6tP3)Wfi%FH473C8-r4y$sIz1(ija=@}&ohL)C=3XUoH zNvR6KmBl5gxy1^edCB=j1^GpZC8;TYK($aiK!DdJzeK@3F*8rW$Uv2W$^aCO5EdeQ z5Ml_BTv}8H4@w3G0R{yI0|p0%0ER?{dWHoIM;YEQiZi+}mNKqjyvHQQ6vQ-v=>oGb zb0qUZ<~J;sEFCPjSoK(2S?{q~vQ1Yln@Cf+ta?!Li(3I6#3^??(EmIm(%xfuE~oGC&s(kdz32ceF zNnyziDQi-1rgLOiWM*c~&Ayn+o@bw5QLw4-U9omaR_Us;Hx>GoB~`nBY8Y$1>ZaB| zY}9M2X+GO3*H+kmv{SmPsQYxUYF}gj-HA4nW>5Y*HGbOR85%SDXMLZOF!%I)^94&6 zi7aki@@-k>@_Q>oR-InsvUcBk%MIH$nQY#&)nwcD9acN{?{?jDc3;^32M2Qw{XEis zO#JwYlh&usok>3X>-?mDi`titUP-+A@A{mZHn;BHslTUu|HQ+*$6`q6kmZG+S%mvg^qDm;@Id$8k>6bW`>f*)Bgy41x-`ZTmcRwYH zjSNRH;dQ_6N$9?RRu}%(ufCD-p-ypCVV{2Wjnt8P+NcTd=~v%KJ*lgSity2X^^Mfm z;*_vPzxqb2uMZ1r_N#AXe`o)?R4-aBE;i(4jCo6h`M_!p1xRB+Lo2Tfj<`00000NkvXXu0mjf74-*4 literal 4602 zcmeAS@N?(olHy`uVBq!ia0vp^HXzIaBpBqUx2*$GoCO|{#S9GG!XV7ZFl&wk0|T=} zrn7TEKt_H^esM;Afr6*AvqC{pep+TuDg#5st>lD+c@JJZdU8tTz=42(kf0}WPb4G- zC6^wko7dReII|H16b*OoIAEx7pdG~4x7VM_C~9D2P_z5kffEM~94Lsqe(~tZsf{KF zX2k@A90Ce7G&Ua8P~B<))cuf~nc2Cj($kTXnK_wP zJ+oYaYM7gg>l{-9)2iG$n-(rzy0j_Tt1f7jQ$cE>XI9?Eru4X?x-QsPY*>|-Tv#T;UGc+?bGd43jGdL?b z+a6|WTg;O$aa1x^!do)j;9jy&GFQ^910{`-Gb|@nDt?w0^Pa{xEqYDWnzd`b-_W_a zY-4RQfBOBi3y)kp`mxn`;%BDm%Gbs6eBZI!1la^vwpOTr2S5odwDpoG*la z=n7bMf&XEgpy+04zE%OPB{WdLT{+{kX@~vyT zTD_{g@~2*3C9-1Hihm*2EAA~7T(xq^Psi5{-&E#?#A@3*?hXIt&LbvqP3ow`?O7*g z8_nKlvO8hl<)qH1EUT?v$IQ04?O+{Voz0%?E~{>ut}4zNUTMx+p2}b9AFD5%FD+kw zKVd)1|33}C4s<$tHHs${2TRr!8`R;d?yY+MaH#b|h*U4qttJT#U z^?V)t{G7`Czom7TT;F=TuUCotTV8w4cXo97`z!Z@_tig2yqCOD{rCLTeFBx0A4>m4 z|11}`GpRND`{&i`ruPr+S?lKhy8P?>$N%*VybSy%zovbR1!f$DWRDT#fVkpM{^hk6&G zeLnF{hkF;H`@8~?9!K&nLic+IqI9Er7ooj?uxk(Rjta_-6 z(ZigHuul*wJ|LK27D<}X^fHWUMh_7J{Lug-5J2eCqXC8e?4cL}j0_C_|I0cb6PSDEK_18hp00i_>zopr0R8Jv-~a#s diff --git a/resources/img/up45.png b/resources/img/up45.png index bab14c6927bdf41074d5efa7f21f7a75c229ed38..2e0e4ed34fcb2bdf35afdf94ebe4ac1f62821a08 100644 GIT binary patch delta 1294 zcmV+p1@Zd&BgqPo85{-x0027t*>V5?00d`2O+f$v;QV1wEtUWP0{4+R8v;1Xkyjso z0Spq8iwhhB0(?O1y!^aW22{Yv!0_!Fh-6^6tP3)Wfi%FH473C8-r4y$sIz1(ija=@}&ohL)C=3XUoH zNvR6KmBl5gxy1^edCB=j1^GpZC8;TYK($aiK!DdJzeK@3F*8rW$Uv2W$^aCO5EdeQ z5Ml_BTv}8H4@w3G0R{yI0|p0%0ER?{dWHoIM;YEQiZi+}mNKqjyvHQQ6vQ-v=>oGb zb0qUZ<~J;sEFCPjSoK(2S?{q~vQ1Yln@Cf+ta?!Li(3I6#3^??(EmIm(%xfuE~oGC&s(kdz32ceF zNnyziDQi-1rgLOiWM*c~&Ayn+o@bw5QLw4-U9omaR_Us;Hx>GoB~`nBY8Y$1>ZaB| zY}9M2X+GO3*H+kmv{SmPsQYxUYF}gj-HA4nW>5Y*HGbOR85%SDXMLZOF!%I)^94&6 zi7aki@@-k>@_Q>oR-InsvUcBk%MIH$nQY#&)nwcD9acN{?{?jDc3;^32M2Qw{XEis zO#JwYlh&usok>3X>-?mDi`titUP-+A@A{mZHn;BHslTUu|HQ+*$6`~$b#DQz z+2L@&1I!-Ho=`V`4@SM&Z0gJ9LR;gf4o2JUwio3(_WM0;iC+{j8iK}5ON(}vuBys3 zXu79Y)TbqTV&aA~zBrm`^_m&(-CbRWv?$=ASPbczT78%P^jxf!D%dCX@p#Y@FEz05 znSHBcU~OHrlD+c@JJZdU8tTz=42(kf0}WPb4G- zC6^wko7dReII|H16b*OoIAEx7pdG~4x7VM_C~9D2P_z5kffEM~94Lsqe(~tZsf{KF zX2k@A90Ce7G&Ua8P~B<))cuf~nc2Cj($kTXnK_wP zJ+oYaYM7gg>l{-9)2iG$n-(rzy0j_Tt1f7jQ$cE>XI9?Eru4X?x-QsPY*>|-Tv#T;UGc+?bGd43jGdL?b z+a6|WTg;O$aa1x^!do)j;9jy&GFQ^910{`-Gb|@nDt?w0^Pa{xEqYDWnzd`b-_W_a zY-4RQfBOBi3y)kp`mxn`;%BDm%Gbs6eBZI!1la^vwpOTr2S5odwDpoG*la z=n7bMf&XEgpy+04zE%OPB{WdLT{+{kX@~vyT zTD_{g@~2*3C9-1Hihm*2EAA~7T(xq^Psi5{-&E#?#A@3*?hXIt&LbvqP3ow`?O7*g z8_nKlvO8hl<)qH1EUT?v$IQ04?O+{Voz0%?E~{>ut}4zNUTMx+p2}b9AFD5%FD+kw zKVd)1|33}C4s<$tHHs${2TRr!8`R;d?yY+MaH#b|h*U4qttJT#U z^?V)t{G7`Czom7TT;F=TuUCotTV8w4cXo97`z!Z@_tig2yqCOD{rCLTeFBx0A4>m4 z|11}`GpRND`{&i`ruPr+S?lKhy8P?>$N%*VybSy%zovbR1!f$DWRDg9iu!3>F^E3<>i=%0FCSIKXg_;lc+Dz4!&{|09F@``0_*SC1+? zA6YYy-H$3wfQP1gKLO=v(x|#g)SQ6oa5SUwbJ6qyOGe@Wy59c|6zC;EGlsqY{}-Ux z%!I;2;Xo1?iVy=oDi!w-UM(; zRls2zLKv%F1_qFB2ZSo@EF5~lx&yFlfs5kQ3({Q=SB8~=M=ww}{^9_yUIvB)tQJBA z3FyVAm0?ux|NnRc7b)}%P|Ha$k669HD8$fByk1P*r07N0O`2X*-K6S8)=j!zgl=;5 z!gQ0T7owY7y&&DFl?nq%z=0&yql$-p2mo8X|NmG2jLFsE+@AyTt*5J>%Q~loCIAXu B<=y}Q diff --git a/resources/img/upup.png b/resources/img/upup.png index 19e4e8d86276a0b8d742d439bd178ebe56a4feda..1e12c091447b0fe777464ac7f31086516de1e2c9 100644 GIT binary patch delta 1214 zcmV;v1VQ`yBl!uC85{-x0027t*>V5?00d`2O+f$v;QV1wEtUWP0{4+R8v;1Xkyjso z0Spq8iwhhB0(?O1y!^aW22{Yv!0_!Fh-6^6tP3)Wfi%FH473C8-r4y$sIz1(ija=@}&ohL)C=3XUoH zNvR6KmBl5gxy1^edCB=j1^GpZC8;TYK($aiK!DdJzeK@3F*8rW$Uv2W$^aCO5EdeQ z5Ml_BTv}8H4@w3G0R{yI0|p0%0ER?{dWHoIM;YEQiZi+}mNKqjyvHQQ6vQ-v=>oGb zb0qUZ<~J;sEFCPjSoK(2S?{q~vQ1Yln@Cf+ta?!Li(3I6#3^??(EmIm(%xfuE~oGC&s(kdz32ceF zNnyziDQi-1rgLOiWM*c~&Ayn+o@bw5QLw4-U9omaR_Us;Hx>GoB~`nBY8Y$1>ZaB| zY}9M2X+GO3*H+kmv{SmPsQYxUYF}gj-HA4nW>5Y*HGbOR85%SDXMLZOF!%I)^94&6 zi7aki@@-k>@_Q>oR-InsvUcBk%MIH$nQY#&)nwcD9acN{?{?jDc3;^32M2Qw{XEis zO#JwYlh&usok>3X>-?mDi`titUP-+A@A{mZHn;BHslTUu|HQ+*$6`h2-u3Ha5Ml0!Fn2_lJ0i@TQ^I}U>v#XhvMj+g zO?t}%c(n8(&vSSbU9&7(=Xut9?`0gvH4MWoZQJU-G|0jr2a+Ibk|fFP(jW+;`*k!; zqmLd#5(X)d+fQPD0+YiPzXK4ntpNg+N8wP|l#gu^lQX5|i)ke+lr}?!yRJKw-N&c2 zsDJ=P*5s(ooWfZ7V4;>41+0~@U~Og(2Qrdw>3Wf>@Wz4epV>$Sy3Q54Q&He73t<5;O9KrgBD$bnDjFHjfJI-e^T@@lD+c@JJZdU8tTz=42(kf0}WPb4G- zC6^wko7dReII|H16b*OoIAEx7pdG~4x7VM_C~9D2P_z5kffEM~94Lsqe(~tZsf{KF zX2k@A90Ce7G&Ua8P~B<))cuf~nc2Cj($kTXnK_wP zJ+oYaYM7gg>l{-9)2iG$n-(rzy0j_Tt1f7jQ$cE>XI9?Eru4X?x-QsPY*>|-Tv#T;UGc+?bGd43jGdL?b z+a6|WTg;O$aa1x^!do)j;9jy&GFQ^910{`-Gb|@nDt?w0^Pa{xEqYDWnzd`b-_W_a zY-4RQfBOBi3y)kp`mxn`;%BDm%Gbs6eBZI!1la^vwpOTr2S5odwDpoG*la z=n7bMf&XEgpy+04zE%OPB{WdLT{+{kX@~vyT zTD_{g@~2*3C9-1Hihm*2EAA~7T(xq^Psi5{-&E#?#A@3*?hXIt&LbvqP3ow`?O7*g z8_nKlvO8hl<)qH1EUT?v$IQ04?O+{Voz0%?E~{>ut}4zNUTMx+p2}b9AFD5%FD+kw zKVd)1|33}C4s<$tHHs${2TRr!8`R;d?yY+MaH#b|h*U4qttJT#U z^?V)t{G7`Czom7TT;F=TuUCotTV8w4cXo97`z!Z@_tig2yqCOD{rCLTeFBx0A4>m4 z|11}`GpRND`{&i`ruPr+S?lKhy8P?>$N%*VybSy%zovbR1!f$DWRDTb$0EZMr*x>#90PG3`*8l(i|2#h30q=n-60qqOI1iNh|NlL1hb4d& z{GX4h+W=%L2;g!U!+fwbkihVp157Va61&6TdNKS4brIBTEDnQu3aS9bZ~ag~7=__5 zgZnTk2#xTYzMcG{8{9gCK7-zz7Brs)B(FFjRMp@value->uint8]); + + // set the right arrow into the bitmap + if (new_tuple->value->data[0]) { // will be true if this is a Rajat build + icon_bitmap = gbitmap_create_with_resource(CGM_ICONS_RAJAT[new_tuple->value->data[1]]); + } + else { + icon_bitmap = gbitmap_create_with_resource(CGM_ICONS[new_tuple->value->data[1]]); + } + bitmap_layer_set_bitmap(icon_layer, icon_bitmap); break; - case CGM_BG_KEY: - - APP_LOG(APP_LOG_LEVEL_INFO, "BG"); - text_layer_set_text(bg_layer, new_tuple->value->cstring); - strncpy(last_bg, new_tuple->value->cstring, 124); - break; + case CGM_BG_KEY: + APP_LOG(APP_LOG_LEVEL_INFO, "BG CURRENT"); + if (specialvalue_bitmap) { + gbitmap_destroy(specialvalue_bitmap); + } + + // get current BG + strncpy(last_bg, new_tuple->value->cstring, 124); + current_bg = atoi(last_bg); + + // check for special value, if special value, then replace icon and blank BG; else send current BG + if ((current_bg == NO_ANTENNA_VALUE) || (current_bg == BAD_RF_VALUE)) { + text_layer_set_text(bg_layer, ""); + specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[0]); + bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); + } + else if (current_bg == SENSOR_NOT_CALIBRATED_VALUE) { + text_layer_set_text(bg_layer, ""); + specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[1]); + bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); + } + else if (current_bg == STOP_LIGHT_VALUE) { + text_layer_set_text(bg_layer, ""); + specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[2]); + bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); + } + else if (current_bg == HOURGLASS_VALUE) { + text_layer_set_text(bg_layer, ""); + specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[3]); + bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); + } + else if (current_bg == QUESTION_MARKS_VALUE) { + text_layer_set_text(bg_layer, ""); + specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[4]); + bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); + } + else { + text_layer_set_text(bg_layer, new_tuple->value->cstring); + } + + break; // break for CGM_BG_KEY case CGM_READTIME_KEY: - APP_LOG(APP_LOG_LEVEL_INFO, "readtime"); + APP_LOG(APP_LOG_LEVEL_INFO, "READ TIME AGO"); strncpy(new_time, new_tuple->value->cstring, 124); text_layer_set_text(readtime_layer, new_tuple->value->cstring); break; + case CGM_ALERT_KEY: + APP_LOG(APP_LOG_LEVEL_INFO, "ALERT VIBRATION"); + alert_handler(new_tuple->value->uint8); + break; + case CGM_TIME_NOW: - - APP_LOG(APP_LOG_LEVEL_INFO, "cgm time"); + APP_LOG(APP_LOG_LEVEL_INFO, "CGM TIME NOW"); draw_date(); text_layer_set_text(datetime_layer, new_tuple->value->cstring); break; - case CGM_ALERT_KEY: - APP_LOG(APP_LOG_LEVEL_INFO, "alert"); - alert_handler(new_tuple->value->uint8); - break; - case CGM_DELTA_KEY: - APP_LOG(APP_LOG_LEVEL_INFO, "delta"); + APP_LOG(APP_LOG_LEVEL_INFO, "DELTA IN BG"); text_layer_set_text(message_layer, new_tuple->value->cstring); break; - } + + case CGM_BATTLEVEL_KEY: + APP_LOG(APP_LOG_LEVEL_INFO, "BATTERY LEVEL"); -} + static uint8_t current_battlevel = 0; + static char last_battlevel[4]; + static char battlevel_percent[6]; + + if (batticon_bitmap) { + gbitmap_destroy(batticon_bitmap); + } + + // get current battery level + strncpy(last_battlevel, new_tuple->value->cstring, 4); + current_battlevel = atoi(last_battlevel); + + // check for init code or Rajat build (will be 111 if Rajat build) + if ( (strcmp(last_battlevel, "") == 0) || (current_battlevel == 111) ) { + // Init code or Rajat build, can't do battery; set text layer & icon to empty value + text_layer_set_text(battlevel_layer, ""); + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[11]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + break; + } + else { + // get current battery level and set battery level text with percent + snprintf(battlevel_percent, 6, "%s%%", last_battlevel); + text_layer_set_text(battlevel_layer, battlevel_percent); + + // check battery level, set battery level icon + if ( (current_battlevel >= 90) && (current_battlevel <= 100) ) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[10]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 80) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[9]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 70) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[8]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 60) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[7]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 50) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[6]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 40) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[5]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 30) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[4]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 20) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[3]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 10) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[2]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 5) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[1]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[0]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + } // end else Init code or Rajat build + + break; // break for CGM_BATTLEVEL_KEY + + case CGM_T1DNAME_KEY: + APP_LOG(APP_LOG_LEVEL_INFO, "T1D NAME"); + text_layer_set_text(t1dname_layer, new_tuple->value->cstring); + break; + + } // end switch(key) + +} // end sync_tuple_changed_callback() static void send_cmd(void) { @@ -201,60 +387,97 @@ static void timer_callback(void *data) { timer = app_timer_register(60000, timer_callback, NULL); } - + static void window_load(Window *window) { Layer *window_layer = window_get_root_layer(window); + // DELTA BG + message_layer = text_layer_create(GRect(0, 33, 144, 55)); + text_layer_set_text_color(message_layer, GColorBlack); + text_layer_set_background_color(message_layer, GColorWhite); + text_layer_set_font(message_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD)); + text_layer_set_text_alignment(message_layer, GTextAlignmentCenter); + layer_add_child(window_layer, text_layer_get_layer(message_layer)); + + //ARROW OR SPECIAL VALUE + icon_layer = bitmap_layer_create(GRect(85, -7, 78, 50)); + bitmap_layer_set_alignment(icon_layer, GAlignTopLeft); + bitmap_layer_set_background_color(icon_layer, GColorClear); + layer_add_child(window_layer, bitmap_layer_get_layer(icon_layer)); + + // CURRENT APP TIME + datetime_layer = text_layer_create(GRect(82, 58, 57, 24)); + text_layer_set_text_color(datetime_layer, GColorBlack); + text_layer_set_background_color(datetime_layer, GColorClear); + text_layer_set_font(datetime_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(datetime_layer, GTextAlignmentRight); + layer_add_child(window_layer, text_layer_get_layer(datetime_layer)); + + //BG + bg_layer = text_layer_create(GRect(0, -5, 95, 47)); + text_layer_set_text_color(bg_layer, GColorBlack); + text_layer_set_background_color(bg_layer, GColorWhite); + text_layer_set_font(bg_layer, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD)); + text_layer_set_text_alignment(bg_layer, GTextAlignmentCenter); + layer_add_child(window_layer, text_layer_get_layer(bg_layer)); + + //READ TIME AGO + readtime_layer = text_layer_create(GRect(5, 58, 90, 28)); + text_layer_set_text_color(readtime_layer, GColorBlack); + text_layer_set_background_color(readtime_layer, GColorClear); + text_layer_set_font(readtime_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(readtime_layer, GTextAlignmentLeft); + layer_add_child(window_layer, text_layer_get_layer(readtime_layer)); + + // T1D NAME + t1dname_layer = text_layer_create(GRect(5, 138, 69, 28)); + text_layer_set_text_color(t1dname_layer, GColorWhite); + text_layer_set_background_color(t1dname_layer, GColorClear); + text_layer_set_font(t1dname_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(t1dname_layer, GTextAlignmentLeft); + layer_add_child(window_layer, text_layer_get_layer(t1dname_layer)); + + // BATTERY LEVEL ICON + batticon_layer = bitmap_layer_create(GRect(80, 147, 28, 20)); + bitmap_layer_set_alignment(batticon_layer, GAlignLeft); + bitmap_layer_set_background_color(batticon_layer, GColorBlack); + layer_add_child(window_layer, bitmap_layer_get_layer(batticon_layer)); + + // BATTERY LEVEL + battlevel_layer = text_layer_create(GRect(110, 144, 32, 20)); + text_layer_set_text_color(battlevel_layer, GColorWhite); + text_layer_set_background_color(battlevel_layer, GColorBlack); + text_layer_set_font(battlevel_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD)); + text_layer_set_text_alignment(battlevel_layer, GTextAlignmentLeft); + layer_add_child(window_layer, text_layer_get_layer(battlevel_layer)); + + // CURRENT ACTUAL TIME + time_layer = text_layer_create(GRect(0, 82, 144, 44)); + text_layer_set_text_color(time_layer, GColorWhite); + text_layer_set_background_color(time_layer, GColorClear); + text_layer_set_font(time_layer, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD)); + text_layer_set_text_alignment(time_layer, GTextAlignmentCenter); + layer_add_child(window_layer, text_layer_get_layer(time_layer)); + + // CURRENT ACTUAL DATE + date_layer = text_layer_create(GRect(0, 120, 144, 25)); + text_layer_set_text_color(date_layer, GColorWhite); + text_layer_set_background_color(date_layer, GColorClear); + text_layer_set_font(date_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(date_layer, GTextAlignmentCenter); + layer_add_child(window_layer, text_layer_get_layer(date_layer)); + draw_date(); - icon_layer = bitmap_layer_create(GRect(82, 0, 61, 61)); - - layer_add_child(window_layer, bitmap_layer_get_layer(icon_layer)); - - bg_layer = text_layer_create(GRect(0, 5, 83, 47)); - text_layer_set_text_color(bg_layer, GColorWhite); - text_layer_set_background_color(bg_layer, GColorClear); - text_layer_set_font(bg_layer, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD)); - text_layer_set_text_alignment(bg_layer, GTextAlignmentCenter); - layer_add_child(window_layer, text_layer_get_layer(bg_layer)); - - readtime_layer = text_layer_create(GRect(0, 48, 144, 22)); - text_layer_set_text_color(readtime_layer, GColorWhite); - text_layer_set_background_color(readtime_layer, GColorClear); - text_layer_set_font(readtime_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD)); - text_layer_set_text_alignment(readtime_layer, GTextAlignmentCenter); - layer_add_child(window_layer, text_layer_get_layer(readtime_layer)); - - message_layer = text_layer_create(GRect(0, 69, 144, 22)); - text_layer_set_text_color(message_layer, GColorWhite); - text_layer_set_background_color(message_layer, GColorBlack); - text_layer_set_font(message_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD)); - text_layer_set_text_alignment(message_layer, GTextAlignmentCenter); - layer_add_child(window_layer, text_layer_get_layer(message_layer)); - - datetime_layer = text_layer_create(GRect(0, 93, 144, 38)); - text_layer_set_text_color(datetime_layer, GColorBlack); - text_layer_set_background_color(datetime_layer, GColorWhite); - text_layer_set_font(datetime_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28)); - text_layer_set_text_alignment(datetime_layer, GTextAlignmentCenter); - layer_add_child(window_layer, text_layer_get_layer(datetime_layer)); - //Date - - date_layer = text_layer_create(GRect(0, 127, 144, 42)); - text_layer_set_text_color(date_layer, GColorBlack); - text_layer_set_background_color(date_layer, GColorWhite); - text_layer_set_font(date_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28)); - text_layer_set_text_alignment(date_layer, GTextAlignmentCenter); - layer_add_child(window_layer, text_layer_get_layer(date_layer)); - - draw_date(); Tuplet initial_values[] = { - TupletInteger(CGM_ICON_KEY, (uint8_t)0), + TupletBytes(CGM_ICON_KEY, icon_array, 2), TupletCString(CGM_BG_KEY, ""), TupletCString(CGM_READTIME_KEY, ""), TupletInteger(CGM_ALERT_KEY, 0), - TupletCString(CGM_TIME_NOW, "loading..."), - TupletCString(CGM_DELTA_KEY, " ") + TupletCString(CGM_TIME_NOW, ""), + TupletCString(CGM_DELTA_KEY, "LOADING..."), + TupletCString(CGM_BATTLEVEL_KEY, ""), + TupletCString(CGM_T1DNAME_KEY, "") }; app_sync_init(&sync, sync_buffer, sizeof(sync_buffer), initial_values, ARRAY_LENGTH(initial_values), sync_tuple_changed_callback, sync_error_callback, NULL); @@ -268,11 +491,21 @@ static void window_unload(Window *window) { if (icon_bitmap) { gbitmap_destroy(icon_bitmap); } + if (specialvalue_bitmap) { + gbitmap_destroy(specialvalue_bitmap); + } + if (batticon_bitmap) { + gbitmap_destroy(batticon_bitmap); + } text_layer_destroy(datetime_layer); text_layer_destroy(readtime_layer); text_layer_destroy(bg_layer); text_layer_destroy(message_layer); bitmap_layer_destroy(icon_layer); + bitmap_layer_destroy(batticon_layer); + text_layer_destroy(battlevel_layer); + text_layer_destroy(t1dname_layer); + // bitmap_layer_destroy(time_layer); // bitmap_layer_destroy(date_layer); } @@ -301,3 +534,5 @@ int main(void) { app_event_loop(); deinit(); } + + diff --git a/src/js/pebble-js-app.js b/src/js/pebble-js-app.js index da68a9e..a3ee010 100644 --- a/src/js/pebble-js-app.js +++ b/src/js/pebble-js-app.js @@ -1,80 +1,127 @@ -var TIME_5_MINS = 5 * 60 * 1000, -TIME_10_MINS = 10 * 60 * 1000, -TIME_15_MINS = 15 * 60 * 1000, -TIME_30_MINS = TIME_15_MINS * 2; - +// global variable for last alert time var lastAlert = 0; -var started = new Date( ).getTime( ); - -var DIRECTIONS = { - 'NONE': 0, - 'DoubleUp': 1, - 'SingleUp': 2, - 'FortyFiveUp': 3, - 'Flat': 4, - 'FortyFiveDown': 5, - 'SingleDown': 6, - 'DoubleDown': 7, - 'NOT COMPUTABLE': 8, - 'RATE OUT OF RANGE': 9 -}; - -function directionToTrend(direction) { - var trend = 8; - if (direction in DIRECTIONS) { - trend = DIRECTIONS[direction]; - } - return trend; -} +// main function to retrieve, format, and send cgm data function fetchCgmData(lastReadTime, lastBG) { + // declare local constants for time differences + var TIME_5_MINS = 5 * 60 * 1000, + TIME_10_MINS = 10 * 60 * 1000, + TIME_15_MINS = 15 * 60 * 1000, + TIME_30_MINS = TIME_15_MINS * 2; + + // declare local constants for arrow trends + var NO_ARROW = 0, + DOUBLE_UP = 1, + SINGLE_UP = 2, + FORTYFIVE_UP = 3, + FLAT_ARROW = 4, + FORTYFIVE_DOWN = 5, + SINGLE_DOWN = 6, + DOUBLE_DOWN = 7, + NOT_COMPUTABLE = 8, + RATE_OUT_OF_RANGE = 9, + LOGO = 10; + + // hard code name of T1D person, for now + var NameofT1DPerson = ""; + + // declare local variables for message data var response, message; + + //call options & started to get endpoint & start time var opts = options( ); + var started = new Date( ).getTime( ); + + //if endpoint is invalid, return error msg to watch if (!opts.endpoint) { message = { - icon: 0, - bg: '??', + icon: [0,LOGO], + bg: '---', readtime: timeago(new Date().getTime() - started), alert: 0, time: formatDate(new Date()), - delta: 'SETTINGS' + delta: 'CHECK ENDPOINT', + battlevel: "", + t1dname: "" }; console.log("sending message", JSON.stringify(message)); MessageQueue.sendAppMessage(message); return; } + + // call XML var req = new XMLHttpRequest(); + //console.log('endpoint: ' + opts.endpoint); - console.log('options', opts, opts.endpoint); + // get cgm data req.open('GET', opts.endpoint, true); req.onload = function(e) { - - console.log(req.readyState); + if (req.readyState == 4) { - console.log(req.status); + if(req.status == 200) { - console.log("status: " + req.status); + + // Load response response = JSON.parse(req.responseText); + response = response.bgs; - var bgs = response.bgs; - if (bgs && bgs.length > 0) { - console.log('got bgs', JSON.stringify(bgs)); + // check response data + if (response && response.length > 0) { + + // response data is good; send log with response + console.log('got response', JSON.stringify(response)); + // see if we're in a Rajat build + var RajatBuild = isRajatBuild(opts.endpoint, "heroku"); + if (RajatBuild) { + // set Rajat arrow constants + DOUBLE_UP = 0; + SINGLE_UP = 1; + FORTYFIVE_UP = 2; + FLAT_ARROW = 3; + NO_ARROW = 4; + } + + // initialize message data var now = new Date().getTime(), sinceLastAlert = now - lastAlert, - alertValue = 0,currentBG = bgs[0].sgv, - currentBGDelta = bgs[0].bgdelta, - currentDirection = bgs[0].direction, + alertValue = 0, + currentBG = response[0].sgv, + currentBGDelta = response[0].bgdelta, + currentTrend = response[0].trend, delta = (currentBGDelta > 0 ? '+' : '') + currentBGDelta + " mg/dL", - readingtime = new Date(bgs[0].datetime).getTime(), - readago = now - readingtime; + readingtime = new Date(response[0].datetime).getTime(), + readago = now - readingtime, + currentBattery = response[0].battery; + + // see if we're in a Rajat build + var RajatBuild = isRajatBuild(opts.endpoint, "heroku"); + if (RajatBuild) { + // set Rajat arrow constants + DOUBLE_UP = 0; + SINGLE_UP = 1; + FORTYFIVE_UP = 2; + FLAT_ARROW = 3; + NO_ARROW = 4; + // can't read battery so set to 111 to indicate Rajat build + currentBattery = "111"; + } + + // debug logs; uncomment when need to debug something + //console.log("now: " + now); + //console.log("sinceLastAlert: " + sinceLastAlert); + //console.log("current BG: " + currentBG); + //console.log("current BG delta: " + currentBGDelta); + //console.log("arrow: " + currentTrend); + //console.log('RajatBuild?: ' + RajatBuild); + //console.log("readingtime: " + readingtime); + //console.log("readago: " + readago); + //console.log("current Battery: " + currentBattery); - console.log("now: " + now); - console.log("readingtime: " + readingtime); - console.log("readago: " + readago); + // set vibration pattern; alert value; 0 nothing, 1 normal, 2 low, 3 high if (currentBG < 39) { if (sinceLastAlert > TIME_10_MINS) alertValue = 2; @@ -84,11 +131,11 @@ function fetchCgmData(lastReadTime, lastBG) { alertValue = 2; else if (currentBG < 70 && sinceLastAlert > TIME_15_MINS) alertValue = 2; - else if (currentBG < 120 && currentDirection == 'DoubleDown' && sinceLastAlert > TIME_5_MINS) + else if (currentBG < 120 && currentTrend == DOUBLE_DOWN && sinceLastAlert > TIME_5_MINS) alertValue = 2; - else if (currentBG == 100 && currentDirection == 'Flat' && sinceLastAlert > TIME_15_MINS) //Perfect Score - a good time to take a picture :) + else if (currentBG == 100 && currentTrend == FLAT_ARROW && sinceLastAlert > TIME_15_MINS) //Perfect Score - a good time to take a picture :) alertValue = 1; - else if (currentBG > 120 && currentDirection == 'DoubleUp' && sinceLastAlert > TIME_15_MINS) + else if (currentBG > 120 && currentTrend == DOUBLE_UP && sinceLastAlert > TIME_15_MINS) alertValue = 3; else if (currentBG > 200 && sinceLastAlert > TIME_30_MINS && currentBGDelta > 0) alertValue = 3; @@ -105,27 +152,33 @@ function fetchCgmData(lastReadTime, lastBG) { lastAlert = now; } + // load message data message = { - icon: directionToTrend(currentDirection), + icon: [RajatBuild,currentTrend], bg: currentBG, - readtime: timeago(new Date().getTime() - (new Date(bgs[0].datetime).getTime())), + readtime: timeago(new Date().getTime() - (new Date(response[0].datetime).getTime())), alert: alertValue, time: formatDate(new Date()), - delta: delta + delta: delta, + battlevel: currentBattery, + t1dname: NameofT1DPerson }; + // send message data to log and to watch console.log("message: " + JSON.stringify(message)); MessageQueue.sendAppMessage(message); - + + // response data is no good; format error message and send to watch } else { message = { - icon: 0, - bg: '???', + icon: [0,LOGO], + bg: '---', readtime: timeago(new Date().getTime() - (now)), alert: 1, time: formatDate(new Date()), - delta: 'offline' - + delta: 'DATA OFFLINE', + battlevel: "", + t1dname: "" }; console.log("sending message", JSON.stringify(message)); MessageQueue.sendAppMessage(message); @@ -136,6 +189,7 @@ function fetchCgmData(lastReadTime, lastBG) { req.send(null); } +// format date hours:minutes; add AM + PM if want function formatDate(date) { var minutes = date.getMinutes(), hours = date.getHours() || 12, @@ -146,15 +200,20 @@ function formatDate(date) { hours = hours - 12; else if (hours < 12) meridiem = " AM"; - + + // don't want AM & PM, so add line with blank + // if want to add later, then comment out this line + meridiem = ""; + if (minutes < 10) formatted = hours + ":0" + date.getMinutes() + meridiem; else formatted = hours + ":" + date.getMinutes() + meridiem; - + return formatted; } +// format past time difference data function timeago(offset) { var parts = {}, MINUTE = 60 * 1000, @@ -164,13 +223,13 @@ function timeago(offset) { if (offset <= MINUTE) parts = { lablel: 'now' }; if (offset <= MINUTE * 2) parts = { label: '1 min ago' }; - else if (offset < (MINUTE * 60)) parts = { value: Math.round(Math.abs(offset / MINUTE)), label: 'mins' }; + else if (offset < (MINUTE * 60)) parts = { value: Math.round(Math.abs(offset / MINUTE)), label: 'min' }; else if (offset < (HOUR * 2)) parts = { label: '1 hr ago' }; else if (offset < (HOUR * 24)) parts = { value: Math.round(Math.abs(offset / HOUR)), label: 'hrs' }; - else if (offset < (DAY * 1)) parts = { label: '1 day ago' }; - else if (offset < (DAY * 7)) parts = { value: Math.round(Math.abs(offset / DAY)), label: 'day' }; - else if (offset < (WEEK * 52)) parts = { value: Math.round(Math.abs(offset / WEEK)), label: 'week' }; - else parts = { label: 'a long time ago' }; + else if (offset < (DAY * 1)) parts = { label: '1 dy ago' }; + else if (offset < (DAY * 7)) parts = { value: Math.round(Math.abs(offset / DAY)), label: 'dys' }; + else if (offset < (WEEK * 52)) parts = { value: Math.round(Math.abs(offset / WEEK)), label: 'wks' }; + else parts = { label: 'BEFORE DX'}; if (parts.value) return parts.value + ' ' + parts.label + ' ago'; @@ -179,6 +238,7 @@ function timeago(offset) { } +// get endpoint for XML request function options ( ) { var opts = [ ].slice.call(arguments).pop( ); if (opts) { @@ -189,6 +249,12 @@ function options ( ) { return opts; } +// check for Rajat build +function isRajatBuild (str, str_to_match) { + return (str.indexOf(str_to_match) >= 0); +} + +// message queue-ing to pace calls from C function on watch var MessageQueue = (function () { var RETRY_MAX = 5; @@ -325,6 +391,7 @@ var MessageQueue = (function () { }()); +// pebble specific calls with watch Pebble.addEventListener("ready", function(e) { console.log("connect: " + e.ready); @@ -350,3 +417,5 @@ Pebble.addEventListener("webviewclosed", function(e) { }); + + From 60869d273faec3e78114d6c972a5b1841d377760 Mon Sep 17 00:00:00 2001 From: ELUTE Date: Tue, 29 Jul 2014 16:54:46 -0400 Subject: [PATCH 2/9] Updating mg/dL --- LICENSE | 0 README.md | 0 appinfo.json | 330 ++++----- resources/images/batt10.png | Bin resources/images/batt20.png | Bin resources/images/batt30.png | Bin resources/images/batt40.png | Bin resources/images/batt50.png | Bin resources/images/batt60.png | Bin resources/images/batt70.png | Bin resources/images/batt80.png | Bin resources/images/batt90.png | Bin resources/images/battempty.png | Bin resources/images/battfull.png | Bin resources/images/battnone.png | Bin resources/images/blooddrop.png | Bin resources/images/brokenantenna.png | Bin resources/images/down.png | Bin resources/images/down45.png | Bin resources/images/downdown.png | Bin 494 -> 0 bytes resources/images/flat.png | Bin resources/images/hourglass.png | Bin resources/images/logo.png | Bin resources/images/menuicon.png | Bin resources/images/none.png | Bin resources/images/questionmarks.png | Bin 2300 -> 2335 bytes resources/images/stoplight.png | Bin resources/images/up.png | Bin resources/images/up45.png | Bin 1353 -> 550 bytes resources/images/upup.png | Bin 1273 -> 809 bytes resources/img/batt10.png | Bin resources/img/batt20.png | Bin resources/img/batt30.png | Bin resources/img/batt40.png | Bin resources/img/batt50.png | Bin resources/img/batt60.png | Bin resources/img/batt70.png | Bin resources/img/batt80.png | Bin resources/img/batt90.png | Bin resources/img/battempty.png | Bin resources/img/battfull.png | Bin resources/img/battnone.png | Bin resources/img/blooddrop.png | Bin resources/img/brokenantenna.png | Bin resources/img/down.png | Bin resources/img/down45.png | Bin resources/img/downdown.png | Bin 494 -> 0 bytes resources/img/flat.png | Bin resources/img/hourglass.png | Bin resources/img/logo.png | Bin resources/img/menuicon.png | Bin resources/img/none.png | Bin resources/img/questionmarks.png | Bin 2300 -> 2335 bytes resources/img/stoplight.png | Bin resources/img/up.png | Bin resources/img/up45.png | Bin 1353 -> 550 bytes resources/img/upup.png | Bin 1273 -> 809 bytes src/cgm.c | 1076 ++++++++++++++-------------- src/js/pebble-js-app.js | 846 +++++++++++----------- wscript | 0 60 files changed, 1128 insertions(+), 1124 deletions(-) mode change 100644 => 100755 LICENSE mode change 100644 => 100755 README.md mode change 100644 => 100755 appinfo.json mode change 100644 => 100755 resources/images/batt10.png mode change 100644 => 100755 resources/images/batt20.png mode change 100644 => 100755 resources/images/batt30.png mode change 100644 => 100755 resources/images/batt40.png mode change 100644 => 100755 resources/images/batt50.png mode change 100644 => 100755 resources/images/batt60.png mode change 100644 => 100755 resources/images/batt70.png mode change 100644 => 100755 resources/images/batt80.png mode change 100644 => 100755 resources/images/batt90.png mode change 100644 => 100755 resources/images/battempty.png mode change 100644 => 100755 resources/images/battfull.png mode change 100644 => 100755 resources/images/battnone.png mode change 100644 => 100755 resources/images/blooddrop.png mode change 100644 => 100755 resources/images/brokenantenna.png mode change 100644 => 100755 resources/images/down.png mode change 100644 => 100755 resources/images/down45.png delete mode 100644 resources/images/downdown.png mode change 100644 => 100755 resources/images/flat.png mode change 100644 => 100755 resources/images/hourglass.png mode change 100644 => 100755 resources/images/logo.png mode change 100644 => 100755 resources/images/menuicon.png mode change 100644 => 100755 resources/images/none.png mode change 100644 => 100755 resources/images/questionmarks.png mode change 100644 => 100755 resources/images/stoplight.png mode change 100644 => 100755 resources/images/up.png mode change 100644 => 100755 resources/images/up45.png mode change 100644 => 100755 resources/images/upup.png mode change 100644 => 100755 resources/img/batt10.png mode change 100644 => 100755 resources/img/batt20.png mode change 100644 => 100755 resources/img/batt30.png mode change 100644 => 100755 resources/img/batt40.png mode change 100644 => 100755 resources/img/batt50.png mode change 100644 => 100755 resources/img/batt60.png mode change 100644 => 100755 resources/img/batt70.png mode change 100644 => 100755 resources/img/batt80.png mode change 100644 => 100755 resources/img/batt90.png mode change 100644 => 100755 resources/img/battempty.png mode change 100644 => 100755 resources/img/battfull.png mode change 100644 => 100755 resources/img/battnone.png mode change 100644 => 100755 resources/img/blooddrop.png mode change 100644 => 100755 resources/img/brokenantenna.png mode change 100644 => 100755 resources/img/down.png mode change 100644 => 100755 resources/img/down45.png delete mode 100644 resources/img/downdown.png mode change 100644 => 100755 resources/img/flat.png mode change 100644 => 100755 resources/img/hourglass.png mode change 100644 => 100755 resources/img/logo.png mode change 100644 => 100755 resources/img/menuicon.png mode change 100644 => 100755 resources/img/none.png mode change 100644 => 100755 resources/img/questionmarks.png mode change 100644 => 100755 resources/img/stoplight.png mode change 100644 => 100755 resources/img/up.png mode change 100644 => 100755 resources/img/up45.png mode change 100644 => 100755 resources/img/upup.png mode change 100644 => 100755 src/cgm.c mode change 100644 => 100755 src/js/pebble-js-app.js mode change 100644 => 100755 wscript diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/appinfo.json b/appinfo.json old mode 100644 new mode 100755 index 0d9d5fb..c39f5d4 --- a/appinfo.json +++ b/appinfo.json @@ -1,165 +1,165 @@ -{ - "uuid": "a4e66a45-f30d-4a13-9f0f-59343c6b23a9", - "capabilities": [ - "configurable" - ], - "appKeys": { - "time": 4, - "delta": 5, - "readtime": 2, - "bg": 1, - "icon": 0, - "alert": 3, - "battlevel": 6, - "t1dname": 7 - }, - "resources": { - "media": [ - { - "name": "IMAGE_MENU_ICON", - "type": "png", - "file": "images/menuicon.png", - "menuIcon": true - }, - { - "name": "IMAGE_UP", - "type": "png", - "file": "images/up.png" - }, - { - "name": "IMAGE_UPUP", - "type": "png", - "file": "images/upup.png" - }, - { - "name": "IMAGE_UP45", - "type": "png", - "file": "images/up45.png" - }, - { - "name": "IMAGE_FLAT", - "type": "png", - "file": "images/flat.png" - }, - { - "name": "IMAGE_DOWN", - "type": "png", - "file": "images/down.png" - }, - { - "name": "IMAGE_DOWNDOWN", - "type": "png", - "file": "images/downdown.png" - }, - { - "name": "IMAGE_DOWN45", - "type": "png", - "file": "images/down45.png" - }, - { - "name": "IMAGE_NONE", - "type": "png", - "file": "images/none.png" - }, - { - "name": "IMAGE_LOGO", - "type": "png", - "file": "images/logo.png" - }, - { - "name": "IMAGE_BROKEN_ANTENNA", - "type": "png", - "file": "images/brokenantenna.png" - }, - { - "name": "IMAGE_BLOOD_DROP", - "type": "png", - "file": "images/blooddrop.png" - }, - { - "name": "IMAGE_STOP_LIGHT", - "type": "png", - "file": "images/stoplight.png" - }, - { - "name": "IMAGE_HOURGLASS", - "type": "png", - "file": "images/hourglass.png" - }, - { - "name": "IMAGE_QUESTION_MARKS", - "type": "png", - "file": "images/questionmarks.png" - }, - { - "name": "IMAGE_BATTFULL", - "type": "png", - "file": "images/battfull.png" - }, - { - "name": "IMAGE_BATT90", - "type": "png", - "file": "images/batt90.png" - }, - { - "name": "IMAGE_BATT80", - "type": "png", - "file": "images/batt80.png" - }, - { - "name": "IMAGE_BATT70", - "type": "png", - "file": "images/batt70.png" - }, - { - "name": "IMAGE_BATT60", - "type": "png", - "file": "images/batt60.png" - }, - { - "name": "IMAGE_BATT50", - "type": "png", - "file": "images/batt50.png" - }, - { - "name": "IMAGE_BATT40", - "type": "png", - "file": "images/batt40.png" - }, - { - "name": "IMAGE_BATT30", - "type": "png", - "file": "images/batt30.png" - }, - { - "name": "IMAGE_BATT20", - "type": "png", - "file": "images/batt20.png" - }, - { - "name": "IMAGE_BATT10", - "type": "png", - "file": "images/batt10.png" - }, - { - "name": "IMAGE_BATTEMPTY", - "type": "png", - "file": "images/battempty.png" - }, - { - "name": "IMAGE_BATTNONE", - "type": "png", - "file": "images/battnone.png" - } - ] - }, - "versionCode": 6, - "shortName": "CGM", - "longName": "CGM", - "watchapp": { - "watchface": true - }, - "companyName": "Nightscout contributors", - "versionLabel": "3.1.1" -} - +{ + "uuid": "a4e66a45-f30d-4a13-9f0f-59343c6b23a9", + "capabilities": [ + "configurable" + ], + "appKeys": { + "time": 4, + "delta": 5, + "readtime": 2, + "bg": 1, + "icon": 0, + "alert": 3, + "battlevel": 6, + "t1dname": 7 + }, + "resources": { + "media": [ + { + "name": "IMAGE_MENU_ICON", + "type": "png", + "file": "images/menuicon.png", + "menuIcon": true + }, + { + "name": "IMAGE_UP", + "type": "png", + "file": "images/up.png" + }, + { + "name": "IMAGE_UPUP", + "type": "png", + "file": "images/upup.png" + }, + { + "name": "IMAGE_UP45", + "type": "png", + "file": "images/up45.png" + }, + { + "name": "IMAGE_FLAT", + "type": "png", + "file": "images/flat.png" + }, + { + "name": "IMAGE_DOWN", + "type": "png", + "file": "images/down.png" + }, + { + "name": "IMAGE_DOWNDOWN", + "type": "png", + "file": "images/downdown.png" + }, + { + "name": "IMAGE_DOWN45", + "type": "png", + "file": "images/down45.png" + }, + { + "name": "IMAGE_NONE", + "type": "png", + "file": "images/none.png" + }, + { + "name": "IMAGE_LOGO", + "type": "png", + "file": "images/logo.png" + }, + { + "name": "IMAGE_BROKEN_ANTENNA", + "type": "png", + "file": "images/brokenantenna.png" + }, + { + "name": "IMAGE_BLOOD_DROP", + "type": "png", + "file": "images/blooddrop.png" + }, + { + "name": "IMAGE_STOP_LIGHT", + "type": "png", + "file": "images/stoplight.png" + }, + { + "name": "IMAGE_HOURGLASS", + "type": "png", + "file": "images/hourglass.png" + }, + { + "name": "IMAGE_QUESTION_MARKS", + "type": "png", + "file": "images/questionmarks.png" + }, + { + "name": "IMAGE_BATTFULL", + "type": "png", + "file": "images/battfull.png" + }, + { + "name": "IMAGE_BATT90", + "type": "png", + "file": "images/batt90.png" + }, + { + "name": "IMAGE_BATT80", + "type": "png", + "file": "images/batt80.png" + }, + { + "name": "IMAGE_BATT70", + "type": "png", + "file": "images/batt70.png" + }, + { + "name": "IMAGE_BATT60", + "type": "png", + "file": "images/batt60.png" + }, + { + "name": "IMAGE_BATT50", + "type": "png", + "file": "images/batt50.png" + }, + { + "name": "IMAGE_BATT40", + "type": "png", + "file": "images/batt40.png" + }, + { + "name": "IMAGE_BATT30", + "type": "png", + "file": "images/batt30.png" + }, + { + "name": "IMAGE_BATT20", + "type": "png", + "file": "images/batt20.png" + }, + { + "name": "IMAGE_BATT10", + "type": "png", + "file": "images/batt10.png" + }, + { + "name": "IMAGE_BATTEMPTY", + "type": "png", + "file": "images/battempty.png" + }, + { + "name": "IMAGE_BATTNONE", + "type": "png", + "file": "images/battnone.png" + } + ] + }, + "versionCode": 6, + "shortName": "CGM", + "longName": "CGM", + "watchapp": { + "watchface": true + }, + "companyName": "Nightscout contributors", + "versionLabel": "3.1.1" +} + diff --git a/resources/images/batt10.png b/resources/images/batt10.png old mode 100644 new mode 100755 diff --git a/resources/images/batt20.png b/resources/images/batt20.png old mode 100644 new mode 100755 diff --git a/resources/images/batt30.png b/resources/images/batt30.png old mode 100644 new mode 100755 diff --git a/resources/images/batt40.png b/resources/images/batt40.png old mode 100644 new mode 100755 diff --git a/resources/images/batt50.png b/resources/images/batt50.png old mode 100644 new mode 100755 diff --git a/resources/images/batt60.png b/resources/images/batt60.png old mode 100644 new mode 100755 diff --git a/resources/images/batt70.png b/resources/images/batt70.png old mode 100644 new mode 100755 diff --git a/resources/images/batt80.png b/resources/images/batt80.png old mode 100644 new mode 100755 diff --git a/resources/images/batt90.png b/resources/images/batt90.png old mode 100644 new mode 100755 diff --git a/resources/images/battempty.png b/resources/images/battempty.png old mode 100644 new mode 100755 diff --git a/resources/images/battfull.png b/resources/images/battfull.png old mode 100644 new mode 100755 diff --git a/resources/images/battnone.png b/resources/images/battnone.png old mode 100644 new mode 100755 diff --git a/resources/images/blooddrop.png b/resources/images/blooddrop.png old mode 100644 new mode 100755 diff --git a/resources/images/brokenantenna.png b/resources/images/brokenantenna.png old mode 100644 new mode 100755 diff --git a/resources/images/down.png b/resources/images/down.png old mode 100644 new mode 100755 diff --git a/resources/images/down45.png b/resources/images/down45.png old mode 100644 new mode 100755 diff --git a/resources/images/downdown.png b/resources/images/downdown.png deleted file mode 100644 index 593b1f2444340879c1977698cf007dc38c3ab507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9F5M?jcysy3fAP*5S+ zBgmJ5p-Pp3p`n?9;pcxK{gQ#9)PRBERRU1!3~)xpgwgkDV@A#eGMFxxT5t zQw;K8V)*1#Ia!?hAdB#y^9MaA<=9;^*_$#sHS*mp_xs=X9A**rF#yWpAbwSf3ufL9 zJ632@yD@WC*!|ZL*+-*x|GHT@Z|SO4M~lDT6V*+XX!|;uK_J;>TB^WA@4iJE8&rKS zACM?MDL1E>L(w5m{L8)7`XSd%zp1n==qo#?c#MPL{y~O->swDL9g`@DZCCCzJY>0i z6aV|a;$?zs45O|^wFnfbNtvGh{O5Y9YxS1A%|8-3Nzy}J1dR2L5hL5f3-C|pgp997f NgQu&X%Q~loCIG#V#gza6 diff --git a/resources/images/flat.png b/resources/images/flat.png old mode 100644 new mode 100755 diff --git a/resources/images/hourglass.png b/resources/images/hourglass.png old mode 100644 new mode 100755 diff --git a/resources/images/logo.png b/resources/images/logo.png old mode 100644 new mode 100755 diff --git a/resources/images/menuicon.png b/resources/images/menuicon.png old mode 100644 new mode 100755 diff --git a/resources/images/none.png b/resources/images/none.png old mode 100644 new mode 100755 diff --git a/resources/images/questionmarks.png b/resources/images/questionmarks.png old mode 100644 new mode 100755 index d9833c509a6bfd417436ec5872f590811b671b02..32574a468424a05f35a2fbe5c47a84eca71992fc GIT binary patch delta 2258 zcmV;@2rc*g5uXx}Wq+kfL_t(|+U#0cOcP%pJ#DA7WsxovD-bIPE?@x_*CHyQF)=18 zCN7DI3sKQ%ASC+WgE2m6;)^lS_+X-mk%&IHM58v5XpD-f3rLVvq9R2w0&VGZ@9+Qe zwcj^RYp2M||Fb9Q!`zuO_nzs!=Xd6|A|fLEMG)gJLtJoNaDQBITyR`)TyR|Qzd*3i zKo;q`KMiz~6$lxj7m7q8jE;`NY&N5>uMdNRgRokykjv%B$jCr(aWR%HTL!6Aia;O$ zvG~8wGI;EAxzN(mg7)@y3=9llbaWI9!$7OmV)pFWSiO2Rrc9Z_>pRHz`~B$b>_ls8 zD+UGzFf=p-B7cHXsYG^mHp2LG3!$4w z`xp!cYHx2RBBDSbKtx1lvzgRtwIIGqrJ}~hMviEk%|?}#m4f&T!_e{L$H`{1OlkPwY0Q^_zs7Is;a64_b-#lsG*@DtQJA0 zWiS}9aDU-K!3J{o?p?fn`!;l})9J8c#R|d3^6AqjJbwHbE|&`cAd|_kcI{fh{kz?6 z+`D%V-@kvKm`ms6h0|%r_)JJr;~<I8{+@?@q-Q?JV>{0-6ED{X?%Q~ zTz@VXnM@`sC@A3Z)6&xD(W6HbTf=_8pWJRYdA(lVx#s3(G8haz!PV8(9Kk-Hk31ev z$jE}|@9(D#8#eF;Ja_I~>gnkTT^9%h$nAEM-|y!bqRZu?lP6CS!!VrntUcDwUAQ zWbpZXq4P4C3=G3eUbGCZ&%VAs^!NAkLP~yqJ|}!c!rCX=!PbCs-sB!Rd73_U+p|H`HpisI06EeG9+C)2C0-)z!soUw^uE zY1q{DD_UDy(bUw$`y$H9%8;9zJ2BIWgc~<*PaJYW`ddQr9XQY=dT_U+$&VLId_4V};Ooh@I! zoW6Yd67`!QBD#3-VkoQx#j4e6x_|$^pfS9D{hIRf@;LoVBoaD(`gGLU6|+l!`SJy3 zvzgakU0sdL%uG&=3!0j<*==-4Lv z%z{6E{*2+_VNP2?K>>=2ihsfei(fG|Hip5$L0)(%EiFZAYHC!z!{OkG1%Q&05@cm% zP5z$N(9jUC$QKnAMc--o53E*e=%pZtjEoFqXJ-ql+bqk%VzF@Alu9KE3k$<0zCRZ1 za5&(0yE$#i$;psPrGofQrxPs8a@wR)si0H^0A8;bPN$O>Th(gyMG>?1uh8jqSh;c~5)%`lR4OqxHin|2qOdVA9FmffuxQaD^!N8e zrBZ=qS!lIdLDLxkM6vun90&y9bUI@xbr*L#b3kp-@cjHZ2h$DJcolrcHyz zVnJJ58&XqKp;D;?i49IatyT-K*9)`R42eVnolYl6Y>=-~sgRPAg7@#=V{~*B)22;> zLZLt)5Qx5=8*3f@_U#+(-o2YN8V#w{YFfN_F+F?sET%es=6}o?(&==hQmJU>%$aoQ z(k1eEJc9UvK!6@Td`S8E`J`5>NvG4%kt0Xw$B!R^_=q)h)YaATLPteKg`oUQM0DlK zl~Dc-ex^^KPIvCy5yXG@?j6mUGlv&xPn|kNE|)7RKPH#%?(W9(=g)cVPo6x%+qZ8K z2n2r19~l|JvwvsLLYs3zeEs?rCX)$vyFKdqef|11Iy*ag&TlfAc<<$ZT$X}n5e@?b z1DqX)NP>S29sgUOgXt?0d_Et>#>OJv``7yZ$ATkm(*OX&Fj0epR4R>FzQkg&px_b7 z9Dg^q2@BTgbkJ(GVQXVnhp_uOR^5sj~ym>Pf7Z=msy?g1yhYvBA#>0mXQ%Ok) zZQQs~@JnkY5m8J@D_SrSvIhTe{sHiB5F7u?LtJoNa9nU)a9nU)a9nU)a9nU)a9nU) ga9r@;D)^rP0PS6*9jH2%MgRZ+07*qoM6N<$f}vJYZU6uP delta 2223 zcmV;g2vGN*68sU6Wq*Q6L_t(|+U#0eOcPrdUcGl(D8+JBz@|i6Er>u<1>};GU{nYi zkq3Ebh>;jW)I^Cs8TCzHl=#LIi6)w;5sW4#NJ!9#L1MTBL_k485xJF1rR~sm*8lK_ z`8&?E-6;8!b52(>53^_H+w0r2_gddxGa`q>fw8f%@NY3O{C~?VLO4P=LO4P=LO4SB z??M<6iGhOMyBUnF@FSc_LtPY!L;wKL-`@|PK7E3jnHiX!orU%Fb+RL9JFpN=gds*|P_Vii!k%2*j9} zn1H^%KKTCqJAX`1PlLzf0g9p^IXM|jCKD7F7lT|b56#%&aG;R6TrPa^;ssV$SEJc% zMx9QFGMNkkfIXt3qR?bA;n}liadL8!hq1oCj-8#ISX*0*+1c3`A0Ll$xtxQcR;w{R zJsqp7t8rjpfQRAp`LMUQ7cX46fO&a&n3R-+6h(0`lz&Pk?%cT(%gf8Lv$GRJSx~~m z!^60J`*sd+sKa8h;Fm975D}4K7(_&LI2@RnnMsUcG#atHyPG#?m6esm7<#=PpFe-T zdBWemeZ$?mcXPl*B2mcBPMtc19*>8`SXo)YzyA7**jWI;f`S5^nVI3dVVliH>;nK` zMn(pXj(?5{@(LQX;^N}q=+UE_3La0NK82p19`-(pqTul1!95>L^wzf7*O-jKgRQNtn}1hYLN+)!h*?=#JV$jp9lm_|k_f|Yw{ue3##^B% z3Y(gm*eNfR88+HhS68v7riO zYzC{ZE(P(4`UPu*gny}C3gVohlUb{x4Ay!qvFer)=RzyMG@Y>p%;La{CF7D53 zT7iHiB_)7}pin3P5y9v4!LD7qh$X2)p@0Ji4#3FB2&=)}ZZ}vg7Jr^@4rUUG1orOT z3ne8bECx-}uz&x4LES94M+o=1bc3AJ=>)gi4Jwri{C+=pJRZ<$wV+n3!%m|Ob2^={ zva$jyl?o6MTrL+xM@NHJt0jKJE|&|ImX_E}irei5ilRWP)q+SQ3hPT)!VJRzB7#IB zfwi?Y=|`W2@J!qyR+Y_ zTK;M+EiIUtnTZJr3Akg&4y>xG60B5)vUl&^p~Ygs#Kc5QPEN+MvNG)J>)RB@$jAtm zm6c&~axx|*C85=7#rF1g;^&D7zkmN8^?E%|A=TB@;o{;VQGZ8)q9gDqFE1z7;PdnI zc<9g}9){Iw#opfDts(67dhy1M8-h|UHa3<>>@y65&CSh%7!rvDpFDX&C_1e_b)Yb?O zu~-~3ZOCLYAb-ISDhCCo8zN^z1SAqahzL^@1qOpb&?$q#0D8TiC-`vQQju4Iz{(swl1^}s!k1>u;?LGhi002ovPDHLkV1ndfH$?yd diff --git a/resources/images/stoplight.png b/resources/images/stoplight.png old mode 100644 new mode 100755 diff --git a/resources/images/up.png b/resources/images/up.png old mode 100644 new mode 100755 diff --git a/resources/images/up45.png b/resources/images/up45.png old mode 100644 new mode 100755 index 2e0e4ed34fcb2bdf35afdf94ebe4ac1f62821a08..455b4537d725c601fc8ad0831a640b9c67e6d616 GIT binary patch delta 525 zcmV+o0`mRI3Z?{*B!3BTNLh0L01m_e01m_fl`9S#0000WV@Og>004R=004l4008;_ z004mL004C`008P>0026e000+nl3&F}00053Nkl4rx~{|NbOHcuHXA6VptXk9dYNEj3~sj@>bib=rj$ZeRgd2Rz;?R@ z08~{4rPO>cLW!eoTLLh8XsyW@L)Kb49*@EECkGP|Ip>1V_t7*>S>UN?V@&Y8*{Zbn z9?rS%+LrExDSxEm7gMzE;k}=f$3^AvR4jntN}c>Kz2EOY?!}AD;W@FF%Y`?1?v)*e zfp5{8BWGWSwU%cN$I98h@A<88jFo-vtyyhLF|kwjVw8aO-hb@9uh(mSa188U2ab^D z1EpX;p$~^cK5z=`E4pplJm8erXLQJi0F;P*o;xWxCx15i@vuZ}Ft}7~5V&OQXmIJ+ zQQ#$D{|!E$&x^ojS>c@6E|k1j!1JB!2{FK}|sb0O0&#P%V}K00Q@ELqkwdXm50Hb7*gHAW1_*AaHVT zW@&6?00214V_;yO;OOGy$|S(RP*7A-Aje(f~3=)%z3mgLid_e5H z{Jc~KRKUo<@a-CiWMH_g3o?s=G{Bk+v=~Sq0Aiz*)Z%0y{eK0B)5}W=fZ~iXK(C8-r4y$sIz1(ija=@}&ohL)C=3XUoHNvR6KmBl5gxy1^e zdCB=j1^GpZC8;SuwNN`ifY&9zM8Q2VGf%oGbb0qUZ<~J;sEFCPj zSoK(2S?{q~vQ1Ve5b_{%L!I>*10xuwt;r8_SO!@jyg_i&Ppx{uJUdQ?#dqOp1NKp-Znn& zzQKM8{(t!a^??(EmIm(%xfuE~oGC&s(kdz32ceFNnyziDQi-1rgLOi zWM*c~&Ayn+o@bw5QLw4-U9omaR_Us;Hx>GoB~`m>7;C-irq(}f)N86~KHDnSR@i>D zQ@X3D`*g2rUt|B>i8hmFPyRbKe%j#~8Z-N6eSe>mF!%I)^94&6i7aki@@-k>@_Q>o zR-InsvUcBk%MIH$nQY#&)nwcD9acN{?{?jDc3;^32M2Qw{XEisO#JwYlh&usok>3X z>-?mP+Lw-ANxb^+`kb3Kx9;Alzo&fv#KXMDVo&xz%X}g7^5E+vW9o-QKQNtM(S_@pW$jtl8mkzyr)4&7M#<4@SM&Z0gJ9LR;gf4o2JUwio3( z_WM0;iC+{j8iK}5ON(}vuBys3Xu79Y)TbqTV&aA~zBrm`^_m&(-CbRWv?$=ASPbcz zT78%P^jxf!D%dCX@p#Y@FEz05nSH;1-?YSxcI}|~IA*&8S6q^U&v2+?_Vs$v5;KAa zDa6d$fop3?!N4K0c1Q{W_Kn5%`mVj7&nNvv_q>BcU~OHrg6_EMkF?6rBPVvB8LoP6dlZVC0HU35&#F^dCAk zEE)txpU^2{(O@v@qEp2pFJNTR$K#RKq?y+bwcziz_CqPDR{rN9_X;@o3OM%)IPZ-4 Z0rW;xVUHqmZ2$lO07*qoM6N;tV1j-DcQyb3 diff --git a/resources/images/upup.png b/resources/images/upup.png old mode 100644 new mode 100755 index 1e12c091447b0fe777464ac7f31086516de1e2c9..c82440d703e23457a434c115b4ad841777eafe1c GIT binary patch delta 799 zcmV+)1K|Am38@B<7k@Gc1^@s60QR^700009a7bBm000ie000ie0hKEb8vp(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZ;uSrBfRCwC#*}qFN zaU2Kmch~76C=rPS4Y>qn)ZmyyL=iLuQQ*)RIP?dE&?qfILw^u0ZA!Be?k>_&;SdK& zltW}iM2dywdGD6T2cM_MJbyhyem?LS@7|x+-Ix2GULQ%+)CT|yer}Z&^jN6?*h}D^ zyTbw&uz(xa^Yb&(=`>znU%NW|)zuYlZ*NhlRLmd54%gGu6NAAZ0dQ??jV~`R>_+YG z?$TnhaBgmnmw%U+W)J)5DEQ&wf$Qt*{I%5)0GF4SJBl_8gW+(PcDwy|#>~tNHBI}! z;Jdp!uCA{BfvxuR^fa%puiMVhb)BJ5h&G$;OUB5^2$RVqE0s$3!I?~ke!u^p*lPQH zKAxSOwVd(z_{f!&6)K8SH^b#}F_B16*Y)m!HBD=Xt$+5^)D%xnPFh+$fk1$&sy56} zRh990ydJtea4MCe*XuQft+vzY5QA38`BrGwhs;tSSpn|11^`#jKyMfxm-;T z0)T^qgFHMuY?yO;ddkVk$(AwzFdPoESS+>&et&;wG#cg5&``^R0HD=s<=)=jx2wnF z@wAlzfPY(CTeaxsz@<`&`}_NC4^i8jo10&rtnql9qobo8%UE1oWIms74qPY{xV^po z?NhSV-q_fv4#Y?#!r|fJj%Uoz&oh_Hef06KzdY*I{rx@8&(C4A*+3GCqCizuq|<5a z?Cc<$%{Dy8z`y_&78c<3dZFt&NWw4-=(>)jrGF)ijg3LmG`zjNp})T$B;jy4kj-Wh z3Wbo#WK6w11_A+$kB`GJ3{-g}F)=YwZhKq0xVWIt=QDMc-EKFJkB^(q$mMdJot-s( zH)F9_-EB#JEeTk_0v51<1uS3z3s}Gc7O;Q?EMNf(Sik}nuz&?DU;(#Wraz|rkSfcP d{ut@?IRMgCgIqn4>l6S0002ovPDHLkV1hirf9(JO delta 1247 zcmV<51R(pV2Kfn)7k@km1^@s6I{evk00004XF*Lt007|pVNflW0008_X+uL$P-t&- zZ*ypGa3D!TLm+T+Z)Rz1WdHy;%VS_*p5W->Fp4v}FqSf|V7$j9#uUUff$0LX zFmojHLgqItmMk4Cw^;R9TUqb1S+Y%I`^Fy5zMDgdql@DUXCmhXE=R5{+?w1Ac%*oy z@(S@z;uGeZ#xKLaSU^W$hoGzA6`@q2AHuyNDk6JD!+%A;h)ohV62Br*At@($Oe$Ym zTKa@cnXJ0(ExA5<7x_O5TNMkH^pxHzuT?2fHBtSkc2K=bBUDpK^Mlp_?MXVRx>kCE zdav}47%VWXHHtB|HIX-EHhpP!!F;F163Yozb=J8yakhbWuJ+ar#*R8pYR*b73a;{Q z3hv4t>VKZPUMAi)KJLE3ehL2h0ri0sgO&#G3b`2iGMp(wF48J0BDx}GX6&B02MKJ6 zx=CTl4Jm6Do(SY&2q&CR};%bsVSUs15B@LjQXNml8qvNsj_l_gcXY8Y$1>ZaB| zY}9M2X+GO3*H+kmv{SmPsQYxUYF}gj-HA4nW`9rqJ2igV;Tak;`)7ThlQ8%6eDeiM z7l|xxUGi;N=JIbV>VoCj^kLVBS0^y^T>fu=r2$g(K??i81ik2J0i>-5$28vb4P@^Bf{JfVeW`9 zcSM*wBFr5TG3Jg4b4P@^^EhGoM?7~#m^&iO9TDb^2=gWgJ^*3002ov JPDHLkV1m5JL!1Br diff --git a/resources/img/batt10.png b/resources/img/batt10.png old mode 100644 new mode 100755 diff --git a/resources/img/batt20.png b/resources/img/batt20.png old mode 100644 new mode 100755 diff --git a/resources/img/batt30.png b/resources/img/batt30.png old mode 100644 new mode 100755 diff --git a/resources/img/batt40.png b/resources/img/batt40.png old mode 100644 new mode 100755 diff --git a/resources/img/batt50.png b/resources/img/batt50.png old mode 100644 new mode 100755 diff --git a/resources/img/batt60.png b/resources/img/batt60.png old mode 100644 new mode 100755 diff --git a/resources/img/batt70.png b/resources/img/batt70.png old mode 100644 new mode 100755 diff --git a/resources/img/batt80.png b/resources/img/batt80.png old mode 100644 new mode 100755 diff --git a/resources/img/batt90.png b/resources/img/batt90.png old mode 100644 new mode 100755 diff --git a/resources/img/battempty.png b/resources/img/battempty.png old mode 100644 new mode 100755 diff --git a/resources/img/battfull.png b/resources/img/battfull.png old mode 100644 new mode 100755 diff --git a/resources/img/battnone.png b/resources/img/battnone.png old mode 100644 new mode 100755 diff --git a/resources/img/blooddrop.png b/resources/img/blooddrop.png old mode 100644 new mode 100755 diff --git a/resources/img/brokenantenna.png b/resources/img/brokenantenna.png old mode 100644 new mode 100755 diff --git a/resources/img/down.png b/resources/img/down.png old mode 100644 new mode 100755 diff --git a/resources/img/down45.png b/resources/img/down45.png old mode 100644 new mode 100755 diff --git a/resources/img/downdown.png b/resources/img/downdown.png deleted file mode 100644 index 593b1f2444340879c1977698cf007dc38c3ab507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9F5M?jcysy3fAP*5S+ zBgmJ5p-Pp3p`n?9;pcxK{gQ#9)PRBERRU1!3~)xpgwgkDV@A#eGMFxxT5t zQw;K8V)*1#Ia!?hAdB#y^9MaA<=9;^*_$#sHS*mp_xs=X9A**rF#yWpAbwSf3ufL9 zJ632@yD@WC*!|ZL*+-*x|GHT@Z|SO4M~lDT6V*+XX!|;uK_J;>TB^WA@4iJE8&rKS zACM?MDL1E>L(w5m{L8)7`XSd%zp1n==qo#?c#MPL{y~O->swDL9g`@DZCCCzJY>0i z6aV|a;$?zs45O|^wFnfbNtvGh{O5Y9YxS1A%|8-3Nzy}J1dR2L5hL5f3-C|pgp997f NgQu&X%Q~loCIG#V#gza6 diff --git a/resources/img/flat.png b/resources/img/flat.png old mode 100644 new mode 100755 diff --git a/resources/img/hourglass.png b/resources/img/hourglass.png old mode 100644 new mode 100755 diff --git a/resources/img/logo.png b/resources/img/logo.png old mode 100644 new mode 100755 diff --git a/resources/img/menuicon.png b/resources/img/menuicon.png old mode 100644 new mode 100755 diff --git a/resources/img/none.png b/resources/img/none.png old mode 100644 new mode 100755 diff --git a/resources/img/questionmarks.png b/resources/img/questionmarks.png old mode 100644 new mode 100755 index d9833c509a6bfd417436ec5872f590811b671b02..32574a468424a05f35a2fbe5c47a84eca71992fc GIT binary patch delta 2258 zcmV;@2rc*g5uXx}Wq+kfL_t(|+U#0cOcP%pJ#DA7WsxovD-bIPE?@x_*CHyQF)=18 zCN7DI3sKQ%ASC+WgE2m6;)^lS_+X-mk%&IHM58v5XpD-f3rLVvq9R2w0&VGZ@9+Qe zwcj^RYp2M||Fb9Q!`zuO_nzs!=Xd6|A|fLEMG)gJLtJoNaDQBITyR`)TyR|Qzd*3i zKo;q`KMiz~6$lxj7m7q8jE;`NY&N5>uMdNRgRokykjv%B$jCr(aWR%HTL!6Aia;O$ zvG~8wGI;EAxzN(mg7)@y3=9llbaWI9!$7OmV)pFWSiO2Rrc9Z_>pRHz`~B$b>_ls8 zD+UGzFf=p-B7cHXsYG^mHp2LG3!$4w z`xp!cYHx2RBBDSbKtx1lvzgRtwIIGqrJ}~hMviEk%|?}#m4f&T!_e{L$H`{1OlkPwY0Q^_zs7Is;a64_b-#lsG*@DtQJA0 zWiS}9aDU-K!3J{o?p?fn`!;l})9J8c#R|d3^6AqjJbwHbE|&`cAd|_kcI{fh{kz?6 z+`D%V-@kvKm`ms6h0|%r_)JJr;~<I8{+@?@q-Q?JV>{0-6ED{X?%Q~ zTz@VXnM@`sC@A3Z)6&xD(W6HbTf=_8pWJRYdA(lVx#s3(G8haz!PV8(9Kk-Hk31ev z$jE}|@9(D#8#eF;Ja_I~>gnkTT^9%h$nAEM-|y!bqRZu?lP6CS!!VrntUcDwUAQ zWbpZXq4P4C3=G3eUbGCZ&%VAs^!NAkLP~yqJ|}!c!rCX=!PbCs-sB!Rd73_U+p|H`HpisI06EeG9+C)2C0-)z!soUw^uE zY1q{DD_UDy(bUw$`y$H9%8;9zJ2BIWgc~<*PaJYW`ddQr9XQY=dT_U+$&VLId_4V};Ooh@I! zoW6Yd67`!QBD#3-VkoQx#j4e6x_|$^pfS9D{hIRf@;LoVBoaD(`gGLU6|+l!`SJy3 zvzgakU0sdL%uG&=3!0j<*==-4Lv z%z{6E{*2+_VNP2?K>>=2ihsfei(fG|Hip5$L0)(%EiFZAYHC!z!{OkG1%Q&05@cm% zP5z$N(9jUC$QKnAMc--o53E*e=%pZtjEoFqXJ-ql+bqk%VzF@Alu9KE3k$<0zCRZ1 za5&(0yE$#i$;psPrGofQrxPs8a@wR)si0H^0A8;bPN$O>Th(gyMG>?1uh8jqSh;c~5)%`lR4OqxHin|2qOdVA9FmffuxQaD^!N8e zrBZ=qS!lIdLDLxkM6vun90&y9bUI@xbr*L#b3kp-@cjHZ2h$DJcolrcHyz zVnJJ58&XqKp;D;?i49IatyT-K*9)`R42eVnolYl6Y>=-~sgRPAg7@#=V{~*B)22;> zLZLt)5Qx5=8*3f@_U#+(-o2YN8V#w{YFfN_F+F?sET%es=6}o?(&==hQmJU>%$aoQ z(k1eEJc9UvK!6@Td`S8E`J`5>NvG4%kt0Xw$B!R^_=q)h)YaATLPteKg`oUQM0DlK zl~Dc-ex^^KPIvCy5yXG@?j6mUGlv&xPn|kNE|)7RKPH#%?(W9(=g)cVPo6x%+qZ8K z2n2r19~l|JvwvsLLYs3zeEs?rCX)$vyFKdqef|11Iy*ag&TlfAc<<$ZT$X}n5e@?b z1DqX)NP>S29sgUOgXt?0d_Et>#>OJv``7yZ$ATkm(*OX&Fj0epR4R>FzQkg&px_b7 z9Dg^q2@BTgbkJ(GVQXVnhp_uOR^5sj~ym>Pf7Z=msy?g1yhYvBA#>0mXQ%Ok) zZQQs~@JnkY5m8J@D_SrSvIhTe{sHiB5F7u?LtJoNa9nU)a9nU)a9nU)a9nU)a9nU) ga9r@;D)^rP0PS6*9jH2%MgRZ+07*qoM6N<$f}vJYZU6uP delta 2223 zcmV;g2vGN*68sU6Wq*Q6L_t(|+U#0eOcPrdUcGl(D8+JBz@|i6Er>u<1>};GU{nYi zkq3Ebh>;jW)I^Cs8TCzHl=#LIi6)w;5sW4#NJ!9#L1MTBL_k485xJF1rR~sm*8lK_ z`8&?E-6;8!b52(>53^_H+w0r2_gddxGa`q>fw8f%@NY3O{C~?VLO4P=LO4P=LO4SB z??M<6iGhOMyBUnF@FSc_LtPY!L;wKL-`@|PK7E3jnHiX!orU%Fb+RL9JFpN=gds*|P_Vii!k%2*j9} zn1H^%KKTCqJAX`1PlLzf0g9p^IXM|jCKD7F7lT|b56#%&aG;R6TrPa^;ssV$SEJc% zMx9QFGMNkkfIXt3qR?bA;n}liadL8!hq1oCj-8#ISX*0*+1c3`A0Ll$xtxQcR;w{R zJsqp7t8rjpfQRAp`LMUQ7cX46fO&a&n3R-+6h(0`lz&Pk?%cT(%gf8Lv$GRJSx~~m z!^60J`*sd+sKa8h;Fm975D}4K7(_&LI2@RnnMsUcG#atHyPG#?m6esm7<#=PpFe-T zdBWemeZ$?mcXPl*B2mcBPMtc19*>8`SXo)YzyA7**jWI;f`S5^nVI3dVVliH>;nK` zMn(pXj(?5{@(LQX;^N}q=+UE_3La0NK82p19`-(pqTul1!95>L^wzf7*O-jKgRQNtn}1hYLN+)!h*?=#JV$jp9lm_|k_f|Yw{ue3##^B% z3Y(gm*eNfR88+HhS68v7riO zYzC{ZE(P(4`UPu*gny}C3gVohlUb{x4Ay!qvFer)=RzyMG@Y>p%;La{CF7D53 zT7iHiB_)7}pin3P5y9v4!LD7qh$X2)p@0Ji4#3FB2&=)}ZZ}vg7Jr^@4rUUG1orOT z3ne8bECx-}uz&x4LES94M+o=1bc3AJ=>)gi4Jwri{C+=pJRZ<$wV+n3!%m|Ob2^={ zva$jyl?o6MTrL+xM@NHJt0jKJE|&|ImX_E}irei5ilRWP)q+SQ3hPT)!VJRzB7#IB zfwi?Y=|`W2@J!qyR+Y_ zTK;M+EiIUtnTZJr3Akg&4y>xG60B5)vUl&^p~Ygs#Kc5QPEN+MvNG)J>)RB@$jAtm zm6c&~axx|*C85=7#rF1g;^&D7zkmN8^?E%|A=TB@;o{;VQGZ8)q9gDqFE1z7;PdnI zc<9g}9){Iw#opfDts(67dhy1M8-h|UHa3<>>@y65&CSh%7!rvDpFDX&C_1e_b)Yb?O zu~-~3ZOCLYAb-ISDhCCo8zN^z1SAqahzL^@1qOpb&?$q#0D8TiC-`vQQju4Iz{(swl1^}s!k1>u;?LGhi002ovPDHLkV1ndfH$?yd diff --git a/resources/img/stoplight.png b/resources/img/stoplight.png old mode 100644 new mode 100755 diff --git a/resources/img/up.png b/resources/img/up.png old mode 100644 new mode 100755 diff --git a/resources/img/up45.png b/resources/img/up45.png old mode 100644 new mode 100755 index 2e0e4ed34fcb2bdf35afdf94ebe4ac1f62821a08..455b4537d725c601fc8ad0831a640b9c67e6d616 GIT binary patch delta 525 zcmV+o0`mRI3Z?{*B!3BTNLh0L01m_e01m_fl`9S#0000WV@Og>004R=004l4008;_ z004mL004C`008P>0026e000+nl3&F}00053Nkl4rx~{|NbOHcuHXA6VptXk9dYNEj3~sj@>bib=rj$ZeRgd2Rz;?R@ z08~{4rPO>cLW!eoTLLh8XsyW@L)Kb49*@EECkGP|Ip>1V_t7*>S>UN?V@&Y8*{Zbn z9?rS%+LrExDSxEm7gMzE;k}=f$3^AvR4jntN}c>Kz2EOY?!}AD;W@FF%Y`?1?v)*e zfp5{8BWGWSwU%cN$I98h@A<88jFo-vtyyhLF|kwjVw8aO-hb@9uh(mSa188U2ab^D z1EpX;p$~^cK5z=`E4pplJm8erXLQJi0F;P*o;xWxCx15i@vuZ}Ft}7~5V&OQXmIJ+ zQQ#$D{|!E$&x^ojS>c@6E|k1j!1JB!2{FK}|sb0O0&#P%V}K00Q@ELqkwdXm50Hb7*gHAW1_*AaHVT zW@&6?00214V_;yO;OOGy$|S(RP*7A-Aje(f~3=)%z3mgLid_e5H z{Jc~KRKUo<@a-CiWMH_g3o?s=G{Bk+v=~Sq0Aiz*)Z%0y{eK0B)5}W=fZ~iXK(C8-r4y$sIz1(ija=@}&ohL)C=3XUoHNvR6KmBl5gxy1^e zdCB=j1^GpZC8;SuwNN`ifY&9zM8Q2VGf%oGbb0qUZ<~J;sEFCPj zSoK(2S?{q~vQ1Ve5b_{%L!I>*10xuwt;r8_SO!@jyg_i&Ppx{uJUdQ?#dqOp1NKp-Znn& zzQKM8{(t!a^??(EmIm(%xfuE~oGC&s(kdz32ceFNnyziDQi-1rgLOi zWM*c~&Ayn+o@bw5QLw4-U9omaR_Us;Hx>GoB~`m>7;C-irq(}f)N86~KHDnSR@i>D zQ@X3D`*g2rUt|B>i8hmFPyRbKe%j#~8Z-N6eSe>mF!%I)^94&6i7aki@@-k>@_Q>o zR-InsvUcBk%MIH$nQY#&)nwcD9acN{?{?jDc3;^32M2Qw{XEisO#JwYlh&usok>3X z>-?mP+Lw-ANxb^+`kb3Kx9;Alzo&fv#KXMDVo&xz%X}g7^5E+vW9o-QKQNtM(S_@pW$jtl8mkzyr)4&7M#<4@SM&Z0gJ9LR;gf4o2JUwio3( z_WM0;iC+{j8iK}5ON(}vuBys3Xu79Y)TbqTV&aA~zBrm`^_m&(-CbRWv?$=ASPbcz zT78%P^jxf!D%dCX@p#Y@FEz05nSH;1-?YSxcI}|~IA*&8S6q^U&v2+?_Vs$v5;KAa zDa6d$fop3?!N4K0c1Q{W_Kn5%`mVj7&nNvv_q>BcU~OHrg6_EMkF?6rBPVvB8LoP6dlZVC0HU35&#F^dCAk zEE)txpU^2{(O@v@qEp2pFJNTR$K#RKq?y+bwcziz_CqPDR{rN9_X;@o3OM%)IPZ-4 Z0rW;xVUHqmZ2$lO07*qoM6N;tV1j-DcQyb3 diff --git a/resources/img/upup.png b/resources/img/upup.png old mode 100644 new mode 100755 index 1e12c091447b0fe777464ac7f31086516de1e2c9..c82440d703e23457a434c115b4ad841777eafe1c GIT binary patch delta 799 zcmV+)1K|Am38@B<7k@Gc1^@s60QR^700009a7bBm000ie000ie0hKEb8vp(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZ;uSrBfRCwC#*}qFN zaU2Kmch~76C=rPS4Y>qn)ZmyyL=iLuQQ*)RIP?dE&?qfILw^u0ZA!Be?k>_&;SdK& zltW}iM2dywdGD6T2cM_MJbyhyem?LS@7|x+-Ix2GULQ%+)CT|yer}Z&^jN6?*h}D^ zyTbw&uz(xa^Yb&(=`>znU%NW|)zuYlZ*NhlRLmd54%gGu6NAAZ0dQ??jV~`R>_+YG z?$TnhaBgmnmw%U+W)J)5DEQ&wf$Qt*{I%5)0GF4SJBl_8gW+(PcDwy|#>~tNHBI}! z;Jdp!uCA{BfvxuR^fa%puiMVhb)BJ5h&G$;OUB5^2$RVqE0s$3!I?~ke!u^p*lPQH zKAxSOwVd(z_{f!&6)K8SH^b#}F_B16*Y)m!HBD=Xt$+5^)D%xnPFh+$fk1$&sy56} zRh990ydJtea4MCe*XuQft+vzY5QA38`BrGwhs;tSSpn|11^`#jKyMfxm-;T z0)T^qgFHMuY?yO;ddkVk$(AwzFdPoESS+>&et&;wG#cg5&``^R0HD=s<=)=jx2wnF z@wAlzfPY(CTeaxsz@<`&`}_NC4^i8jo10&rtnql9qobo8%UE1oWIms74qPY{xV^po z?NhSV-q_fv4#Y?#!r|fJj%Uoz&oh_Hef06KzdY*I{rx@8&(C4A*+3GCqCizuq|<5a z?Cc<$%{Dy8z`y_&78c<3dZFt&NWw4-=(>)jrGF)ijg3LmG`zjNp})T$B;jy4kj-Wh z3Wbo#WK6w11_A+$kB`GJ3{-g}F)=YwZhKq0xVWIt=QDMc-EKFJkB^(q$mMdJot-s( zH)F9_-EB#JEeTk_0v51<1uS3z3s}Gc7O;Q?EMNf(Sik}nuz&?DU;(#Wraz|rkSfcP d{ut@?IRMgCgIqn4>l6S0002ovPDHLkV1hirf9(JO delta 1247 zcmV<51R(pV2Kfn)7k@km1^@s6I{evk00004XF*Lt007|pVNflW0008_X+uL$P-t&- zZ*ypGa3D!TLm+T+Z)Rz1WdHy;%VS_*p5W->Fp4v}FqSf|V7$j9#uUUff$0LX zFmojHLgqItmMk4Cw^;R9TUqb1S+Y%I`^Fy5zMDgdql@DUXCmhXE=R5{+?w1Ac%*oy z@(S@z;uGeZ#xKLaSU^W$hoGzA6`@q2AHuyNDk6JD!+%A;h)ohV62Br*At@($Oe$Ym zTKa@cnXJ0(ExA5<7x_O5TNMkH^pxHzuT?2fHBtSkc2K=bBUDpK^Mlp_?MXVRx>kCE zdav}47%VWXHHtB|HIX-EHhpP!!F;F163Yozb=J8yakhbWuJ+ar#*R8pYR*b73a;{Q z3hv4t>VKZPUMAi)KJLE3ehL2h0ri0sgO&#G3b`2iGMp(wF48J0BDx}GX6&B02MKJ6 zx=CTl4Jm6Do(SY&2q&CR};%bsVSUs15B@LjQXNml8qvNsj_l_gcXY8Y$1>ZaB| zY}9M2X+GO3*H+kmv{SmPsQYxUYF}gj-HA4nW`9rqJ2igV;Tak;`)7ThlQ8%6eDeiM z7l|xxUGi;N=JIbV>VoCj^kLVBS0^y^T>fu=r2$g(K??i81ik2J0i>-5$28vb4P@^Bf{JfVeW`9 zcSM*wBFr5TG3Jg4b4P@^^EhGoM?7~#m^&iO9TDb^2=gWgJ^*3002ov JPDHLkV1m5JL!1Br diff --git a/src/cgm.c b/src/cgm.c old mode 100644 new mode 100755 index 66fb59f..e175d34 --- a/src/cgm.c +++ b/src/cgm.c @@ -1,538 +1,538 @@ -#include "pebble.h" - -static Window *window; - -static TextLayer *bg_layer; -static TextLayer *readtime_layer; -static TextLayer *datetime_layer; -static BitmapLayer *icon_layer; -static TextLayer *message_layer; // BG DELTA & MESSAGE LAYER -static TextLayer *time_layer; -static BitmapLayer *batticon_layer; -static TextLayer *battlevel_layer; -static TextLayer *t1dname_layer; -static TextLayer *date_layer; -static char time_text[] = "00:00"; -static char date_text[] = "Wed 13 "; -static GBitmap *icon_bitmap = NULL; -static GBitmap *specialvalue_bitmap = NULL; -static GBitmap *batticon_bitmap = NULL; - -static void draw_date() { - - time_t now = time(NULL); - struct tm *t = localtime(&now); - - strftime(time_text, sizeof(time_text), "%l:%M", t); - strftime(date_text, sizeof(date_text), "%a %d", t); - - text_layer_set_text(time_layer, time_text); - text_layer_set_text(date_layer, date_text); -} - -static AppSync sync; -static AppTimer *timer; - -static uint8_t sync_buffer[256]; -static char new_time[124]; -static char last_bg[124]; -static uint8_t icon_array[] = {0,10}; -static uint8_t current_bg = 0; - -static const uint32_t const high[] = { 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100}; -static const uint32_t const low[] = { 1000,100,2000}; - -static const uint32_t const hypo[] = { 3200,200,3200 }; -static const uint32_t const hyper[] = { 50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150 }; - -static const uint32_t const trend_high[] = { 200,200,1000,200,200,200,1000 }; -static const uint32_t const trend_low[] = { 2000,200,1000 }; - -static const uint32_t const alert[] = { 500,200,1000 }; - - -enum CgmKey { - CGM_ICON_KEY = 0x0, // TUPLE_BYTE_ARRAY - CGM_BG_KEY = 0x1, // TUPLE_CSTRING - CGM_READTIME_KEY = 0x2, // TUPLE_CSTRING - CGM_ALERT_KEY = 0x3, // TUPLE_INT - CGM_TIME_NOW = 0x4, // TUPLE_CSTRING - CGM_DELTA_KEY = 0x5, // TUPLE_CSTRING - CGM_BATTLEVEL_KEY = 0x6, // TUPLE_CSTRING - CGM_T1DNAME_KEY = 0x7 // TUPLE_CSTRING -}; - -static const uint8_t NO_ANTENNA_VALUE = 3; -static const uint8_t SENSOR_NOT_CALIBRATED_VALUE = 5; -static const uint8_t STOP_LIGHT_VALUE = 6; -static const uint8_t HOURGLASS_VALUE = 9; -static const uint8_t QUESTION_MARKS_VALUE = 10; -static const uint8_t BAD_RF_VALUE = 12; - -static const uint32_t SPECIAL_VALUE_ICONS[] = { - RESOURCE_ID_IMAGE_BROKEN_ANTENNA, //0 - RESOURCE_ID_IMAGE_BLOOD_DROP, //1 - RESOURCE_ID_IMAGE_STOP_LIGHT, //2 - RESOURCE_ID_IMAGE_HOURGLASS, //3 - RESOURCE_ID_IMAGE_QUESTION_MARKS //4 -}; - -static const uint32_t CGM_ICONS[] = { // COMMUNITY Build Order - RESOURCE_ID_IMAGE_NONE, //0 - RESOURCE_ID_IMAGE_UPUP, //1 - RESOURCE_ID_IMAGE_UP, //2 - RESOURCE_ID_IMAGE_UP45, //3 - RESOURCE_ID_IMAGE_FLAT, //4 - RESOURCE_ID_IMAGE_DOWN45, //5 - RESOURCE_ID_IMAGE_DOWN, //6 - RESOURCE_ID_IMAGE_DOWNDOWN, //7 - RESOURCE_ID_IMAGE_NONE, //8 - RESOURCE_ID_IMAGE_NONE, //9 - RESOURCE_ID_IMAGE_LOGO //10 -}; - -static const uint32_t CGM_ICONS_RAJAT[] = { // RAJAT Build Order - RESOURCE_ID_IMAGE_UPUP, //0 - RESOURCE_ID_IMAGE_UP, //1 - RESOURCE_ID_IMAGE_UP45, //2 - RESOURCE_ID_IMAGE_FLAT, //3 - RESOURCE_ID_IMAGE_NONE, //4 - RESOURCE_ID_IMAGE_DOWN45, //5 - RESOURCE_ID_IMAGE_DOWN, //6 - RESOURCE_ID_IMAGE_DOWNDOWN, //7 - RESOURCE_ID_IMAGE_NONE, //8 - RESOURCE_ID_IMAGE_NONE, //9 - RESOURCE_ID_IMAGE_LOGO //10 -}; - -static const uint32_t BATTLEVEL_ICONS[] = { - RESOURCE_ID_IMAGE_BATTEMPTY, //0 - RESOURCE_ID_IMAGE_BATT10, //1 - RESOURCE_ID_IMAGE_BATT20, //2 - RESOURCE_ID_IMAGE_BATT30, //3 - RESOURCE_ID_IMAGE_BATT40, //4 - RESOURCE_ID_IMAGE_BATT50, //5 - RESOURCE_ID_IMAGE_BATT60, //6 - RESOURCE_ID_IMAGE_BATT70, //7 - RESOURCE_ID_IMAGE_BATT80, //8 - RESOURCE_ID_IMAGE_BATT90, //9 - RESOURCE_ID_IMAGE_BATTFULL, //10 - RESOURCE_ID_IMAGE_BATTNONE //11 -}; - -static void sync_error_callback(DictionaryResult dict_error, AppMessageResult app_message_error, void *context) { - text_layer_set_text(message_layer, "WATCH OFFLINE"); - - // VibePattern pat = { - // .durations = alert, - // .num_segments = ARRAY_LENGTH(alert), - // }; - vibes_double_pulse(); - //vibes_enqueue_custom_pattern(pat); -} - -static void alert_handler(uint8_t alertValue) -{ - APP_LOG(APP_LOG_LEVEL_DEBUG, "Alert code: %d", alertValue); - - switch (alertValue){ - //No alert - case 0: - break; - - //Normal (new data, in range, trend okay) - case 1: - vibes_double_pulse(); - break; - - //Low - case 2:; - VibePattern lowpat = { - .durations = low, - .num_segments = ARRAY_LENGTH(low), - }; - vibes_enqueue_custom_pattern(lowpat); - //vibes_double_pulse(lowpat); - break; - - //High - case 3:; - VibePattern highpat = { - .durations = high, - .num_segments = ARRAY_LENGTH(high), - }; - vibes_enqueue_custom_pattern(highpat); - break; - - //Hypo - - //Hyper - - //Trend Low - - //Trend High - - //Data Alert - - } - -} - -static void sync_tuple_changed_callback(const uint32_t key, const Tuple* new_tuple, const Tuple* old_tuple, void* context) { - - APP_LOG(APP_LOG_LEVEL_INFO, "sync tuple"); - switch (key) { - - case CGM_ICON_KEY: - APP_LOG(APP_LOG_LEVEL_INFO, "ICON ARROW"); - // if SpecialValue already set, then break - if (specialvalue_bitmap) { - break; - } - - // no SpecialValue, so set regular icon - if (icon_bitmap) { - gbitmap_destroy(icon_bitmap); - } - - // set the right arrow into the bitmap - if (new_tuple->value->data[0]) { // will be true if this is a Rajat build - icon_bitmap = gbitmap_create_with_resource(CGM_ICONS_RAJAT[new_tuple->value->data[1]]); - } - else { - icon_bitmap = gbitmap_create_with_resource(CGM_ICONS[new_tuple->value->data[1]]); - } - - bitmap_layer_set_bitmap(icon_layer, icon_bitmap); - break; - - case CGM_BG_KEY: - APP_LOG(APP_LOG_LEVEL_INFO, "BG CURRENT"); - if (specialvalue_bitmap) { - gbitmap_destroy(specialvalue_bitmap); - } - - // get current BG - strncpy(last_bg, new_tuple->value->cstring, 124); - current_bg = atoi(last_bg); - - // check for special value, if special value, then replace icon and blank BG; else send current BG - if ((current_bg == NO_ANTENNA_VALUE) || (current_bg == BAD_RF_VALUE)) { - text_layer_set_text(bg_layer, ""); - specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[0]); - bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); - } - else if (current_bg == SENSOR_NOT_CALIBRATED_VALUE) { - text_layer_set_text(bg_layer, ""); - specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[1]); - bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); - } - else if (current_bg == STOP_LIGHT_VALUE) { - text_layer_set_text(bg_layer, ""); - specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[2]); - bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); - } - else if (current_bg == HOURGLASS_VALUE) { - text_layer_set_text(bg_layer, ""); - specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[3]); - bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); - } - else if (current_bg == QUESTION_MARKS_VALUE) { - text_layer_set_text(bg_layer, ""); - specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[4]); - bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); - } - else { - text_layer_set_text(bg_layer, new_tuple->value->cstring); - } - - break; // break for CGM_BG_KEY - - case CGM_READTIME_KEY: - APP_LOG(APP_LOG_LEVEL_INFO, "READ TIME AGO"); - strncpy(new_time, new_tuple->value->cstring, 124); - text_layer_set_text(readtime_layer, new_tuple->value->cstring); - break; - - case CGM_ALERT_KEY: - APP_LOG(APP_LOG_LEVEL_INFO, "ALERT VIBRATION"); - alert_handler(new_tuple->value->uint8); - break; - - case CGM_TIME_NOW: - APP_LOG(APP_LOG_LEVEL_INFO, "CGM TIME NOW"); - draw_date(); - text_layer_set_text(datetime_layer, new_tuple->value->cstring); - break; - - case CGM_DELTA_KEY: - APP_LOG(APP_LOG_LEVEL_INFO, "DELTA IN BG"); - text_layer_set_text(message_layer, new_tuple->value->cstring); - break; - - case CGM_BATTLEVEL_KEY: - APP_LOG(APP_LOG_LEVEL_INFO, "BATTERY LEVEL"); - - static uint8_t current_battlevel = 0; - static char last_battlevel[4]; - static char battlevel_percent[6]; - - if (batticon_bitmap) { - gbitmap_destroy(batticon_bitmap); - } - - // get current battery level - strncpy(last_battlevel, new_tuple->value->cstring, 4); - current_battlevel = atoi(last_battlevel); - - // check for init code or Rajat build (will be 111 if Rajat build) - if ( (strcmp(last_battlevel, "") == 0) || (current_battlevel == 111) ) { - // Init code or Rajat build, can't do battery; set text layer & icon to empty value - text_layer_set_text(battlevel_layer, ""); - batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[11]); - bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); - break; - } - else { - // get current battery level and set battery level text with percent - snprintf(battlevel_percent, 6, "%s%%", last_battlevel); - text_layer_set_text(battlevel_layer, battlevel_percent); - - // check battery level, set battery level icon - if ( (current_battlevel >= 90) && (current_battlevel <= 100) ) { - batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[10]); - bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); - } - else if (current_battlevel >= 80) { - batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[9]); - bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); - } - else if (current_battlevel >= 70) { - batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[8]); - bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); - } - else if (current_battlevel >= 60) { - batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[7]); - bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); - } - else if (current_battlevel >= 50) { - batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[6]); - bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); - } - else if (current_battlevel >= 40) { - batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[5]); - bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); - } - else if (current_battlevel >= 30) { - batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[4]); - bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); - } - else if (current_battlevel >= 20) { - batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[3]); - bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); - } - else if (current_battlevel >= 10) { - batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[2]); - bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); - } - else if (current_battlevel >= 5) { - batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[1]); - bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); - } - else { - batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[0]); - bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); - } - } // end else Init code or Rajat build - - break; // break for CGM_BATTLEVEL_KEY - - case CGM_T1DNAME_KEY: - APP_LOG(APP_LOG_LEVEL_INFO, "T1D NAME"); - text_layer_set_text(t1dname_layer, new_tuple->value->cstring); - break; - - } // end switch(key) - -} // end sync_tuple_changed_callback() - -static void send_cmd(void) { - - DictionaryIterator *iter; - app_message_outbox_begin(&iter); - - if (iter == NULL) { - return; - } - static char *bgptr = last_bg; - static char *timeptr = new_time; - - Tuplet alertval = TupletInteger(3, 0); - Tuplet bgVal = TupletCString(1, bgptr); - Tuplet lastTimeVal = TupletCString(2, timeptr); - - dict_write_tuplet(iter, &alertval); - dict_write_tuplet(iter, &bgVal); - dict_write_tuplet(iter, &lastTimeVal); - - dict_write_end(iter); - - app_message_outbox_send(); - -} - -static void timer_callback(void *data) { - - send_cmd(); - timer = app_timer_register(60000, timer_callback, NULL); - -} - -static void window_load(Window *window) { - Layer *window_layer = window_get_root_layer(window); - - // DELTA BG - message_layer = text_layer_create(GRect(0, 33, 144, 55)); - text_layer_set_text_color(message_layer, GColorBlack); - text_layer_set_background_color(message_layer, GColorWhite); - text_layer_set_font(message_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD)); - text_layer_set_text_alignment(message_layer, GTextAlignmentCenter); - layer_add_child(window_layer, text_layer_get_layer(message_layer)); - - //ARROW OR SPECIAL VALUE - icon_layer = bitmap_layer_create(GRect(85, -7, 78, 50)); - bitmap_layer_set_alignment(icon_layer, GAlignTopLeft); - bitmap_layer_set_background_color(icon_layer, GColorClear); - layer_add_child(window_layer, bitmap_layer_get_layer(icon_layer)); - - // CURRENT APP TIME - datetime_layer = text_layer_create(GRect(82, 58, 57, 24)); - text_layer_set_text_color(datetime_layer, GColorBlack); - text_layer_set_background_color(datetime_layer, GColorClear); - text_layer_set_font(datetime_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); - text_layer_set_text_alignment(datetime_layer, GTextAlignmentRight); - layer_add_child(window_layer, text_layer_get_layer(datetime_layer)); - - //BG - bg_layer = text_layer_create(GRect(0, -5, 95, 47)); - text_layer_set_text_color(bg_layer, GColorBlack); - text_layer_set_background_color(bg_layer, GColorWhite); - text_layer_set_font(bg_layer, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD)); - text_layer_set_text_alignment(bg_layer, GTextAlignmentCenter); - layer_add_child(window_layer, text_layer_get_layer(bg_layer)); - - //READ TIME AGO - readtime_layer = text_layer_create(GRect(5, 58, 90, 28)); - text_layer_set_text_color(readtime_layer, GColorBlack); - text_layer_set_background_color(readtime_layer, GColorClear); - text_layer_set_font(readtime_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); - text_layer_set_text_alignment(readtime_layer, GTextAlignmentLeft); - layer_add_child(window_layer, text_layer_get_layer(readtime_layer)); - - // T1D NAME - t1dname_layer = text_layer_create(GRect(5, 138, 69, 28)); - text_layer_set_text_color(t1dname_layer, GColorWhite); - text_layer_set_background_color(t1dname_layer, GColorClear); - text_layer_set_font(t1dname_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); - text_layer_set_text_alignment(t1dname_layer, GTextAlignmentLeft); - layer_add_child(window_layer, text_layer_get_layer(t1dname_layer)); - - // BATTERY LEVEL ICON - batticon_layer = bitmap_layer_create(GRect(80, 147, 28, 20)); - bitmap_layer_set_alignment(batticon_layer, GAlignLeft); - bitmap_layer_set_background_color(batticon_layer, GColorBlack); - layer_add_child(window_layer, bitmap_layer_get_layer(batticon_layer)); - - // BATTERY LEVEL - battlevel_layer = text_layer_create(GRect(110, 144, 32, 20)); - text_layer_set_text_color(battlevel_layer, GColorWhite); - text_layer_set_background_color(battlevel_layer, GColorBlack); - text_layer_set_font(battlevel_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD)); - text_layer_set_text_alignment(battlevel_layer, GTextAlignmentLeft); - layer_add_child(window_layer, text_layer_get_layer(battlevel_layer)); - - // CURRENT ACTUAL TIME - time_layer = text_layer_create(GRect(0, 82, 144, 44)); - text_layer_set_text_color(time_layer, GColorWhite); - text_layer_set_background_color(time_layer, GColorClear); - text_layer_set_font(time_layer, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD)); - text_layer_set_text_alignment(time_layer, GTextAlignmentCenter); - layer_add_child(window_layer, text_layer_get_layer(time_layer)); - - // CURRENT ACTUAL DATE - date_layer = text_layer_create(GRect(0, 120, 144, 25)); - text_layer_set_text_color(date_layer, GColorWhite); - text_layer_set_background_color(date_layer, GColorClear); - text_layer_set_font(date_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); - text_layer_set_text_alignment(date_layer, GTextAlignmentCenter); - layer_add_child(window_layer, text_layer_get_layer(date_layer)); - draw_date(); - - - Tuplet initial_values[] = { - TupletBytes(CGM_ICON_KEY, icon_array, 2), - TupletCString(CGM_BG_KEY, ""), - TupletCString(CGM_READTIME_KEY, ""), - TupletInteger(CGM_ALERT_KEY, 0), - TupletCString(CGM_TIME_NOW, ""), - TupletCString(CGM_DELTA_KEY, "LOADING..."), - TupletCString(CGM_BATTLEVEL_KEY, ""), - TupletCString(CGM_T1DNAME_KEY, "") - }; - - app_sync_init(&sync, sync_buffer, sizeof(sync_buffer), initial_values, ARRAY_LENGTH(initial_values), sync_tuple_changed_callback, sync_error_callback, NULL); - - timer = app_timer_register(1000, timer_callback, NULL); -} - -static void window_unload(Window *window) { - app_sync_deinit(&sync); - - if (icon_bitmap) { - gbitmap_destroy(icon_bitmap); - } - if (specialvalue_bitmap) { - gbitmap_destroy(specialvalue_bitmap); - } - if (batticon_bitmap) { - gbitmap_destroy(batticon_bitmap); - } - text_layer_destroy(datetime_layer); - text_layer_destroy(readtime_layer); - text_layer_destroy(bg_layer); - text_layer_destroy(message_layer); - bitmap_layer_destroy(icon_layer); - bitmap_layer_destroy(batticon_layer); - text_layer_destroy(battlevel_layer); - text_layer_destroy(t1dname_layer); - // bitmap_layer_destroy(time_layer); - // bitmap_layer_destroy(date_layer); -} - -static void init(void) { - window = window_create(); - window_set_background_color(window, GColorBlack); - window_set_fullscreen(window, true); - window_set_window_handlers(window, (WindowHandlers) { - .load = window_load, - .unload = window_unload - }); - - app_message_open(app_message_inbox_size_maximum(), app_message_outbox_size_maximum()); - - const bool animated = true; - window_stack_push(window, animated); -} - -static void deinit(void) { - window_destroy(window); -} - -int main(void) { - init(); - - app_event_loop(); - deinit(); -} - - +#include "pebble.h" + +static Window *window; + +static TextLayer *bg_layer; +static TextLayer *readtime_layer; +static TextLayer *datetime_layer; +static BitmapLayer *icon_layer; +static TextLayer *message_layer; // BG DELTA & MESSAGE LAYER +static TextLayer *time_layer; +static BitmapLayer *batticon_layer; +static TextLayer *battlevel_layer; +static TextLayer *t1dname_layer; +static TextLayer *date_layer; +static char time_text[] = "00:00"; +static char date_text[] = "Wed 13 "; +static GBitmap *icon_bitmap = NULL; +static GBitmap *specialvalue_bitmap = NULL; +static GBitmap *batticon_bitmap = NULL; + +static void draw_date() { + + time_t now = time(NULL); + struct tm *t = localtime(&now); + + strftime(time_text, sizeof(time_text), "%l:%M", t); + strftime(date_text, sizeof(date_text), "%a %d", t); + + text_layer_set_text(time_layer, time_text); + text_layer_set_text(date_layer, date_text); +} + +static AppSync sync; +static AppTimer *timer; + +static uint8_t sync_buffer[256]; +static char new_time[124]; +static char last_bg[124]; +static uint8_t icon_array[] = {0,10}; +static uint8_t current_bg = 0; + +static const uint32_t const high[] = { 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100}; +static const uint32_t const low[] = { 1000,100,2000}; + +static const uint32_t const hypo[] = { 3200,200,3200 }; +static const uint32_t const hyper[] = { 50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150,50,150 }; + +static const uint32_t const trend_high[] = { 200,200,1000,200,200,200,1000 }; +static const uint32_t const trend_low[] = { 2000,200,1000 }; + +static const uint32_t const alert[] = { 500,200,1000 }; + + +enum CgmKey { + CGM_ICON_KEY = 0x0, // TUPLE_BYTE_ARRAY + CGM_BG_KEY = 0x1, // TUPLE_CSTRING + CGM_READTIME_KEY = 0x2, // TUPLE_CSTRING + CGM_ALERT_KEY = 0x3, // TUPLE_INT + CGM_TIME_NOW = 0x4, // TUPLE_CSTRING + CGM_DELTA_KEY = 0x5, // TUPLE_CSTRING + CGM_BATTLEVEL_KEY = 0x6, // TUPLE_CSTRING + CGM_T1DNAME_KEY = 0x7 // TUPLE_CSTRING +}; + +static const uint8_t NO_ANTENNA_VALUE = 3; +static const uint8_t SENSOR_NOT_CALIBRATED_VALUE = 5; +static const uint8_t STOP_LIGHT_VALUE = 6; +static const uint8_t HOURGLASS_VALUE = 9; +static const uint8_t QUESTION_MARKS_VALUE = 10; +static const uint8_t BAD_RF_VALUE = 12; + +static const uint32_t SPECIAL_VALUE_ICONS[] = { + RESOURCE_ID_IMAGE_BROKEN_ANTENNA, //0 + RESOURCE_ID_IMAGE_BLOOD_DROP, //1 + RESOURCE_ID_IMAGE_STOP_LIGHT, //2 + RESOURCE_ID_IMAGE_HOURGLASS, //3 + RESOURCE_ID_IMAGE_QUESTION_MARKS //4 +}; + +static const uint32_t CGM_ICONS[] = { // COMMUNITY Build Order + RESOURCE_ID_IMAGE_NONE, //0 + RESOURCE_ID_IMAGE_UPUP, //1 + RESOURCE_ID_IMAGE_UP, //2 + RESOURCE_ID_IMAGE_UP45, //3 + RESOURCE_ID_IMAGE_FLAT, //4 + RESOURCE_ID_IMAGE_DOWN45, //5 + RESOURCE_ID_IMAGE_DOWN, //6 + RESOURCE_ID_IMAGE_DOWNDOWN, //7 + RESOURCE_ID_IMAGE_NONE, //8 + RESOURCE_ID_IMAGE_NONE, //9 + RESOURCE_ID_IMAGE_LOGO //10 +}; + +static const uint32_t CGM_ICONS_RAJAT[] = { // RAJAT Build Order + RESOURCE_ID_IMAGE_UPUP, //0 + RESOURCE_ID_IMAGE_UP, //1 + RESOURCE_ID_IMAGE_UP45, //2 + RESOURCE_ID_IMAGE_FLAT, //3 + RESOURCE_ID_IMAGE_NONE, //4 + RESOURCE_ID_IMAGE_DOWN45, //5 + RESOURCE_ID_IMAGE_DOWN, //6 + RESOURCE_ID_IMAGE_DOWNDOWN, //7 + RESOURCE_ID_IMAGE_NONE, //8 + RESOURCE_ID_IMAGE_NONE, //9 + RESOURCE_ID_IMAGE_LOGO //10 +}; + +static const uint32_t BATTLEVEL_ICONS[] = { + RESOURCE_ID_IMAGE_BATTEMPTY, //0 + RESOURCE_ID_IMAGE_BATT10, //1 + RESOURCE_ID_IMAGE_BATT20, //2 + RESOURCE_ID_IMAGE_BATT30, //3 + RESOURCE_ID_IMAGE_BATT40, //4 + RESOURCE_ID_IMAGE_BATT50, //5 + RESOURCE_ID_IMAGE_BATT60, //6 + RESOURCE_ID_IMAGE_BATT70, //7 + RESOURCE_ID_IMAGE_BATT80, //8 + RESOURCE_ID_IMAGE_BATT90, //9 + RESOURCE_ID_IMAGE_BATTFULL, //10 + RESOURCE_ID_IMAGE_BATTNONE //11 +}; + +static void sync_error_callback(DictionaryResult dict_error, AppMessageResult app_message_error, void *context) { + text_layer_set_text(message_layer, "WATCH OFFLINE"); + + // VibePattern pat = { + // .durations = alert, + // .num_segments = ARRAY_LENGTH(alert), + // }; + vibes_double_pulse(); + //vibes_enqueue_custom_pattern(pat); +} + +static void alert_handler(uint8_t alertValue) +{ + APP_LOG(APP_LOG_LEVEL_DEBUG, "Alert code: %d", alertValue); + + switch (alertValue){ + //No alert + case 0: + break; + + //Normal (new data, in range, trend okay) + case 1: + vibes_double_pulse(); + break; + + //Low + case 2:; + VibePattern lowpat = { + .durations = low, + .num_segments = ARRAY_LENGTH(low), + }; + vibes_enqueue_custom_pattern(lowpat); + //vibes_double_pulse(lowpat); + break; + + //High + case 3:; + VibePattern highpat = { + .durations = high, + .num_segments = ARRAY_LENGTH(high), + }; + vibes_enqueue_custom_pattern(highpat); + break; + + //Hypo + + //Hyper + + //Trend Low + + //Trend High + + //Data Alert + + } + +} + +static void sync_tuple_changed_callback(const uint32_t key, const Tuple* new_tuple, const Tuple* old_tuple, void* context) { + + APP_LOG(APP_LOG_LEVEL_INFO, "sync tuple"); + switch (key) { + + case CGM_ICON_KEY: + APP_LOG(APP_LOG_LEVEL_INFO, "ICON ARROW"); + // if SpecialValue already set, then break + if (specialvalue_bitmap) { + break; + } + + // no SpecialValue, so set regular icon + if (icon_bitmap) { + gbitmap_destroy(icon_bitmap); + } + + // set the right arrow into the bitmap + if (new_tuple->value->data[0]) { // will be true if this is a Rajat build + icon_bitmap = gbitmap_create_with_resource(CGM_ICONS_RAJAT[new_tuple->value->data[1]]); + } + else { + icon_bitmap = gbitmap_create_with_resource(CGM_ICONS[new_tuple->value->data[1]]); + } + + bitmap_layer_set_bitmap(icon_layer, icon_bitmap); + break; + + case CGM_BG_KEY: + APP_LOG(APP_LOG_LEVEL_INFO, "BG CURRENT"); + if (specialvalue_bitmap) { + gbitmap_destroy(specialvalue_bitmap); + } + + // get current BG + strncpy(last_bg, new_tuple->value->cstring, 124); + current_bg = atoi(last_bg); + + // check for special value, if special value, then replace icon and blank BG; else send current BG + if ((current_bg == NO_ANTENNA_VALUE) || (current_bg == BAD_RF_VALUE)) { + text_layer_set_text(bg_layer, ""); + specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[0]); + bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); + } + else if (current_bg == SENSOR_NOT_CALIBRATED_VALUE) { + text_layer_set_text(bg_layer, ""); + specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[1]); + bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); + } + else if (current_bg == STOP_LIGHT_VALUE) { + text_layer_set_text(bg_layer, ""); + specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[2]); + bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); + } + else if (current_bg == HOURGLASS_VALUE) { + text_layer_set_text(bg_layer, ""); + specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[3]); + bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); + } + else if (current_bg == QUESTION_MARKS_VALUE) { + text_layer_set_text(bg_layer, ""); + specialvalue_bitmap = gbitmap_create_with_resource(SPECIAL_VALUE_ICONS[4]); + bitmap_layer_set_bitmap(icon_layer, specialvalue_bitmap); + } + else { + text_layer_set_text(bg_layer, new_tuple->value->cstring); + } + + break; // break for CGM_BG_KEY + + case CGM_READTIME_KEY: + APP_LOG(APP_LOG_LEVEL_INFO, "READ TIME AGO"); + strncpy(new_time, new_tuple->value->cstring, 124); + text_layer_set_text(readtime_layer, new_tuple->value->cstring); + break; + + case CGM_ALERT_KEY: + APP_LOG(APP_LOG_LEVEL_INFO, "ALERT VIBRATION"); + alert_handler(new_tuple->value->uint8); + break; + + case CGM_TIME_NOW: + APP_LOG(APP_LOG_LEVEL_INFO, "CGM TIME NOW"); + draw_date(); + text_layer_set_text(datetime_layer, new_tuple->value->cstring); + break; + + case CGM_DELTA_KEY: + APP_LOG(APP_LOG_LEVEL_INFO, "DELTA IN BG"); + text_layer_set_text(message_layer, new_tuple->value->cstring); + break; + + case CGM_BATTLEVEL_KEY: + APP_LOG(APP_LOG_LEVEL_INFO, "BATTERY LEVEL"); + + static uint8_t current_battlevel = 0; + static char last_battlevel[4]; + static char battlevel_percent[6]; + + if (batticon_bitmap) { + gbitmap_destroy(batticon_bitmap); + } + + // get current battery level + strncpy(last_battlevel, new_tuple->value->cstring, 4); + current_battlevel = atoi(last_battlevel); + + // check for init code or Rajat build (will be 111 if Rajat build) + if ( (strcmp(last_battlevel, "") == 0) || (current_battlevel == 111) ) { + // Init code or Rajat build, can't do battery; set text layer & icon to empty value + text_layer_set_text(battlevel_layer, ""); + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[11]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + break; + } + else { + // get current battery level and set battery level text with percent + snprintf(battlevel_percent, 6, "%s%%", last_battlevel); + text_layer_set_text(battlevel_layer, battlevel_percent); + + // check battery level, set battery level icon + if ( (current_battlevel >= 90) && (current_battlevel <= 100) ) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[10]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 80) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[9]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 70) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[8]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 60) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[7]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 50) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[6]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 40) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[5]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 30) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[4]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 20) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[3]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 10) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[2]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else if (current_battlevel >= 5) { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[1]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + else { + batticon_bitmap = gbitmap_create_with_resource(BATTLEVEL_ICONS[0]); + bitmap_layer_set_bitmap(batticon_layer, batticon_bitmap); + } + } // end else Init code or Rajat build + + break; // break for CGM_BATTLEVEL_KEY + + case CGM_T1DNAME_KEY: + APP_LOG(APP_LOG_LEVEL_INFO, "T1D NAME"); + text_layer_set_text(t1dname_layer, new_tuple->value->cstring); + break; + + } // end switch(key) + +} // end sync_tuple_changed_callback() + +static void send_cmd(void) { + + DictionaryIterator *iter; + app_message_outbox_begin(&iter); + + if (iter == NULL) { + return; + } + static char *bgptr = last_bg; + static char *timeptr = new_time; + + Tuplet alertval = TupletInteger(3, 0); + Tuplet bgVal = TupletCString(1, bgptr); + Tuplet lastTimeVal = TupletCString(2, timeptr); + + dict_write_tuplet(iter, &alertval); + dict_write_tuplet(iter, &bgVal); + dict_write_tuplet(iter, &lastTimeVal); + + dict_write_end(iter); + + app_message_outbox_send(); + +} + +static void timer_callback(void *data) { + + send_cmd(); + timer = app_timer_register(60000, timer_callback, NULL); + +} + +static void window_load(Window *window) { + Layer *window_layer = window_get_root_layer(window); + + // DELTA BG + message_layer = text_layer_create(GRect(0, 33, 144, 55)); + text_layer_set_text_color(message_layer, GColorBlack); + text_layer_set_background_color(message_layer, GColorWhite); + text_layer_set_font(message_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD)); + text_layer_set_text_alignment(message_layer, GTextAlignmentCenter); + layer_add_child(window_layer, text_layer_get_layer(message_layer)); + + //ARROW OR SPECIAL VALUE + icon_layer = bitmap_layer_create(GRect(85, -7, 78, 50)); + bitmap_layer_set_alignment(icon_layer, GAlignTopLeft); + bitmap_layer_set_background_color(icon_layer, GColorClear); + layer_add_child(window_layer, bitmap_layer_get_layer(icon_layer)); + + // CURRENT APP TIME + datetime_layer = text_layer_create(GRect(82, 58, 57, 24)); + text_layer_set_text_color(datetime_layer, GColorBlack); + text_layer_set_background_color(datetime_layer, GColorClear); + text_layer_set_font(datetime_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(datetime_layer, GTextAlignmentRight); + layer_add_child(window_layer, text_layer_get_layer(datetime_layer)); + + //BG + bg_layer = text_layer_create(GRect(0, -5, 95, 47)); + text_layer_set_text_color(bg_layer, GColorBlack); + text_layer_set_background_color(bg_layer, GColorWhite); + text_layer_set_font(bg_layer, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD)); + text_layer_set_text_alignment(bg_layer, GTextAlignmentCenter); + layer_add_child(window_layer, text_layer_get_layer(bg_layer)); + + //READ TIME AGO + readtime_layer = text_layer_create(GRect(5, 58, 90, 28)); + text_layer_set_text_color(readtime_layer, GColorBlack); + text_layer_set_background_color(readtime_layer, GColorClear); + text_layer_set_font(readtime_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(readtime_layer, GTextAlignmentLeft); + layer_add_child(window_layer, text_layer_get_layer(readtime_layer)); + + // T1D NAME + t1dname_layer = text_layer_create(GRect(5, 138, 69, 28)); + text_layer_set_text_color(t1dname_layer, GColorWhite); + text_layer_set_background_color(t1dname_layer, GColorClear); + text_layer_set_font(t1dname_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(t1dname_layer, GTextAlignmentLeft); + layer_add_child(window_layer, text_layer_get_layer(t1dname_layer)); + + // BATTERY LEVEL ICON + batticon_layer = bitmap_layer_create(GRect(80, 147, 28, 20)); + bitmap_layer_set_alignment(batticon_layer, GAlignLeft); + bitmap_layer_set_background_color(batticon_layer, GColorBlack); + layer_add_child(window_layer, bitmap_layer_get_layer(batticon_layer)); + + // BATTERY LEVEL + battlevel_layer = text_layer_create(GRect(110, 144, 32, 20)); + text_layer_set_text_color(battlevel_layer, GColorWhite); + text_layer_set_background_color(battlevel_layer, GColorBlack); + text_layer_set_font(battlevel_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD)); + text_layer_set_text_alignment(battlevel_layer, GTextAlignmentLeft); + layer_add_child(window_layer, text_layer_get_layer(battlevel_layer)); + + // CURRENT ACTUAL TIME + time_layer = text_layer_create(GRect(0, 82, 144, 44)); + text_layer_set_text_color(time_layer, GColorWhite); + text_layer_set_background_color(time_layer, GColorClear); + text_layer_set_font(time_layer, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD)); + text_layer_set_text_alignment(time_layer, GTextAlignmentCenter); + layer_add_child(window_layer, text_layer_get_layer(time_layer)); + + // CURRENT ACTUAL DATE + date_layer = text_layer_create(GRect(0, 120, 144, 25)); + text_layer_set_text_color(date_layer, GColorWhite); + text_layer_set_background_color(date_layer, GColorClear); + text_layer_set_font(date_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(date_layer, GTextAlignmentCenter); + layer_add_child(window_layer, text_layer_get_layer(date_layer)); + draw_date(); + + + Tuplet initial_values[] = { + TupletBytes(CGM_ICON_KEY, icon_array, 2), + TupletCString(CGM_BG_KEY, ""), + TupletCString(CGM_READTIME_KEY, ""), + TupletInteger(CGM_ALERT_KEY, 0), + TupletCString(CGM_TIME_NOW, ""), + TupletCString(CGM_DELTA_KEY, "LOADING..."), + TupletCString(CGM_BATTLEVEL_KEY, ""), + TupletCString(CGM_T1DNAME_KEY, "") + }; + + app_sync_init(&sync, sync_buffer, sizeof(sync_buffer), initial_values, ARRAY_LENGTH(initial_values), sync_tuple_changed_callback, sync_error_callback, NULL); + + timer = app_timer_register(1000, timer_callback, NULL); +} + +static void window_unload(Window *window) { + app_sync_deinit(&sync); + + if (icon_bitmap) { + gbitmap_destroy(icon_bitmap); + } + if (specialvalue_bitmap) { + gbitmap_destroy(specialvalue_bitmap); + } + if (batticon_bitmap) { + gbitmap_destroy(batticon_bitmap); + } + text_layer_destroy(datetime_layer); + text_layer_destroy(readtime_layer); + text_layer_destroy(bg_layer); + text_layer_destroy(message_layer); + bitmap_layer_destroy(icon_layer); + bitmap_layer_destroy(batticon_layer); + text_layer_destroy(battlevel_layer); + text_layer_destroy(t1dname_layer); + // bitmap_layer_destroy(time_layer); + // bitmap_layer_destroy(date_layer); +} + +static void init(void) { + window = window_create(); + window_set_background_color(window, GColorBlack); + window_set_fullscreen(window, true); + window_set_window_handlers(window, (WindowHandlers) { + .load = window_load, + .unload = window_unload + }); + + app_message_open(app_message_inbox_size_maximum(), app_message_outbox_size_maximum()); + + const bool animated = true; + window_stack_push(window, animated); +} + +static void deinit(void) { + window_destroy(window); +} + +int main(void) { + init(); + + app_event_loop(); + deinit(); +} + + diff --git a/src/js/pebble-js-app.js b/src/js/pebble-js-app.js old mode 100644 new mode 100755 index a3ee010..8f29a32 --- a/src/js/pebble-js-app.js +++ b/src/js/pebble-js-app.js @@ -1,421 +1,425 @@ -// global variable for last alert time -var lastAlert = 0; - -// main function to retrieve, format, and send cgm data -function fetchCgmData(lastReadTime, lastBG) { - - // declare local constants for time differences - var TIME_5_MINS = 5 * 60 * 1000, - TIME_10_MINS = 10 * 60 * 1000, - TIME_15_MINS = 15 * 60 * 1000, - TIME_30_MINS = TIME_15_MINS * 2; - - // declare local constants for arrow trends - var NO_ARROW = 0, - DOUBLE_UP = 1, - SINGLE_UP = 2, - FORTYFIVE_UP = 3, - FLAT_ARROW = 4, - FORTYFIVE_DOWN = 5, - SINGLE_DOWN = 6, - DOUBLE_DOWN = 7, - NOT_COMPUTABLE = 8, - RATE_OUT_OF_RANGE = 9, - LOGO = 10; - - // hard code name of T1D person, for now - var NameofT1DPerson = ""; - - // declare local variables for message data - var response, message; - - //call options & started to get endpoint & start time - var opts = options( ); - var started = new Date( ).getTime( ); - - //if endpoint is invalid, return error msg to watch - if (!opts.endpoint) { - message = { - icon: [0,LOGO], - bg: '---', - readtime: timeago(new Date().getTime() - started), - alert: 0, - time: formatDate(new Date()), - delta: 'CHECK ENDPOINT', - battlevel: "", - t1dname: "" - }; - - console.log("sending message", JSON.stringify(message)); - MessageQueue.sendAppMessage(message); - return; - } - - // call XML - var req = new XMLHttpRequest(); - //console.log('endpoint: ' + opts.endpoint); - - // get cgm data - req.open('GET', opts.endpoint, true); - - req.onload = function(e) { - - if (req.readyState == 4) { - - if(req.status == 200) { - - // Load response - response = JSON.parse(req.responseText); - response = response.bgs; - - // check response data - if (response && response.length > 0) { - - // response data is good; send log with response - console.log('got response', JSON.stringify(response)); - - // see if we're in a Rajat build - var RajatBuild = isRajatBuild(opts.endpoint, "heroku"); - if (RajatBuild) { - // set Rajat arrow constants - DOUBLE_UP = 0; - SINGLE_UP = 1; - FORTYFIVE_UP = 2; - FLAT_ARROW = 3; - NO_ARROW = 4; - } - - // initialize message data - var now = new Date().getTime(), - sinceLastAlert = now - lastAlert, - alertValue = 0, - currentBG = response[0].sgv, - currentBGDelta = response[0].bgdelta, - currentTrend = response[0].trend, - delta = (currentBGDelta > 0 ? '+' : '') + currentBGDelta + " mg/dL", - readingtime = new Date(response[0].datetime).getTime(), - readago = now - readingtime, - currentBattery = response[0].battery; - - // see if we're in a Rajat build - var RajatBuild = isRajatBuild(opts.endpoint, "heroku"); - if (RajatBuild) { - // set Rajat arrow constants - DOUBLE_UP = 0; - SINGLE_UP = 1; - FORTYFIVE_UP = 2; - FLAT_ARROW = 3; - NO_ARROW = 4; - // can't read battery so set to 111 to indicate Rajat build - currentBattery = "111"; - } - - // debug logs; uncomment when need to debug something - //console.log("now: " + now); - //console.log("sinceLastAlert: " + sinceLastAlert); - //console.log("current BG: " + currentBG); - //console.log("current BG delta: " + currentBGDelta); - //console.log("arrow: " + currentTrend); - //console.log('RajatBuild?: ' + RajatBuild); - //console.log("readingtime: " + readingtime); - //console.log("readago: " + readago); - //console.log("current Battery: " + currentBattery); - - // set vibration pattern; alert value; 0 nothing, 1 normal, 2 low, 3 high - - if (currentBG < 39) { - if (sinceLastAlert > TIME_10_MINS) alertValue = 2; - } else if (currentBG < 55) - alertValue = 2; - else if (currentBG < 60 && currentBGDelta < 0) - alertValue = 2; - else if (currentBG < 70 && sinceLastAlert > TIME_15_MINS) - alertValue = 2; - else if (currentBG < 120 && currentTrend == DOUBLE_DOWN && sinceLastAlert > TIME_5_MINS) - alertValue = 2; - else if (currentBG == 100 && currentTrend == FLAT_ARROW && sinceLastAlert > TIME_15_MINS) //Perfect Score - a good time to take a picture :) - alertValue = 1; - else if (currentBG > 120 && currentTrend == DOUBLE_UP && sinceLastAlert > TIME_15_MINS) - alertValue = 3; - else if (currentBG > 200 && sinceLastAlert > TIME_30_MINS && currentBGDelta > 0) - alertValue = 3; - else if (currentBG > 250 && sinceLastAlert > TIME_30_MINS) - alertValue = 3; - else if (currentBG > 300 && sinceLastAlert > TIME_15_MINS) - alertValue = 3; - - if (alertValue === 0 && readago > TIME_10_MINS && sinceLastAlert > TIME_15_MINS) { - alertValue = 1; - } - - if (alertValue > 0) { - lastAlert = now; - } - - // load message data - message = { - icon: [RajatBuild,currentTrend], - bg: currentBG, - readtime: timeago(new Date().getTime() - (new Date(response[0].datetime).getTime())), - alert: alertValue, - time: formatDate(new Date()), - delta: delta, - battlevel: currentBattery, - t1dname: NameofT1DPerson - }; - - // send message data to log and to watch - console.log("message: " + JSON.stringify(message)); - MessageQueue.sendAppMessage(message); - - // response data is no good; format error message and send to watch - } else { - message = { - icon: [0,LOGO], - bg: '---', - readtime: timeago(new Date().getTime() - (now)), - alert: 1, - time: formatDate(new Date()), - delta: 'DATA OFFLINE', - battlevel: "", - t1dname: "" - }; - console.log("sending message", JSON.stringify(message)); - MessageQueue.sendAppMessage(message); - } - } - } - }; - req.send(null); -} - -// format date hours:minutes; add AM + PM if want -function formatDate(date) { - var minutes = date.getMinutes(), - hours = date.getHours() || 12, - meridiem = " PM", - formatted; - - if (hours > 12) - hours = hours - 12; - else if (hours < 12) - meridiem = " AM"; - - // don't want AM & PM, so add line with blank - // if want to add later, then comment out this line - meridiem = ""; - - if (minutes < 10) - formatted = hours + ":0" + date.getMinutes() + meridiem; - else - formatted = hours + ":" + date.getMinutes() + meridiem; - - return formatted; -} - -// format past time difference data -function timeago(offset) { - var parts = {}, - MINUTE = 60 * 1000, - HOUR = 3600 * 1000, - DAY = 86400 * 1000, - WEEK = 604800 * 1000; - - if (offset <= MINUTE) parts = { lablel: 'now' }; - if (offset <= MINUTE * 2) parts = { label: '1 min ago' }; - else if (offset < (MINUTE * 60)) parts = { value: Math.round(Math.abs(offset / MINUTE)), label: 'min' }; - else if (offset < (HOUR * 2)) parts = { label: '1 hr ago' }; - else if (offset < (HOUR * 24)) parts = { value: Math.round(Math.abs(offset / HOUR)), label: 'hrs' }; - else if (offset < (DAY * 1)) parts = { label: '1 dy ago' }; - else if (offset < (DAY * 7)) parts = { value: Math.round(Math.abs(offset / DAY)), label: 'dys' }; - else if (offset < (WEEK * 52)) parts = { value: Math.round(Math.abs(offset / WEEK)), label: 'wks' }; - else parts = { label: 'BEFORE DX'}; - - if (parts.value) - return parts.value + ' ' + parts.label + ' ago'; - else - return parts.label; - -} - -// get endpoint for XML request -function options ( ) { - var opts = [ ].slice.call(arguments).pop( ); - if (opts) { - window.localStorage.setItem('cgmPebble', JSON.stringify(opts)); - } else { - opts = JSON.parse(window.localStorage.getItem('cgmPebble')); - } - return opts; -} - -// check for Rajat build -function isRajatBuild (str, str_to_match) { - return (str.indexOf(str_to_match) >= 0); -} - -// message queue-ing to pace calls from C function on watch -var MessageQueue = (function () { - - var RETRY_MAX = 5; - - var queue = []; - var sending = false; - var timer = null; - - return { - reset: reset, - sendAppMessage: sendAppMessage, - size: size - }; - - function reset() { - queue = []; - sending = false; - } - - function sendAppMessage(message, ack, nack) { - - if (! isValidMessage(message)) { - return false; - } - - queue.push({ - message: message, - ack: ack || null, - nack: nack || null, - attempts: 0 - }); - - setTimeout(function () { - sendNextMessage(); - }, 1); - - return true; - } - - function size() { - return queue.length; - } - - function isValidMessage(message) { - // A message must be an object. - if (message !== Object(message)) { - return false; - } - var keys = Object.keys(message); - // A message must have at least one key. - if (! keys.length) { - return false; - } - for (var k = 0; k < keys.length; k += 1) { - var validKey = /^[0-9a-zA-Z-_]*$/.test(keys[k]); - if (! validKey) { - return false; - } - var value = message[keys[k]]; - if (! validValue(value)) { - return false; - } - } - - return true; - - function validValue(value) { - switch (typeof(value)) { - case 'string': - return true; - case 'number': - return true; - case 'object': - if (toString.call(value) == '[object Array]') { - return true; - } - } - return false; - } - } - - function sendNextMessage() { - - if (sending) { return; } - var message = queue.shift(); - if (! message) { return; } - - message.attempts += 1; - sending = true; - Pebble.sendAppMessage(message.message, ack, nack); - - timer = setTimeout(function () { - timeout(); - }, 1000); - - function ack() { - clearTimeout(timer); - setTimeout(function () { - sending = false; - sendNextMessage(); - }, 200); - if (message.ack) { - message.ack.apply(null, arguments); - } - } - - function nack() { - clearTimeout(timer); - if (message.attempts < RETRY_MAX) { - queue.unshift(message); - setTimeout(function () { - sending = false; - sendNextMessage(); - }, 200 * message.attempts); - } - else { - if (message.nack) { - message.nack.apply(null, arguments); - } - } - } - - function timeout() { - setTimeout(function () { - sending = false; - sendNextMessage(); - }, 1000); - if (message.ack) { - message.ack.apply(null, arguments); - } - } - - } - - }()); - -// pebble specific calls with watch -Pebble.addEventListener("ready", - function(e) { - console.log("connect: " + e.ready); - //fetchCgmData(0, 0); - }); - -Pebble.addEventListener("appmessage", - function(e) { - console.log("Received message: " + JSON.stringify(e.payload)); - fetchCgmData(e.payload.readtime, e.payload.bg); - }); - -Pebble.addEventListener("showConfiguration", function(e) { - console.log("showing configuration", JSON.stringify(e)); - Pebble.openURL('http://bewest.github.io/cgm-pebble/configurable.html'); - }); - -Pebble.addEventListener("webviewclosed", function(e) { - var opts = e.response.length > 5 - ? JSON.parse(decodeURIComponent(e.response)): null; - - options(opts); - - }); - - - +// global variable for last alert time +var lastAlert = 0; + +// main function to retrieve, format, and send cgm data +function fetchCgmData(lastReadTime, lastBG) { + + // declare local constants for time differences + var TIME_5_MINS = 5 * 60 * 1000, + TIME_10_MINS = 10 * 60 * 1000, + TIME_15_MINS = 15 * 60 * 1000, + TIME_30_MINS = TIME_15_MINS * 2; + + // declare local constants for arrow trends + var NO_ARROW = 0, + DOUBLE_UP = 1, + SINGLE_UP = 2, + FORTYFIVE_UP = 3, + FLAT_ARROW = 4, + FORTYFIVE_DOWN = 5, + SINGLE_DOWN = 6, + DOUBLE_DOWN = 7, + NOT_COMPUTABLE = 8, + RATE_OUT_OF_RANGE = 9, + LOGO = 10; + + // hard code name of T1D person, for now + var NameofT1DPerson = ""; + + // declare local variables for message data + var response, message; + + //call options & started to get endpoint & start time + var opts = options( ); + var started = new Date( ).getTime( ); + + //if endpoint is invalid, return error msg to watch + if (!opts.endpoint) { + message = { + icon: [0,LOGO], + bg: '---', + readtime: timeago(new Date().getTime() - started), + alert: 0, + time: formatDate(new Date()), + delta: 'CHECK ENDPOINT', + battlevel: "", + t1dname: "" + }; + + console.log("sending message", JSON.stringify(message)); + MessageQueue.sendAppMessage(message); + return; + } + + // call XML + var req = new XMLHttpRequest(); + //console.log('endpoint: ' + opts.endpoint); + + // get cgm data + req.open('GET', opts.endpoint, true); + + req.onload = function(e) { + + if (req.readyState == 4) { + + if(req.status == 200) { + + // Load response + response = JSON.parse(req.responseText); + response = response.bgs; + + // check response data + if (response && response.length > 0) { + + // response data is good; send log with response + console.log('got response', JSON.stringify(response)); + + // see if we're in a Rajat build + var RajatBuild = isRajatBuild(opts.endpoint, "heroku"); + if (RajatBuild) { + // set Rajat arrow constants + DOUBLE_UP = 0; + SINGLE_UP = 1; + FORTYFIVE_UP = 2; + FLAT_ARROW = 3; + NO_ARROW = 4; + } + + // initialize message data + var now = new Date().getTime(), + sinceLastAlert = now - lastAlert, + alertValue = 0, + currentBG = response[0].sgv, + currentBGDelta = response[0].bgdelta, + currentTrend = response[0].trend, + delta = (currentBGDelta > 0 ? '+' : '') + currentBGDelta + " mg/dL", + readingtime = new Date(response[0].datetime).getTime(), + readago = now - readingtime, + + // battery not included in response yet, so have to send no battery for now + // once battery is included, uncomment out line and erase "111" line + //currentBattery = response[0].battery; + currentBattery = "111"; + + // see if we're in a Rajat build + var RajatBuild = isRajatBuild(opts.endpoint, "heroku"); + if (RajatBuild) { + // set Rajat arrow constants + DOUBLE_UP = 0; + SINGLE_UP = 1; + FORTYFIVE_UP = 2; + FLAT_ARROW = 3; + NO_ARROW = 4; + // can't read battery so set to 111 to indicate Rajat build + currentBattery = "111"; + } + + // debug logs; uncomment when need to debug something + //console.log("now: " + now); + //console.log("sinceLastAlert: " + sinceLastAlert); + //console.log("current BG: " + currentBG); + //console.log("current BG delta: " + currentBGDelta); + //console.log("arrow: " + currentTrend); + //console.log('RajatBuild?: ' + RajatBuild); + //console.log("readingtime: " + readingtime); + //console.log("readago: " + readago); + //console.log("current Battery: " + currentBattery); + + // set vibration pattern; alert value; 0 nothing, 1 normal, 2 low, 3 high + + if (currentBG < 39) { + if (sinceLastAlert > TIME_10_MINS) alertValue = 2; + } else if (currentBG < 55) + alertValue = 2; + else if (currentBG < 60 && currentBGDelta < 0) + alertValue = 2; + else if (currentBG < 70 && sinceLastAlert > TIME_15_MINS) + alertValue = 2; + else if (currentBG < 120 && currentTrend == DOUBLE_DOWN && sinceLastAlert > TIME_5_MINS) + alertValue = 2; + else if (currentBG == 100 && currentTrend == FLAT_ARROW && sinceLastAlert > TIME_15_MINS) //Perfect Score - a good time to take a picture :) + alertValue = 1; + else if (currentBG > 120 && currentTrend == DOUBLE_UP && sinceLastAlert > TIME_15_MINS) + alertValue = 3; + else if (currentBG > 200 && sinceLastAlert > TIME_30_MINS && currentBGDelta > 0) + alertValue = 3; + else if (currentBG > 250 && sinceLastAlert > TIME_30_MINS) + alertValue = 3; + else if (currentBG > 300 && sinceLastAlert > TIME_15_MINS) + alertValue = 3; + + if (alertValue === 0 && readago > TIME_10_MINS && sinceLastAlert > TIME_15_MINS) { + alertValue = 1; + } + + if (alertValue > 0) { + lastAlert = now; + } + + // load message data + message = { + icon: [RajatBuild,currentTrend], + bg: currentBG, + readtime: timeago(new Date().getTime() - (new Date(response[0].datetime).getTime())), + alert: alertValue, + time: formatDate(new Date()), + delta: delta, + battlevel: currentBattery, + t1dname: NameofT1DPerson + }; + + // send message data to log and to watch + console.log("message: " + JSON.stringify(message)); + MessageQueue.sendAppMessage(message); + + // response data is no good; format error message and send to watch + } else { + message = { + icon: [0,LOGO], + bg: '---', + readtime: timeago(new Date().getTime() - (now)), + alert: 1, + time: formatDate(new Date()), + delta: 'DATA OFFLINE', + battlevel: "", + t1dname: "" + }; + console.log("sending message", JSON.stringify(message)); + MessageQueue.sendAppMessage(message); + } + } + } + }; + req.send(null); +} + +// format date hours:minutes; add AM + PM if want +function formatDate(date) { + var minutes = date.getMinutes(), + hours = date.getHours() || 12, + meridiem = " PM", + formatted; + + if (hours > 12) + hours = hours - 12; + else if (hours < 12) + meridiem = " AM"; + + // don't want AM & PM, so add line with blank + // if want to add later, then comment out this line + meridiem = ""; + + if (minutes < 10) + formatted = hours + ":0" + date.getMinutes() + meridiem; + else + formatted = hours + ":" + date.getMinutes() + meridiem; + + return formatted; +} + +// format past time difference data +function timeago(offset) { + var parts = {}, + MINUTE = 60 * 1000, + HOUR = 3600 * 1000, + DAY = 86400 * 1000, + WEEK = 604800 * 1000; + + if (offset <= MINUTE) parts = { lablel: 'now' }; + if (offset <= MINUTE * 2) parts = { label: '1 min ago' }; + else if (offset < (MINUTE * 60)) parts = { value: Math.round(Math.abs(offset / MINUTE)), label: 'min' }; + else if (offset < (HOUR * 2)) parts = { label: '1 hr ago' }; + else if (offset < (HOUR * 24)) parts = { value: Math.round(Math.abs(offset / HOUR)), label: 'hrs' }; + else if (offset < (DAY * 1)) parts = { label: '1 dy ago' }; + else if (offset < (DAY * 7)) parts = { value: Math.round(Math.abs(offset / DAY)), label: 'dys' }; + else if (offset < (WEEK * 52)) parts = { value: Math.round(Math.abs(offset / WEEK)), label: 'wks' }; + else parts = { label: 'BEFORE DX'}; + + if (parts.value) + return parts.value + ' ' + parts.label + ' ago'; + else + return parts.label; + +} + +// get endpoint for XML request +function options ( ) { + var opts = [ ].slice.call(arguments).pop( ); + if (opts) { + window.localStorage.setItem('cgmPebble', JSON.stringify(opts)); + } else { + opts = JSON.parse(window.localStorage.getItem('cgmPebble')); + } + return opts; +} + +// check for Rajat build +function isRajatBuild (str, str_to_match) { + return (str.indexOf(str_to_match) >= 0); +} + +// message queue-ing to pace calls from C function on watch +var MessageQueue = (function () { + + var RETRY_MAX = 5; + + var queue = []; + var sending = false; + var timer = null; + + return { + reset: reset, + sendAppMessage: sendAppMessage, + size: size + }; + + function reset() { + queue = []; + sending = false; + } + + function sendAppMessage(message, ack, nack) { + + if (! isValidMessage(message)) { + return false; + } + + queue.push({ + message: message, + ack: ack || null, + nack: nack || null, + attempts: 0 + }); + + setTimeout(function () { + sendNextMessage(); + }, 1); + + return true; + } + + function size() { + return queue.length; + } + + function isValidMessage(message) { + // A message must be an object. + if (message !== Object(message)) { + return false; + } + var keys = Object.keys(message); + // A message must have at least one key. + if (! keys.length) { + return false; + } + for (var k = 0; k < keys.length; k += 1) { + var validKey = /^[0-9a-zA-Z-_]*$/.test(keys[k]); + if (! validKey) { + return false; + } + var value = message[keys[k]]; + if (! validValue(value)) { + return false; + } + } + + return true; + + function validValue(value) { + switch (typeof(value)) { + case 'string': + return true; + case 'number': + return true; + case 'object': + if (toString.call(value) == '[object Array]') { + return true; + } + } + return false; + } + } + + function sendNextMessage() { + + if (sending) { return; } + var message = queue.shift(); + if (! message) { return; } + + message.attempts += 1; + sending = true; + Pebble.sendAppMessage(message.message, ack, nack); + + timer = setTimeout(function () { + timeout(); + }, 1000); + + function ack() { + clearTimeout(timer); + setTimeout(function () { + sending = false; + sendNextMessage(); + }, 200); + if (message.ack) { + message.ack.apply(null, arguments); + } + } + + function nack() { + clearTimeout(timer); + if (message.attempts < RETRY_MAX) { + queue.unshift(message); + setTimeout(function () { + sending = false; + sendNextMessage(); + }, 200 * message.attempts); + } + else { + if (message.nack) { + message.nack.apply(null, arguments); + } + } + } + + function timeout() { + setTimeout(function () { + sending = false; + sendNextMessage(); + }, 1000); + if (message.ack) { + message.ack.apply(null, arguments); + } + } + + } + + }()); + +// pebble specific calls with watch +Pebble.addEventListener("ready", + function(e) { + console.log("connect: " + e.ready); + //fetchCgmData(0, 0); + }); + +Pebble.addEventListener("appmessage", + function(e) { + console.log("Received message: " + JSON.stringify(e.payload)); + fetchCgmData(e.payload.readtime, e.payload.bg); + }); + +Pebble.addEventListener("showConfiguration", function(e) { + console.log("showing configuration", JSON.stringify(e)); + Pebble.openURL('http://bewest.github.io/cgm-pebble/configurable.html'); + }); + +Pebble.addEventListener("webviewclosed", function(e) { + var opts = e.response.length > 5 + ? JSON.parse(decodeURIComponent(e.response)): null; + + options(opts); + + }); + + + diff --git a/wscript b/wscript old mode 100644 new mode 100755 From 3824bde5ed33febcdc0314aa034485b7642d1ac9 Mon Sep 17 00:00:00 2001 From: ELUTE Date: Tue, 29 Jul 2014 20:19:50 -0400 Subject: [PATCH 3/9] downdown --- resources/images/downdown.png | Bin 0 -> 826 bytes resources/img/downdown.png | Bin 0 -> 826 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 resources/images/downdown.png create mode 100755 resources/img/downdown.png diff --git a/resources/images/downdown.png b/resources/images/downdown.png new file mode 100755 index 0000000000000000000000000000000000000000..ff69adfa6f29fc0c9a8e27863cb33e00447fe5f6 GIT binary patch literal 826 zcmV-A1I7G_P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;z)3_wRCwC#+ObRPP#6X9bHlBJf`g(2L8<6e1VwbyK~NVrso>x!bnp)l!Lc|x z2;$#<3_+ili_>;gt?hFgqZ#>U~Wm!;4`PxQDM{$3DAGl|CcNbk2>6r6oQ+J&`1RflC8TOiY9}NM~m!EzA1U;dvhC=jTHOudc4rah&%K-(Zq_ zetzcS;$qc9#9}cX9v=R)XJuuDb#--Bb+oj!aC38$FE1~j)(!+Np_9pE#e?+r_VVQ9 zq-@Xn`Z}ANn=9%tO_Mu2JA8Y4`?79eFiAR&!?m@wz=I4A5A){c#&^%w))re^TLX3U z^z?jt^;85VN!N90Sr)a{WrxsOb9#E3cXxMzdybEf+1J{?ZUOLx}&{e8B#w|^O;p`n2b3k!5zx7r$B zUte=*Xy~ulsi`U7S5MX8Qc|fDM@B~8hiGhUWHOm#u~-bNg86)&larI5u(PwXe0X^9 zy+&wYl1!)592*;BBog8B@-l0Yd_K>anHd6LB9UM=n+>$T;vXMdRuj+jkjZ4=I1akI zyKDA5TqqQ9b#;Y~jt(?6H3ix?RIvP860m>;T(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;z)3_wRCwC#+ObRPP#6X9bHlBJf`g(2L8<6e1VwbyK~NVrso>x!bnp)l!Lc|x z2;$#<3_+ili_>;gt?hFgqZ#>U~Wm!;4`PxQDM{$3DAGl|CcNbk2>6r6oQ+J&`1RflC8TOiY9}NM~m!EzA1U;dvhC=jTHOudc4rah&%K-(Zq_ zetzcS;$qc9#9}cX9v=R)XJuuDb#--Bb+oj!aC38$FE1~j)(!+Np_9pE#e?+r_VVQ9 zq-@Xn`Z}ANn=9%tO_Mu2JA8Y4`?79eFiAR&!?m@wz=I4A5A){c#&^%w))re^TLX3U z^z?jt^;85VN!N90Sr)a{WrxsOb9#E3cXxMzdybEf+1J{?ZUOLx}&{e8B#w|^O;p`n2b3k!5zx7r$B zUte=*Xy~ulsi`U7S5MX8Qc|fDM@B~8hiGhUWHOm#u~-bNg86)&larI5u(PwXe0X^9 zy+&wYl1!)592*;BBog8B@-l0Yd_K>anHd6LB9UM=n+>$T;vXMdRuj+jkjZ4=I1akI zyKDA5TqqQ9b#;Y~jt(?6H3ix?RIvP860m>;T Date: Tue, 29 Jul 2014 20:29:46 -0400 Subject: [PATCH 4/9] images --- resources/images/up.png | Bin 1181 -> 3171 bytes resources/img/up.png | Bin 1181 -> 3171 bytes 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 resources/images/up.png mode change 100755 => 100644 resources/img/up.png diff --git a/resources/images/up.png b/resources/images/up.png old mode 100755 new mode 100644 index ea1b3c096794aa22668744746d54db5bf411586d..4f7134b75fce8337ba861152a58acf8cfc20156e GIT binary patch literal 3171 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 JPDHLkV1n{k=_&vK delta 1151 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 JPDHLkV1n{k=_&vK delta 1151 zcmV-_1c3YF7@Y|z^Y{9#ZnmH+?(_mMgqe>lryU|^o$=;GwcB*4H>P*hUn9^@Dq5gDbxex8Aiftdje z5|fJy90LM;KxTdhXgqT*)0qVOgts26(GF~&iMtEMVaXte?voLcc z^Frn~ES4-CEVo$oe^^^t@3C33O=J7U9?rg-Ly4n{;|pgZ=LIfDt}Wb}+zWW5c&73S z@lN6s=9|VZ!@pQSM_`AbtKb!(RG}Zjy&@_idqu-Vzlco|Hxj=hQ6VWOc}yx_T3Y&q zOqr~@>@B%Ic^COV3R@KmmGqR}Dz8;3P&HBgsdiAkOCwZMe@XL$)&cEFI;px=dV+ed z^p6-UFswC-F}5|4H)S?`X?DSUr^OP>308I1xi)dOfp)I;)(*ywI!W@gRJzL?9NXP;kDu&MA}v35yT>8i3f75bGWRl8~!YrX2G)<102 zYpQ8J+bY*q*nYHAx~r)Bbgyb(WB=WWHj`#g{yQ~(+Tj@*Gy7+KpOY~6^nCLLOBabO zZe8+iS?2P4D??VDUgNTM-+Idp+cueO-m=wX+x8t+X*>7tcHMJ!U)cT!2XhYnJkowl z{P>EK)~C*$Nk04Q{G^N8myTXZy!!9@oSQbc?%t`tr+oj!!@S30Pxe2{d?E7k;OqRi z^6xHuX!>OO`PJ72-@|_j{5tig^`GPa{{RgD4>Z?wUKo)f7k>dfNkl-*k~3`a2Gb-(UO=)P7L{?@O)k@2BU zaaCcTe)Wyik$T#w3GeAw-$*^FtBH#6(SG%f)YsyautvZ7Mysz63v2ePZ)AUG|GHE! zT5F1;*! Date: Wed, 30 Jul 2014 13:59:38 -0400 Subject: [PATCH 5/9] dowb --- resources/images/down.png | Bin 411 -> 3062 bytes resources/img/down.png | Bin 411 -> 3062 bytes 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 resources/images/down.png mode change 100755 => 100644 resources/img/down.png diff --git a/resources/images/down.png b/resources/images/down.png old mode 100755 new mode 100644 index adefed05ac851d29cad23e14800d69de7b5443cf..d42da57954e38f8d6f6eba2fc8b544dbc8ce1229 GIT binary patch delta 2991 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 delta 304 zcmew+KAU-h#pKCc4)qRBs(*x{*rztMc&%vmI>5!Zf<-2Pz1V-x-Mn{ET)S`1Y*7z7 zByN=HWWb;xKSlrN1_2*~gZ17Vjy;C|XOI{F^Y69x zTi+GR2su?)(T34bS~iP z?G5*;uXHU)no}IQ@LJRniR`?MdJ+tKzUyDUuJ+*4>qLoN-?vKc_);Zvd|hoWmtN$w zrP1-b8@$)g|GVqmt8DWRo8#`^yuJ>ovU1++uUoBmq{LoVtNp9n#(#uUO%>?)_&;68 gKY;x4p#0={2HAM`<$d+SEet^5>FVdQ&MBb@0HG&{Hvj+t diff --git a/resources/img/down.png b/resources/img/down.png old mode 100755 new mode 100644 index adefed05ac851d29cad23e14800d69de7b5443cf..d42da57954e38f8d6f6eba2fc8b544dbc8ce1229 GIT binary patch delta 2991 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 delta 304 zcmew+KAU-h#pKCc4)qRBs(*x{*rztMc&%vmI>5!Zf<-2Pz1V-x-Mn{ET)S`1Y*7z7 zByN=HWWb;xKSlrN1_2*~gZ17Vjy;C|XOI{F^Y69x zTi+GR2su?)(T34bS~iP z?G5*;uXHU)no}IQ@LJRniR`?MdJ+tKzUyDUuJ+*4>qLoN-?vKc_);Zvd|hoWmtN$w zrP1-b8@$)g|GVqmt8DWRo8#`^yuJ>ovU1++uUoBmq{LoVtNp9n#(#uUO%>?)_&;68 gKY;x4p#0={2HAM`<$d+SEet^5>FVdQ&MBb@0HG&{Hvj+t From 5b38d9cce3dad96fb8ca760cb19dcda16cfc8c0b Mon Sep 17 00:00:00 2001 From: Jason Calabrese Date: Thu, 31 Jul 2014 00:08:01 -0700 Subject: [PATCH 6/9] removed the isRajatBuild check and go back to using the direction field and the directionToTrand mapping; some reformatting --- src/js/pebble-js-app.js | 446 +++++++++++++++++++--------------------- 1 file changed, 208 insertions(+), 238 deletions(-) diff --git a/src/js/pebble-js-app.js b/src/js/pebble-js-app.js index 8f29a32..0e29359 100755 --- a/src/js/pebble-js-app.js +++ b/src/js/pebble-js-app.js @@ -1,32 +1,36 @@ // global variable for last alert time var lastAlert = 0; -// main function to retrieve, format, and send cgm data -function fetchCgmData(lastReadTime, lastBG) { - - // declare local constants for time differences - var TIME_5_MINS = 5 * 60 * 1000, +// declare local constants for time differences +var TIME_5_MINS = 5 * 60 * 1000, TIME_10_MINS = 10 * 60 * 1000, TIME_15_MINS = 15 * 60 * 1000, TIME_30_MINS = TIME_15_MINS * 2; - // declare local constants for arrow trends - var NO_ARROW = 0, - DOUBLE_UP = 1, - SINGLE_UP = 2, - FORTYFIVE_UP = 3, - FLAT_ARROW = 4, - FORTYFIVE_DOWN = 5, - SINGLE_DOWN = 6, - DOUBLE_DOWN = 7, - NOT_COMPUTABLE = 8, - RATE_OUT_OF_RANGE = 9, - LOGO = 10; - - // hard code name of T1D person, for now - var NameofT1DPerson = ""; - - // declare local variables for message data +var DIRECTIONS = { + 'NONE': 0, + 'DoubleUp': 1, + 'SingleUp': 2, + 'FortyFiveUp': 3, + 'Flat': 4, + 'FortyFiveDown': 5, + 'SingleDown': 6, + 'DoubleDown': 7, + 'NOT COMPUTABLE': 8, + 'RATE OUT OF RANGE': 9 +}; + +function directionToTrend(direction) { + var trend = 8; + if (direction in DIRECTIONS) { + trend = DIRECTIONS[direction]; + } + return trend; +} + +// main function to retrieve, format, and send cgm data +function fetchCgmData(lastReadTime, lastBG) { + var response, message; //call options & started to get endpoint & start time @@ -36,14 +40,14 @@ function fetchCgmData(lastReadTime, lastBG) { //if endpoint is invalid, return error msg to watch if (!opts.endpoint) { message = { - icon: [0,LOGO], - bg: '---', - readtime: timeago(new Date().getTime() - started), - alert: 0, - time: formatDate(new Date()), - delta: 'CHECK ENDPOINT', - battlevel: "", - t1dname: "" + icon: [0,LOGO], + bg: '---', + readtime: timeago(new Date().getTime() - started), + alert: 0, + time: formatDate(new Date()), + delta: 'CHECK ENDPOINT', + battlevel: "", + t1dname: "" }; console.log("sending message", JSON.stringify(message)); @@ -53,9 +57,8 @@ function fetchCgmData(lastReadTime, lastBG) { // call XML var req = new XMLHttpRequest(); - //console.log('endpoint: ' + opts.endpoint); - - // get cgm data + + console.log('options', opts, opts.endpoint); req.open('GET', opts.endpoint, true); req.onload = function(e) { @@ -63,70 +66,39 @@ function fetchCgmData(lastReadTime, lastBG) { if (req.readyState == 4) { if(req.status == 200) { - + // Load response response = JSON.parse(req.responseText); - response = response.bgs; - + console.log('got response', JSON.stringify(response)); + + var entries = response.bgs; + // check response data - if (response && response.length > 0) { + if (entries && entries.length > 0) { - // response data is good; send log with response - console.log('got response', JSON.stringify(response)); - - // see if we're in a Rajat build - var RajatBuild = isRajatBuild(opts.endpoint, "heroku"); - if (RajatBuild) { - // set Rajat arrow constants - DOUBLE_UP = 0; - SINGLE_UP = 1; - FORTYFIVE_UP = 2; - FLAT_ARROW = 3; - NO_ARROW = 4; - } + // response data is good; send log with response // initialize message data var now = new Date().getTime(), - sinceLastAlert = now - lastAlert, - alertValue = 0, - currentBG = response[0].sgv, - currentBGDelta = response[0].bgdelta, - currentTrend = response[0].trend, - delta = (currentBGDelta > 0 ? '+' : '') + currentBGDelta + " mg/dL", - readingtime = new Date(response[0].datetime).getTime(), - readago = now - readingtime, + sinceLastAlert = now - lastAlert, + alertValue = 0, + currentBG = entries[0].sgv, + currentBGDelta = entries[0].bgdelta, + currentDirection = entries[0].direction, + delta = (currentBGDelta > 0 ? '+' : '') + currentBGDelta + " mg/dL", + readingtime = new Date(entries[0].datetime).getTime(), + readago = now - readingtime; // battery not included in response yet, so have to send no battery for now // once battery is included, uncomment out line and erase "111" line - //currentBattery = response[0].battery; - currentBattery = "111"; - - // see if we're in a Rajat build - var RajatBuild = isRajatBuild(opts.endpoint, "heroku"); - if (RajatBuild) { - // set Rajat arrow constants - DOUBLE_UP = 0; - SINGLE_UP = 1; - FORTYFIVE_UP = 2; - FLAT_ARROW = 3; - NO_ARROW = 4; - // can't read battery so set to 111 to indicate Rajat build - currentBattery = "111"; - } - - // debug logs; uncomment when need to debug something - //console.log("now: " + now); - //console.log("sinceLastAlert: " + sinceLastAlert); - //console.log("current BG: " + currentBG); - //console.log("current BG delta: " + currentBGDelta); - //console.log("arrow: " + currentTrend); - //console.log('RajatBuild?: ' + RajatBuild); - //console.log("readingtime: " + readingtime); - //console.log("readago: " + readago); - //console.log("current Battery: " + currentBattery); - + //var currentBattery = response[0].battery; + var currentBattery = "111"; + + console.log("now: " + now); + console.log("readingtime: " + readingtime); + console.log("readago: " + readago); + // set vibration pattern; alert value; 0 nothing, 1 normal, 2 low, 3 high - if (currentBG < 39) { if (sinceLastAlert > TIME_10_MINS) alertValue = 2; } else if (currentBG < 55) @@ -135,11 +107,11 @@ function fetchCgmData(lastReadTime, lastBG) { alertValue = 2; else if (currentBG < 70 && sinceLastAlert > TIME_15_MINS) alertValue = 2; - else if (currentBG < 120 && currentTrend == DOUBLE_DOWN && sinceLastAlert > TIME_5_MINS) + else if (currentBG < 120 && currentDirection == 'DoubleDown' && sinceLastAlert > TIME_5_MINS) alertValue = 2; - else if (currentBG == 100 && currentTrend == FLAT_ARROW && sinceLastAlert > TIME_15_MINS) //Perfect Score - a good time to take a picture :) + else if (currentBG == 100 && currentDirection == 'Flat' && sinceLastAlert > TIME_15_MINS) //Perfect Score - a good time to take a picture :) alertValue = 1; - else if (currentBG > 120 && currentTrend == DOUBLE_UP && sinceLastAlert > TIME_15_MINS) + else if (currentBG > 120 && currentDirection == 'DoubleUp' && sinceLastAlert > TIME_15_MINS) alertValue = 3; else if (currentBG > 200 && sinceLastAlert > TIME_30_MINS && currentBGDelta > 0) alertValue = 3; @@ -158,14 +130,14 @@ function fetchCgmData(lastReadTime, lastBG) { // load message data message = { - icon: [RajatBuild,currentTrend], - bg: currentBG, - readtime: timeago(new Date().getTime() - (new Date(response[0].datetime).getTime())), - alert: alertValue, - time: formatDate(new Date()), - delta: delta, - battlevel: currentBattery, - t1dname: NameofT1DPerson + icon: directionToTrend(currentDirection), + bg: currentBG, + readtime: timeago(new Date().getTime() - (new Date(entries[0].datetime).getTime())), + alert: alertValue, + time: formatDate(new Date()), + delta: delta, + battlevel: currentBattery, + t1dname: NameofT1DPerson }; // send message data to log and to watch @@ -175,14 +147,14 @@ function fetchCgmData(lastReadTime, lastBG) { // response data is no good; format error message and send to watch } else { message = { - icon: [0,LOGO], - bg: '---', - readtime: timeago(new Date().getTime() - (now)), - alert: 1, - time: formatDate(new Date()), - delta: 'DATA OFFLINE', - battlevel: "", - t1dname: "" + icon: [0,LOGO], + bg: '---', + readtime: timeago(new Date().getTime() - (now)), + alert: 1, + time: formatDate(new Date()), + delta: 'DATA OFFLINE', + battlevel: "", + t1dname: "" }; console.log("sending message", JSON.stringify(message)); MessageQueue.sendAppMessage(message); @@ -253,147 +225,146 @@ function options ( ) { return opts; } -// check for Rajat build -function isRajatBuild (str, str_to_match) { - return (str.indexOf(str_to_match) >= 0); -} - // message queue-ing to pace calls from C function on watch var MessageQueue = (function () { - var RETRY_MAX = 5; - - var queue = []; - var sending = false; - var timer = null; - - return { - reset: reset, - sendAppMessage: sendAppMessage, - size: size - }; - - function reset() { - queue = []; - sending = false; - } - - function sendAppMessage(message, ack, nack) { - - if (! isValidMessage(message)) { - return false; - } - - queue.push({ - message: message, - ack: ack || null, - nack: nack || null, - attempts: 0 - }); - - setTimeout(function () { - sendNextMessage(); - }, 1); - - return true; - } - - function size() { - return queue.length; - } - - function isValidMessage(message) { - // A message must be an object. - if (message !== Object(message)) { - return false; - } - var keys = Object.keys(message); - // A message must have at least one key. - if (! keys.length) { - return false; - } - for (var k = 0; k < keys.length; k += 1) { - var validKey = /^[0-9a-zA-Z-_]*$/.test(keys[k]); - if (! validKey) { - return false; - } - var value = message[keys[k]]; - if (! validValue(value)) { - return false; - } - } - - return true; - - function validValue(value) { - switch (typeof(value)) { - case 'string': + var RETRY_MAX = 5; + + var queue = []; + var sending = false; + var timer = null; + + return { + reset: reset, + sendAppMessage: sendAppMessage, + size: size + }; + + function reset() { + queue = []; + sending = false; + } + + function sendAppMessage(message, ack, nack) { + + if (! isValidMessage(message)) { + return false; + } + + queue.push({ + message: message, + ack: ack || null, + nack: nack || null, + attempts: 0 + }); + + setTimeout(function () { + sendNextMessage(); + }, 1); + + return true; + } + + function size() { + return queue.length; + } + + function isValidMessage(message) { + // A message must be an object. + if (message !== Object(message)) { + return false; + } + + var keys = Object.keys(message); + // A message must have at least one key. + if (! keys.length) { + return false; + } + + for (var k = 0; k < keys.length; k += 1) { + var validKey = /^[0-9a-zA-Z-_]*$/.test(keys[k]); + if (! validKey) { + return false; + } + + var value = message[keys[k]]; + if (! validValue(value)) { + return false; + } + } + + return true; + + function validValue(value) { + switch (typeof(value)) { + case 'string': return true; - case 'number': + case 'number': return true; - case 'object': + case 'object': if (toString.call(value) == '[object Array]') { - return true; - } - } - return false; - } - } - - function sendNextMessage() { - - if (sending) { return; } - var message = queue.shift(); - if (! message) { return; } - - message.attempts += 1; - sending = true; - Pebble.sendAppMessage(message.message, ack, nack); - - timer = setTimeout(function () { - timeout(); - }, 1000); - - function ack() { - clearTimeout(timer); - setTimeout(function () { - sending = false; - sendNextMessage(); - }, 200); - if (message.ack) { - message.ack.apply(null, arguments); - } + return true; } - - function nack() { - clearTimeout(timer); - if (message.attempts < RETRY_MAX) { - queue.unshift(message); - setTimeout(function () { - sending = false; - sendNextMessage(); - }, 200 * message.attempts); - } - else { - if (message.nack) { + } + return false; + } + } + + function sendNextMessage() { + + if (sending) { return; } + var message = queue.shift(); + if (! message) { return; } + + message.attempts += 1; + sending = true; + Pebble.sendAppMessage(message.message, ack, nack); + + timer = setTimeout(function () { + timeout(); + }, 1000); + + function ack() { + clearTimeout(timer); + setTimeout(function () { + sending = false; + sendNextMessage(); + }, 200); + + if (message.ack) { + message.ack.apply(null, arguments); + } + } + + function nack() { + clearTimeout(timer); + + if (message.attempts < RETRY_MAX) { + queue.unshift(message); + setTimeout(function () { + sending = false; + sendNextMessage(); + }, 200 * message.attempts); + } else { + if (message.nack) { message.nack.apply(null, arguments); - } - } - } - - function timeout() { - setTimeout(function () { - sending = false; - sendNextMessage(); - }, 1000); - if (message.ack) { - message.ack.apply(null, arguments); - } - } - - } + } + } + } + + function timeout() { + setTimeout(function () { + sending = false; + sendNextMessage(); + }, 1000); + if (message.ack) { + message.ack.apply(null, arguments); + } + } + + } - }()); +}()); // pebble specific calls with watch Pebble.addEventListener("ready", @@ -422,4 +393,3 @@ Pebble.addEventListener("webviewclosed", function(e) { }); - From dfeb0cb788937737a457e7baf1a5eee2303b6a8f Mon Sep 17 00:00:00 2001 From: Jason Calabrese Date: Thu, 31 Jul 2014 00:11:08 -0700 Subject: [PATCH 7/9] added LOGO var back --- src/js/pebble-js-app.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/js/pebble-js-app.js b/src/js/pebble-js-app.js index 0e29359..6d26878 100755 --- a/src/js/pebble-js-app.js +++ b/src/js/pebble-js-app.js @@ -7,6 +7,8 @@ var TIME_5_MINS = 5 * 60 * 1000, TIME_15_MINS = 15 * 60 * 1000, TIME_30_MINS = TIME_15_MINS * 2; +var LOGO = 10; + var DIRECTIONS = { 'NONE': 0, 'DoubleUp': 1, From a19fa61023eec411082ee6f7a1bbf9e807237307 Mon Sep 17 00:00:00 2001 From: Jason Calabrese Date: Thu, 31 Jul 2014 00:17:07 -0700 Subject: [PATCH 8/9] added NameofT1DPerson back since it got lost; fixed null now --- src/js/pebble-js-app.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/js/pebble-js-app.js b/src/js/pebble-js-app.js index 6d26878..cefc425 100755 --- a/src/js/pebble-js-app.js +++ b/src/js/pebble-js-app.js @@ -7,6 +7,9 @@ var TIME_5_MINS = 5 * 60 * 1000, TIME_15_MINS = 15 * 60 * 1000, TIME_30_MINS = TIME_15_MINS * 2; +// hard code name of T1D person, for now +var NameofT1DPerson = ""; + var LOGO = 10; var DIRECTIONS = { @@ -74,6 +77,7 @@ function fetchCgmData(lastReadTime, lastBG) { console.log('got response', JSON.stringify(response)); var entries = response.bgs; + var now = new Date().getTime(); // check response data if (entries && entries.length > 0) { @@ -81,8 +85,7 @@ function fetchCgmData(lastReadTime, lastBG) { // response data is good; send log with response // initialize message data - var now = new Date().getTime(), - sinceLastAlert = now - lastAlert, + var sinceLastAlert = now - lastAlert, alertValue = 0, currentBG = entries[0].sgv, currentBGDelta = entries[0].bgdelta, From bc32a0510a0a4673bdc28f88c2bba5264a5469aa Mon Sep 17 00:00:00 2001 From: Jason Calabrese Date: Thu, 31 Jul 2014 00:48:54 -0700 Subject: [PATCH 9/9] don't pass the array for the icon, removed CGM_ICONS_RAJAT; something still isn't right logo isn't showing now --- src/cgm.c | 36 ++++++++---------------------------- src/js/pebble-js-app.js | 4 ++-- 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/src/cgm.c b/src/cgm.c index e175d34..5ec38eb 100755 --- a/src/cgm.c +++ b/src/cgm.c @@ -74,7 +74,7 @@ static const uint32_t SPECIAL_VALUE_ICONS[] = { RESOURCE_ID_IMAGE_BLOOD_DROP, //1 RESOURCE_ID_IMAGE_STOP_LIGHT, //2 RESOURCE_ID_IMAGE_HOURGLASS, //3 - RESOURCE_ID_IMAGE_QUESTION_MARKS //4 + RESOURCE_ID_IMAGE_QUESTION_MARKS //4 }; static const uint32_t CGM_ICONS[] = { // COMMUNITY Build Order @@ -82,27 +82,13 @@ static const uint32_t CGM_ICONS[] = { // COMMUNITY Build Order RESOURCE_ID_IMAGE_UPUP, //1 RESOURCE_ID_IMAGE_UP, //2 RESOURCE_ID_IMAGE_UP45, //3 - RESOURCE_ID_IMAGE_FLAT, //4 + RESOURCE_ID_IMAGE_FLAT, //4 RESOURCE_ID_IMAGE_DOWN45, //5 RESOURCE_ID_IMAGE_DOWN, //6 RESOURCE_ID_IMAGE_DOWNDOWN, //7 - RESOURCE_ID_IMAGE_NONE, //8 - RESOURCE_ID_IMAGE_NONE, //9 - RESOURCE_ID_IMAGE_LOGO //10 -}; - -static const uint32_t CGM_ICONS_RAJAT[] = { // RAJAT Build Order - RESOURCE_ID_IMAGE_UPUP, //0 - RESOURCE_ID_IMAGE_UP, //1 - RESOURCE_ID_IMAGE_UP45, //2 - RESOURCE_ID_IMAGE_FLAT, //3 - RESOURCE_ID_IMAGE_NONE, //4 - RESOURCE_ID_IMAGE_DOWN45, //5 - RESOURCE_ID_IMAGE_DOWN, //6 - RESOURCE_ID_IMAGE_DOWNDOWN, //7 - RESOURCE_ID_IMAGE_NONE, //8 - RESOURCE_ID_IMAGE_NONE, //9 - RESOURCE_ID_IMAGE_LOGO //10 + RESOURCE_ID_IMAGE_NONE, //8 + RESOURCE_ID_IMAGE_NONE, //9 + RESOURCE_ID_IMAGE_LOGO //10 }; static const uint32_t BATTLEVEL_ICONS[] = { @@ -116,8 +102,8 @@ static const uint32_t BATTLEVEL_ICONS[] = { RESOURCE_ID_IMAGE_BATT70, //7 RESOURCE_ID_IMAGE_BATT80, //8 RESOURCE_ID_IMAGE_BATT90, //9 - RESOURCE_ID_IMAGE_BATTFULL, //10 - RESOURCE_ID_IMAGE_BATTNONE //11 + RESOURCE_ID_IMAGE_BATTFULL, //10 + RESOURCE_ID_IMAGE_BATTNONE //11 }; static void sync_error_callback(DictionaryResult dict_error, AppMessageResult app_message_error, void *context) { @@ -195,13 +181,7 @@ static void sync_tuple_changed_callback(const uint32_t key, const Tuple* new_tup gbitmap_destroy(icon_bitmap); } - // set the right arrow into the bitmap - if (new_tuple->value->data[0]) { // will be true if this is a Rajat build - icon_bitmap = gbitmap_create_with_resource(CGM_ICONS_RAJAT[new_tuple->value->data[1]]); - } - else { - icon_bitmap = gbitmap_create_with_resource(CGM_ICONS[new_tuple->value->data[1]]); - } + icon_bitmap = gbitmap_create_with_resource(CGM_ICONS[new_tuple->value->uint8]); bitmap_layer_set_bitmap(icon_layer, icon_bitmap); break; diff --git a/src/js/pebble-js-app.js b/src/js/pebble-js-app.js index cefc425..7054355 100755 --- a/src/js/pebble-js-app.js +++ b/src/js/pebble-js-app.js @@ -45,7 +45,7 @@ function fetchCgmData(lastReadTime, lastBG) { //if endpoint is invalid, return error msg to watch if (!opts.endpoint) { message = { - icon: [0,LOGO], + icon: LOGO, bg: '---', readtime: timeago(new Date().getTime() - started), alert: 0, @@ -152,7 +152,7 @@ function fetchCgmData(lastReadTime, lastBG) { // response data is no good; format error message and send to watch } else { message = { - icon: [0,LOGO], + icon: LOGO, bg: '---', readtime: timeago(new Date().getTime() - (now)), alert: 1,