From 78f53bda01850aa3f743407d1c6254473ae8f8d9 Mon Sep 17 00:00:00 2001 From: ELUTE Date: Fri, 27 Feb 2015 12:24:06 -0500 Subject: [PATCH] Update all files to 7.0 --- appinfo.json | 153 +-- jshintrc | 3 +- resources/images/batt10.png | Bin 1509 -> 0 bytes resources/images/batt20.png | Bin 1511 -> 0 bytes resources/images/batt30.png | Bin 1500 -> 0 bytes resources/images/batt40.png | Bin 1498 -> 0 bytes resources/images/batt50.png | Bin 1512 -> 0 bytes resources/images/batt60.png | Bin 1500 -> 0 bytes resources/images/batt70.png | Bin 1498 -> 0 bytes resources/images/batt80.png | Bin 1491 -> 0 bytes resources/images/batt90.png | Bin 1489 -> 0 bytes resources/images/battempty.png | Bin 1708 -> 0 bytes resources/images/battfull.png | Bin 1497 -> 0 bytes resources/images/battnone.png | Bin 1193 -> 0 bytes resources/images/blooddrop.png | Bin 1729 -> 1530 bytes resources/images/brokenantenna.png | Bin 2867 -> 2568 bytes resources/images/club100.png | Bin 1801 -> 1840 bytes resources/images/club55.png | Bin 1413 -> 1460 bytes resources/images/down.png | Bin 3062 -> 466 bytes resources/images/down45.png | Bin 1347 -> 622 bytes resources/images/downdown.png | Bin 826 -> 945 bytes resources/images/flat.png | Bin 1283 -> 494 bytes resources/images/hourglass.png | Bin 1807 -> 1474 bytes resources/images/logo.png | Bin 3462 -> 2079 bytes resources/images/menuicon.png | Bin resources/images/none.png | Bin 961 -> 0 bytes resources/images/phoneoff.png | Bin 341 -> 0 bytes resources/images/phoneon.png | Bin 419 -> 0 bytes resources/images/questionmarks.png | Bin 2335 -> 2113 bytes resources/images/rcvrnone.png | Bin 0 -> 202 bytes resources/images/rcvroff.png | Bin resources/images/rcvron.png | Bin .../images/{err.png => specvaluenone.png} | Bin 3551 -> 2800 bytes resources/images/stoplight.png | Bin 1862 -> 1564 bytes resources/images/up.png | Bin 386 -> 362 bytes resources/images/up45.png | Bin 550 -> 520 bytes resources/images/upup.png | Bin 809 -> 849 bytes src/cgm.c | 1058 ++++++++++------- src/js/pebble-js-app.js | 144 ++- wscript | 19 +- 40 files changed, 789 insertions(+), 588 deletions(-) mode change 100644 => 100755 appinfo.json mode change 100644 => 100755 jshintrc delete mode 100644 resources/images/batt10.png delete mode 100644 resources/images/batt20.png delete mode 100644 resources/images/batt30.png delete mode 100644 resources/images/batt40.png delete mode 100644 resources/images/batt50.png delete mode 100644 resources/images/batt60.png delete mode 100644 resources/images/batt70.png delete mode 100644 resources/images/batt80.png delete mode 100644 resources/images/batt90.png delete mode 100644 resources/images/battempty.png delete mode 100644 resources/images/battfull.png delete mode 100644 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/club100.png mode change 100644 => 100755 resources/images/club55.png mode change 100644 => 100755 resources/images/down.png mode change 100644 => 100755 resources/images/down45.png mode change 100644 => 100755 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 delete mode 100644 resources/images/none.png delete mode 100644 resources/images/phoneoff.png delete mode 100644 resources/images/phoneon.png mode change 100644 => 100755 resources/images/questionmarks.png create mode 100755 resources/images/rcvrnone.png mode change 100644 => 100755 resources/images/rcvroff.png mode change 100644 => 100755 resources/images/rcvron.png rename resources/images/{err.png => specvaluenone.png} (75%) mode change 100644 => 100755 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 src/cgm.c mode change 100644 => 100755 src/js/pebble-js-app.js mode change 100644 => 100755 wscript diff --git a/appinfo.json b/appinfo.json old mode 100644 new mode 100755 index 60de5b1..a8ff713 --- a/appinfo.json +++ b/appinfo.json @@ -1,9 +1,12 @@ { "appKeys": { "bg": 1, + "clrw": 8, "dlta": 4, "icon": 0, "name": 6, + "noiz": 10, + "rwuf": 9, "tapp": 3, "tcgm": 2, "ubat": 5, @@ -18,84 +21,13 @@ "resources": { "media": [ { - "file": "images/up.png", - "name": "IMAGE_UP", - "type": "png" - }, - { - "file": "images/upup.png", - "name": "IMAGE_UPUP", - "type": "png" - }, - { - "file": "images/up45.png", - "name": "IMAGE_UP45", - "type": "png" - }, - { - "file": "images/flat.png", - "name": "IMAGE_FLAT", - "type": "png" - }, - { - "file": "images/down.png", - "name": "IMAGE_DOWN", - "type": "png" - }, - { - "file": "images/downdown.png", - "name": "IMAGE_DOWNDOWN", - "type": "png" - }, - { - "file": "images/down45.png", - "name": "IMAGE_DOWN45", - "type": "png" - }, - { - "file": "images/none.png", - "name": "IMAGE_NONE", - "type": "png" - }, - { - "file": "images/club100.png", - "name": "IMAGE_CLUB100", - "type": "png" - }, - { - "file": "images/club55.png", - "name": "IMAGE_CLUB55", - "type": "png" - }, - { - "file": "images/logo.png", - "name": "IMAGE_LOGO", - "type": "png" - }, - { - "file": "images/menuicon.png", - "menuIcon": true, - "name": "IMAGE_MENU_ICON", - "type": "png" - }, - { - "file": "images/brokenantenna.png", - "name": "IMAGE_BROKEN_ANTENNA", - "type": "png" - }, - { - "file": "images/blooddrop.png", - "name": "IMAGE_BLOOD_DROP", - "type": "png" - }, - { - "file": "images/stoplight.png", - "name": "IMAGE_STOP_LIGHT", + "file": "images/rcvroff.png", + "name": "IMAGE_RCVROFF", "type": "png" }, { - "file": "images/hourglass.png", - "name": "IMAGE_HOURGLASS", + "file": "images/rcvron.png", + "name": "IMAGE_RCVRON", "type": "png" }, { @@ -104,88 +36,89 @@ "type": "png" }, { - "file": "images/battfull.png", - "name": "IMAGE_BATTFULL", + "file": "images/hourglass.png", + "name": "IMAGE_HOURGLASS", "type": "png" }, { - "file": "images/batt90.png", - "name": "IMAGE_BATT90", + "file": "images/stoplight.png", + "name": "IMAGE_STOP_LIGHT", "type": "png" }, { - "file": "images/batt80.png", - "name": "IMAGE_BATT80", + "file": "images/blooddrop.png", + "name": "IMAGE_BLOOD_DROP", "type": "png" }, { - "file": "images/batt70.png", - "name": "IMAGE_BATT70", + "file": "images/brokenantenna.png", + "name": "IMAGE_BROKEN_ANTENNA", "type": "png" }, { - "file": "images/batt60.png", - "name": "IMAGE_BATT60", + "file": "images/logo.png", + "name": "IMAGE_LOGO", "type": "png" }, { - "file": "images/batt50.png", - "name": "IMAGE_BATT50", + "file": "images/specvaluenone.png", + "name": "IMAGE_SPECVALUE_NONE", "type": "png" }, { - "file": "images/batt40.png", - "name": "IMAGE_BATT40", + "file": "images/rcvrnone.png", + "name": "IMAGE_RCVRNONE", "type": "png" }, { - "file": "images/batt30.png", - "name": "IMAGE_BATT30", + "file": "images/down45.png", + "name": "IMAGE_DOWN45", "type": "png" }, { - "file": "images/batt20.png", - "name": "IMAGE_BATT20", + "file": "images/downdown.png", + "name": "IMAGE_DOWNDOWN", "type": "png" }, { - "file": "images/phoneon.png", - "name": "IMAGE_PHONEON", + "file": "images/down.png", + "name": "IMAGE_DOWN", "type": "png" }, { - "file": "images/batt10.png", - "name": "IMAGE_BATT10", + "file": "images/flat.png", + "name": "IMAGE_FLAT", "type": "png" }, { - "file": "images/phoneoff.png", - "name": "IMAGE_PHONEOFF", + "file": "images/up45.png", + "name": "IMAGE_UP45", "type": "png" }, { - "file": "images/battempty.png", - "name": "IMAGE_BATTEMPTY", + "file": "images/upup.png", + "name": "IMAGE_UPUP", "type": "png" }, { - "file": "images/rcvron.png", - "name": "IMAGE_RCVRON", + "file": "images/up.png", + "name": "IMAGE_UP", "type": "png" }, { - "file": "images/battnone.png", - "name": "IMAGE_BATTNONE", + "file": "images/club55.png", + "name": "IMAGE_CLUB55", "type": "png" }, { - "file": "images/rcvroff.png", - "name": "IMAGE_RCVROFF", + "file": "images/club100.png", + "name": "IMAGE_CLUB100", "type": "png" }, { - "file": "images/err.png", - "name": "IMAGE_ERR", + "file": "images/menuicon.png", + "menuIcon": true, + "name": "IMAGE_MENU_ICON", "type": "png" } ] @@ -193,7 +126,7 @@ "shortName": "Nightscout", "uuid": "4bfa0b46-b9fa-4e1a-b2ba-a2ba7168f897", "versionCode": 12, - "versionLabel": "6.4", + "versionLabel": "7.0", "watchapp": { "watchface": true } diff --git a/jshintrc b/jshintrc old mode 100644 new mode 100755 index b986cfd..83d49d9 --- a/jshintrc +++ b/jshintrc @@ -12,7 +12,8 @@ "XMLHttpRequest": true, "navigator": true, // For navigator.geolocation "localStorage": true, - "setTimeout": true + "setTimeout": true, + "setInterval": true }, // Do not mess with standard JavaScript objects (Array, Date, etc) diff --git a/resources/images/batt10.png b/resources/images/batt10.png deleted file mode 100644 index e786bb5298f0371073501d0157c437938575547e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1509 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 N002ovPDHLkV1fm3=xG1| diff --git a/resources/images/batt30.png b/resources/images/batt30.png deleted file mode 100644 index dbf60bd433ae8d9d91bb91d3dc099b4c6f2f9586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1500 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 AVE_OC diff --git a/resources/images/batt50.png b/resources/images/batt50.png deleted file mode 100644 index 266d9f6050c078ba1daba38905055dfc25e1325b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1512 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 AJOBUy diff --git a/resources/images/batt80.png b/resources/images/batt80.png deleted file mode 100644 index 7e385be40176886fffb1565800efa0cf30572031..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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( diff --git a/resources/images/batt90.png b/resources/images/batt90.png deleted file mode 100644 index 02a5e2e863ecfcb2317f197fc42b342a30f351fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1489 zcmV;?1upuDP)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_)k9UyIcMH`d#AkjHl0qbSS%V~0YDgrq-o0ObOJy`_>asCRi#?3 zQZAPf5ekI@0KxHiB#vW7qY;b6f*=S8!w@t3Y_MLhpE4Ye$0SLDbB;XEZ$_$$nX%by z*lxFo2xj(D-R*V&lu9L9trl695!_QmQS^}Nj_*GhgW%S-)9Emq&G6oT8U4oldwq6S z0F6e2cDoHg;jhQ9O!U(b_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)j%;jf7!6?CHr;NQ;cy6mQi`8KYmMu=IF19rbUGyn0vyLdDTQTOA9+oKLZ*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#P<7My_;BnS}>0E>opO)&B> ztDTjW8RjR|N%yPz^_#=tpw2n<-s>ynz1R7CuGMN)lO$0CV67#~GA@@303yP7q^cA} zK^(_48Vy8*AP4|3d7k6FXF8p-TrM%jV68<}pMnHI!1a0sU^pBy9*=R(k>@#46k&>@ zKvmgnHf*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(OKP@vI751NqR z#c=T-5DsuLMh?cC#-lNM_2AL7sTVIQiHQ=Z3IPl%jTJ+n{Ag(#o0ja(dw6icg?6{e z`#nu}W8iN9 zc2!m`mvgyXLqkKwVo}pHP18)Lkj&BPbh@pr4Zzsgm_?{n^v1?UYilbx=kepmLI_n= z{~vTRnLKvv7bjD&aA%qpTn4>>@_#n%2Fc>^>;sgM%*Zb|;H!D_~WC(ynBC)fx z)6meMX_}%a%gf8d!^5Rg$#kMQ`qQUR05nZYCX<0cfH5{PG4bHR1JjA-4jCLA1Q3lz zX?%ZwKLESk{_fp7Q8A<@=u9T#^Z5Yu^z`V~Q2Wf8Gn<>672;`vo}8Ryi~$IRLONPe zl$Mqj0Jm@7t}wSOnpXPo;X?p*b#;3Fk;36H=bUp+ZmHVpLZQ&r)dirtyZc~}`uh3+ zT)cR(SS(hJe*5;VBuP5OAcw=z+}sS{$&)AIuuW76ee>o`08Xc~v9a;c?CS091<=;k zmP(~8Sxx^xKR;hvTdU76r&Fg+0T>@2w}hqu-nw-QfGo>iueSo4g3-{>u(Y&f$su39 ze5tRmH#M0=d3o^2{Rgd|^fzwY0N{4JT`rd?`s~@WH2CMwpOw%;h}W-Q+wFGz-P5Mx zoF6}a9Kiki_bWN1R4NgX_P0gRl=k-a&CSiS=x5KK?H_GX9UUEX9=v$*!iXkUY;A3k zu`MkvilSIYbI$4h92y!r9R29gBN}QYF${`CA^_^^>-8+$y$Tp(TU%RCpFXXYsH>)? z2Eg|A_Qb>lec8KZVzF2O&24XQQ@0Sp$|f{OuLui;!spMQ0Z6nEy0&#u zOsY~opV!-8zkc1b`uq3q*ypeH_4TT_9*;*)0RXG3s{kZ&!k<5X^bW>YB9W+SH@3I8 z=W;py=RaZ8Q%ARbVPPQ{3|iryKYxB|YU<$ky)9$t$mMdWROF&2$R zpFe+2gT%hqjjF02KYmmcrKhJymSz22Qz#S`78ZW}`XxycofxXBUb}W}b#*l!k6*ZO z0r*?<&CJX=olaSnIpM*#r_*~UpQ@?@0|TK@hz>AV-jFoR z;cx&51Ofm?Mn>o;-Mb22y?Vtt_jcM6_?BP`}gm@zP?l{<@5PeRZXYU#bS|j?smJKPG>%! zkH_NxB9Ta`R9akI42Q$9Sj_MDYnry32>Y$3Yb+j*Q^nNX-Ax&KsC+)(=;$bgZ7?4(M{X0rtXfph21UA}xd5{byNOfkHB_ijF)7Y806 zl`7S#sj1=N;c^FTQ&ZFU`1t(%e7WgHU+WS=&|=rt))p5RXJ==ZmzU|i-qFz!i9~|I g;L)Q;%jXXM0~$w#$~zLvl>h($07*qoM6N<$f~eQ=5&!@I literal 1729 zcmV;y20r(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ?M@d9MRCwC#T1`(AT@-%qboyZ{W3kxMq?9V8Qfbkk&_)wk=t>h~*!Ty;1@4S2 zj602cW#L8>;vXh0~NLZLvCB#|UZv=vqrAO89CCj>#j!-o%X<;oQ>#=sccxj{=5MM#na z0JwYiE^gnx4FK}B9Vh8nEJhZKg#Zu$G8haL3Tl!51%=6h5%3?5Rm=Y@Ane`(&=>c>eVYEA`(Th;&Z7u;B-1oPN$Oq zP-kbS40vV#(4j*#H#b+609J8HM~P_wV1!o>^R6gvDY3&+`}@9K`VO@b>oMd_GSd9UTOK4j(>TCg+u{yStkJ z(1{Z#s8A?uUmt$?@+EN`R|aaWrq}DKv9XZ=(49MXD!L%4DBz11FUl*chK7dU0tP@` zU0no#91aI15{d1@aEY0Ti3!@hdv_U_KedAg4-xCCL^{cu86A?Xm@`Q9cUD@(+J&osi+P7~X0iYWrTofRT|A0D#?Y-|#reWD<-q#9}c#efm^gL8~O?`T2R7RlD6z zCX;Ey4D&os4u^vPP;YOqIvE}s8p71n6ac{CaA0w9aZ^dZ`uchR!1L$N75zkQ8ZcuF z^Yil<92`_sc}AlV0I;yIpy;MT5r%`oAY!qY+|Oh(itV-l;Pva*>H_@e(W5fP^ZC4D zD>eWa85vP5_qA!jU%q_7ix)3`k+~ACvN8#{QbAh^_~XZqSXfw)CrCsP1Yy$?TX_bR z&*$;(-Mg&?T#{TVBe_<<*^K3Kxw8JJPoLDm@Z{v=FFvgvMy`1qRRDwV?JH#>mEV)^a8bUKY}Hj6+YfX|;lBbiLD`JB_~ zgw<-5nPrTD<2Xo?gu1#qWHK4pY__chOhjOeArJ^)XlO{D=;|scQ55m!%^R3ZCUkao zLaWtcd3hNcjRqQx2Kjs*;cysJQ&ZqL4*zahA&Mf-o;{11nHhvaAsjz`Tphcm4<9~| z!C)Y*R!cn3%W2t-HjPF@0H~p%fvi?58I4A2Y;2@dDy5FylGp1+Pfrh8T3X=oc;q0q z5uam>K@>&k^?D?eNeF^~rKKgDJ9iFdvl)ui&?)h+J%0R{c%G-GrY3T^Tm*m^W9wqJ zqzseEB(tp5YDurx)7aRUx>7u%DAM`!=jGD_kH@niId^n)P+MCYxm+%?TCD_tu3o*W z&Yaft^fZ~xW;$@-0C5~gI-QQ%+uMof`9A{ndcAb|^l1V>yLRo8&yoFpKc&-YMFBG< zi%ZAG#&GJ?DF}jqZ{NP5ySp2SL;_By6QU?0l}e#dD1hgAn9XJw3qRgagv;fEBuU^nP90Htb#5yZ3Q<#2lYC-mv)TU0u+!zM@L7gudk1cM&o}nY_r*DU|@hICMGIg@}Q^>ueA~bfZ5quL?RK4kB=iB zk0YDSLJ$PBw6wtI^TF+QWAEO*RVm`B7+|$ptw6j6xCXcexCU6w#sgqAhHHR#j{P$L X7(V0DUo{gV00000NkvXXu0mjfS6M8v diff --git a/resources/images/brokenantenna.png b/resources/images/brokenantenna.png old mode 100644 new mode 100755 index 90ed898de6947661530315f16a611d83cf6d1212..d20dfbc6f3172f419bd3c1acf562b10ad6c56ba2 GIT binary patch literal 2568 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 r+UJA|?Q_C~_Br7~` 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 Tvq21I00000NkvXXu0mjfaaf)G diff --git a/resources/images/down.png b/resources/images/down.png old mode 100644 new mode 100755 index d42da57954e38f8d6f6eba2fc8b544dbc8ce1229..1446491e0d3ae3341ecae670d8e258a15709b588 GIT binary patch literal 466 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 Eg4E8dXaE2J diff --git a/resources/images/down45.png b/resources/images/down45.png old mode 100644 new mode 100755 index 00d3a9099b80dc475fde468cd355caa5e1d63c7c..804803df6ae5fc3d23f113cc02a25e2cbfccebd4 GIT binary patch literal 622 zcmV-!0+IcRP)yZr6b``^ zaK!5$ppt{M3U42)Fkg*bjFBt`f0Fn_S;ihT+yQ`n?Ih^VAc5odI zhnM>+6MmJrEX)0V?>bAwg^e+3ngT#oRW6kYcNY*uR7%6>pOeTJ6l*DP8daHam%Q7PR_HCBu`T2YfhV7K~RsoUVywBFgg|0Cv0GYPAYijWOMhRZ0mV zX0zFRK9^E1m&+tcilT75;fw49@~PwTm?Q}iWmz^Jj|2YqFYB``u9$7U9smFU07*qo IM6N<$f~lPgRsaA1 literal 1347 zcmV-J1-$x+P)C8-r4y$sIz z1(ija=@}&ohL)C=3XUoHNvR6KmBl5gxy1^edCB=j1^GpZC8;SuwNN`ifY&9zM8Q2V zGf%@B%Ic^COV3R@KmmGqR}Dz8;3P&HBgsdiAkOCwZM zN%Mo&0qsdTsk&Brf_ks?j~Fa4tTl=;wl$GAWj1|jcENn7#S+U2R(007HgUFrcCPl; z4#ti;PHN6dE()&lZVK+o9_pUDUMAi)KJLE3ehL2h0ri0sgO&#G3b`2iGMp(wF48J0 zBDx}GX6&B02MKJ6x=CTl4Jm6Do(SY&2q&CR};%bsVSUs15B@LjQXNml8qvNsj_ zl_gcXY8Y$1>ZaB|Y}9M2X+GO3*H+kmv{SmPsQYxUYF}gj-HA4nW>5Y*HGbOR85%SD zXMLZOF!%I)^94&6i7aki@@-k>@_Q>oR-InsvUcBk%MIH$nQY#&)nwcD9acN{?{?jD zc3;^32M2Qw{XEisO#JwYlh&usok>3X>-?mP+Lw-ANxb^+`kb3Kx9;Alzo&fv#KXMD zVo&xz%X}g7^5EeJe3j8|tr}dxX|Nj6D01q_RbY2($000Sa zNLh0L01m_e01m_fl`9S#0005vNkl@gzcU6Rfu+R3zG5#ehA+)rgoInEnbT;!v{nGMls^HSA;L@w$(yQRotKg81 z$D?^ZpL8qJa4sFA-EN0-@@}$Pi|W)vV9Q=*+`xD>S4FqrJcquA)NAt@Ocr9>~6OZqE*CH>^V?uJocvW8hOt@)Mwqn1=?>Eo$%i|x zn`DM@t&3}3T>DB2IsVnbp;#n6%R;JOANIv!CULAId(q!7*Xwl;mZH_bV_0B-V!&dt z=$Aui?9{-Q%jN&rW9SssZ^V~g1(#k0mtF;zUImw(F@Mqsbk@Q)BE0|r002ovPDHLk FV1kp5d^-RD diff --git a/resources/images/downdown.png b/resources/images/downdown.png old mode 100644 new mode 100755 index ff69adfa6f29fc0c9a8e27863cb33e00447fe5f6..43b6bf00cd55044274899d16e813c71e61eaa312 GIT binary patch literal 945 zcmV;i15W&jP)axqFYXex!kF7Z?O=-^-}CY;bcdB5R8`sv-fch~8CHs$;MywCf7zVFXH zfd7Xmin&}45D^Rpd7j4D!eua`izy}kYN@-m-jnGb~!l4Yp|&ogn=;azD0(Sw^Q9m$~;W#Eiw#ViHkl7Os@5{$P z2bEyWX0x?gO)7xYfUmEwqCh zFwDip#b7W165YYUfj%Oy*IOtQrY|iBp=2_tTh`Upl^_Th@Y-~I} zKF&V_U0z<=?RHI6tE;QGx3}Z*_-FT-at(*W^Ye3hBA?G!sZ?YhwJ^pQXEGU=%SB1$ z@p$t2{P*|wG#&ir5(MG;`kIDlXJ@C?YAI=waCdj-cDq%nHa9oR7}nE5S=Vxds5 z*=$NIR;%^+`1tMZjjTz+)6lbUGax zO%kfr>ekkllBRmSE}JDIOH%gm@UXtV{+q?&aGai=ilRubNkX&P3m3~(O*NgIoV43*LOe+p#+c){P$*=#+tcZ^ zK0#A_e0;=WF#te39`AO$(_`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>;T5h((euxOL@{}md2izj<*k0IY&S(ZKR!MhC8-r4y$sIz z1(ija=@}&ohL)C=3XUoHNvR6KmBl5gxy1^edCB=j1^GpZC8;SuwNN`ifY&9zM8Q2V zGf%@B%Ic^COV3R@KmmGqR}Dz8;3P&HBgsdiAkOCwZM zN%Mo&0qsdTsk&Brf_ks?j~Fa4tTl=;wl$GAWj1|jcENn7#S+U2R(007HgUFrcCPl; z4#ti;PHN6dE()&lZVK+o9_pUDUMAi)KJLE3ehL2h0ri0sgO&#G3b`2iGMp(wF48J0 zBDx}GX6&B02MKJ6x=CTl4Jm6Do(SY&2q&CR};%bsVSUs15B@LjQXNml8qvNsj_ zl_gcXY8Y$1>ZaB|Y}9M2X+GO3*H+kmv{SmPsQYxUYF}gj-HA4nW>5Y*HGbOR85%SD zXMLZOF!%I)^94&6i7aki@@-k>@_Q>oR-InsvUcBk%MIH$nQY#&)nwcD9acN{?{?jD zc3;^32M2Qw{XEisO#JwYlh&usok>3X>-?mP+Lw-ANxb^+`kb3Kx9;Alzo&fv#KXMD zVo&xz%X}g7^5EeJe3j8|tr}dxX|Nj6D01q_RbY2($000Sa zNLh0L01m_e01m_fl`9S#0004^Nkl00&4w0yqE%SU?Hu02~k$ zfCG?#1RUJ)?G2Z(2@9np*O~208anJBUSOuvuJ^s5K8P>6ehf}nI!;(RPFOllSUOHv zI!;(RPFOnD3-^6bvwN`q03ZkgH4K9a!;tQnVf`DP=UHW0_PpK!iyR)uQ58i&ksdG1kHuOA(_dJqP<<8u>g;6Gg|c7uGFe?1h0&CniD|)OD>M zj|WBjh!F;D+tO?wF~aD)nx>&>A2Gs^Mca9V2w`+wQ4~@19`?d$F)_}A8)4J4tQ9s@8lBV~|30t~UW$~_(d-6%(l(Q(Db4P|>KtCzf0H8hiuFb7ZrE=g tbaBGcal+DZ!qRcV(s9Dl`7mLnegI-B37w3aeewVR002ovPDHLkV1iT+N{9de diff --git a/resources/images/hourglass.png b/resources/images/hourglass.png old mode 100644 new mode 100755 index 422fd64d8e6b7493ca4d6a69d8c7fd73c7fce7b5..4c4f25030ee3333044f82607571a4d04d15d9902 GIT binary patch literal 1474 zcmV;z1wHzSP)P001Zm0ssI2gssLr00003b3#c}2nYz< z;ZNWI003foR9JLUVRs;Ka&Km7Y-J#Hd2nSQK~PXJ004NLRmiaofG`XI!QNANgm)Yq zG7drkMM8kGe?b8aSDx(cY@@Gwk8A5k6IE4J&ys7dX#r+l25uM$C|@o7OhgS2D;@?Q z4@kBY$$C)ma{vGZ3`s;mR7i=PmQPF*Ul7M<_wBy!ZrhE}Eo^BuO#}_4gm4ogk%WYx zVxo611TH4Tm>5z$5fb14G$L2flc6Co(cpn{gb<7nF@i=TiBZ(_(lq>QLEG*79j30^ zT3h|iq22d(=Ckv@@858YF#w3i<2=v9PvbZa02pH&$Kh|mE2|G7#OZVbfM6KLvGI1Z)6_=09C zm1=2exq9^~0OT~PuC88PU0qmMu-omJpfw$=hNx5 zVHi0b@lO;*Q4}%FOeT}bWXjH_-EMceT=;=JmZB(@KUaKY>K=HjKFXf%5E>{$Q^g+c|d3R#S?M~@zfqNpg! z=;&y{tGT&3obJKFLBlZ0vlwH~pFeMFYonC*_4Or_NyeCA7~yaj0GgVb*4EaFMipnF z&CbpS0)g)C?zOeGo}L~})5gcgOZb;!F~+`p`QrEcbzRpq?e*)|rJc*L7-OMO2mpF} zd&_$AMHXVdrPFE1KZX8ir9bul{rfX#&Qw)Z)z;R&diCo6k1-q$2ZKQXXl`z%lzP41 zyLa!VQmKDqJ%0SSsi_GQcRHQHV9@P$vQpP|Jk4+1xKWBVJUombS(X(=Fh+8ahXi!;NU>hwDafByWQ^n{r&IXznk}_BuR|1v9Ynj z^|iORck$vyL{Lg?HXFXZeEBkNo$c-I>({TN@E(t+rl!W{^WnPt_U&7qUK<-5c&HLW zus%3>^5pF7?D6q2V=SA^qFXc?ZEkJ`0JqzH>eMNp&nL@rBofJEt*oqQnr0?@^XARZ zpFbB}M6p;b6beyFT`rg3@28ZScWsWfw6t{M#0eDj-o1N8DOOutT&$?5sI07{lul1i zV`ol#v-oOnZ@+cxR@q(L+1c6O-=9b%@V3uE@UNkvp{uKFVPT=ArDbz-^YHMnp#C!r zn~I|7y6*LQbzSf3>dIrq<8i0cdG6e~w{PFRc=3WUMhIbynH83`yuk-WQ93$02q8N= zJ2-EU&1Pq2W>i(>d0rGnYb9cqH&(-15bGRG(<&+|BuTn||9&c!f>bJ1R-FPfD>}Tc zu=C~1mjb19a&mHheqIm+GbwXi1(c$-ud1r8t*xg|pU#CP5(!fpt46;kWv$Y2Gf_%q cSq6ar0LEDeNQWne%>V!Z07*qoM6N<$f>8R)-T(jq 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 diff --git a/resources/images/logo.png b/resources/images/logo.png old mode 100644 new mode 100755 index 17f96a46cf655648db28b80de4aa40ef4ee7b34b..120f353b9b138b968e2b9b40b2105c9697418862 GIT binary patch literal 2079 zcmV+)2;ldLP)V#;8%i)3M0UNTcj%bZ1PZd1`@7dN-_{p0w3o0s3O z-|zgfz0Y~i^Lfs5?k|Igu$){j7b0@GTv{3o2EATyG#c%8yHF^UN~IEs#NXea-a4I5 z4u``q%nA^|<>Yd?78e&0(QG!W)#|*wyv>_8^Z9&MUL+DlMMagCmcDxRirs>%Xc;ac zBBENYj){q3vBYArOeTwsjor0tm#3#E%TG&7>+S6&Xs6S;Hm<|rpofZz3fdMB5KvfH z*xK4^GMVVD-EP-vwT+F9IXO8bvu@owrBbdJl>q>k%dM@grPnHzN-mfC`T6m9 zJRXlH5D0>Tg0i!--@SW>h)$=osHljxG&D4jB?$@;(PpzD;^W7U8HQmPrmn6I5x;!- zlAN5(nvy)u`ki5z{QP{gwvQt}aA;{`@(e)X~xL2iM_nBqSsNKzVsN zdy(<+@&5jPtyYVOI-M>hB?SNq3k%77V`F1OLqj^9j+IYMO(g+ZGKe@lJRB1f<8rw= zJ3II6*`w8Jo0^&&4u{L-5(oqy9v+#QnTV)RC`w97Mn*>3+SFIHCaW7xK6bJ->h%GHG0FaoN=yJK{=jV%yi)(6XEEWqQS}c~@+S>Ey&r|$< z|Ni~dsZ%PIinN}dp1yG5LRD22BI@;eu~_Wy?>{y+hKL*hn3|dbfbj5ehGAa3cp(%D zPoF;h_U+r;+}y6Nu9GKE3Iqa`N(BIojg2yyEHyP%sZ<_2c8qY1M&sz{XkcJqXlUrn z%nYIN0KjZEQw)+>$<~>fnFfQQr>CdCzdtrMc3@xt04x?uPEO9(uV0TIJqiGWgM;ti zzu&N7Lw|pNWMrhbw>JPREGz&3hY+a%0f60Zw^%HTi;EjKZUg}OwOA~3b8{5wHk-}I z$44ra0>HLy+W^4fa8O)3olZ7vI8;{X9EM@My}gx6C6C8btJN(nE%o*Fd_G^PRL;-O zGYm64JX~8_E0IV#J3Cb>l|rGInVHdOG@CYUB75@rd@nDrr8=ors{vsD{{56@fq{Vq z1qGB#7K`QFxpM$eTwF}S#N~2t-@Z-3q}6H<95}Fd?_RszZZH_Uyu2h5$@uvAQXUTs z42VP`kw`Q;I*N$7xw&-5Lx&F0O#$HQ)vJh@ot;g~=;-K_l$7A$U;v1jkPFE0mxoSdAc`apk~ znVA4^{P=NNHa9m5g+c%ji9|x7kk97_1O!AyMfv*r3Iqb7Q0U>|0RSN(As;_}L`1XM z9334E0M*si%W&`Ay9WTl!NF7?5V5JLDJ(3Elp+_ec#e&Y?djFbPi4!Lf@y3lC01y-uM8)q< zzhLReks|<*o}P|~A3l7bTZe^(y?*_goSBi45g#8<$rcS_Rph=`b-on_6vQeXTx zDYkFlZnxWwMx$IVrxr_D^3Z$xa1CKLc@ZEZzFyR_a>!l(aXwq2a&K=hRZ=P?dcFS2l`DuiGc!XYp-d(- znM~}Kzv$~u4Gj%c4K7~1NF1BZMkOsIBxGo4h&X?rQ&$tsD*$l)`t{$xf0Nz0T&_x` zA_1q<`G4TL&$BcPQsU9Wg9i`LEw$F9|E4bsT~Sd%kt>x-8yg#mxjJUuiNRIh7w%-U z*#rUshr{XV>6x6I+`4sZL_`E4uJJ*!oc@AK=5rq-{})gI_y-L@R_z#53SR&K002ov JPDHLkV1k^!&T9Yw literal 3462 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 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 deleted file mode 100644 index a81333320a7990d5959d82c242e32f8b0c1d9891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 961 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8Ea{HEjtmSB{v-zIPGewT`kv|R z91xI^Uy@&(kzb(T>FlgfP?VpRnUl)EU~xJ*Az|Kw7muEtQaNxSARr{@iQE$jNkPe_ z2kPcE_BPIBrKrMQo^wB0r@GF3 zDXGfUHf`E8u0GA5o-4TyPCcr+a_3R5d6g%By0ZRs?NnW<>994x+M(gP>VB7lwuZ+3 z2TwRmZ9K&w(kCFMR3nhYF(D=@gpJ>ejg66wm5rH=y^W#GrLC%smB(H3ok{@HS2-qf#H8^h(`JKWmCsJk%yp*e$m(p5_!;MCg0@W$K=lKo9*1Wxcf18 zy3%u2J@<9GcV^w;u2@pB>=V~VzemE)W*^f(yg$OhJ)wQU>Ib3=Ll(*(+N-3cRPB1$ zb$^Gikh#!)r9eeZ^-3SD_^7B~Ej}~X?0TcS)2>qdr#)A+DEHJaQ|@W457i7X4g9;Z zEMTvtQ$Qwgm55z2bMt`mFfm z|93mhCa3xTvo@`}^-xmE_;-5k{K*F2ztntY^%n2c$&3Az8~N;0wYGEE+_=Y^%I;U4 z=Dlq;Gw0r>t0}j?$%a{fe_wXDxGet0KX&$FzP~n?>U{qE=$d?O`MJ5CcE4Z$S<-!L zdS9I9o?q{O&6#bs{oTEl`~SdG$K$ z{loQKf2_VP|2qHi|NjiU4E!e7OX4JeS%R~`BeIx*f$sBq2fXe}+6@Llf9 zHRVsLLRVNF6FVdQ&MBb@0Es+=3IG5A diff --git a/resources/images/phoneon.png b/resources/images/phoneon.png deleted file mode 100644 index 34f2aa449ae56cca0c345169c798a27a7fa77cdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmV;U0bKrxP)!$1&4w?WXkK~TCt(7Hfy5EN=lKyL}?Es+CQzyYk}2H^reg2M^y&ZW6Q zcw(fU*<#HTw{sZX=?0<#0VEqmXcTB_Xj~`St^L&#gWgF zro@y$_k)Zn?M_*MFaqmtcE4JE#Xu%LckF+OPGi!ssgK%$9}h(5Rk12&OJ3<@a-NRXX~K-mJNEuHB$bH9g+ zmupMs|Nrv+p6;Ca_1xb*bI!RZ6#)PM03wlyh=B07!uJkJ9FY&M%( ztrpHq*@v)R03#|~(PITVg}@7{HGcEYt@uiv|OudtfY z(b10|KYG1hxYNOd2ZjCne7^VZ-_Oj$MfjXqmX3E$jBHO8G-!y`S~kXuDpKznqipb(;Hq!^7|`&+|T? zkK;I03SO`G&Ye3HMG=3JNu$v;H8oLUu^0~nghHW^%jLKwCME{0Ns^XARW%nUN>bh?s~5`pgi`Sa(& z!9m=To0}WblyUU*^fWg&!!gvkM z%7T0tzrw=8v9Ym8{Dp;uvuDrZ{tX60V`C!#AXH6%e}7(H9)6Au8#aVo4mcbR$E8b` zLXQ68#S56T;ovx~rltmV1QhJ*>S}m7{H4a{^Ho+>;u$KF$pl;j0BUP%V`F1+*Oir( zPNx(6DW4E@baZUnwhiYO7Z(o>4nqE4YOGdkN=gbI!y7klpgSQPBO@aR4jjPw`}XY{ z8XAhkUtV6mdGjV7MWfO9;ll?+SXIL?%+;$`aq6Bud&bAdBb^ce@Z`x8Sh`S(TCHwq zXow^Q0MOpvzH#G5NFXBIb}pC8X0!SIe&SDE zl$Di*K=+UEi<5*q&`t@sWZVo+~OeTxP64K>xEG;cfPfw#q zg+h^^pRZIZBk?^R4=#lui0tg_#Kc70vZ`iwb{20(7K`PtsVodmrxV_b5C(%GIXPLN zCov3Tx7*R9N~Oxk$O!59t7<$RkI&~rkFl|_Xzp1PEXy(sgB~Rki9quu2qF*&uq=xn zNsJ^72wO| z@|>KUiHQlCrWuCO>2x8Vi9l02&+{zHx?C=bq9}@D7$znrMyXT^+)W(EEiNtwgF%^0 z#xRUnEY@nZ@LG<M2-s{kk|gzdy?_+Rr)gTDP;_;5IUJ7o_;{I227AXU3Dx@Kb7xCSi$Ldq{ptSw`+B{ers>qw)S8+azuzyw=Xt)du`xY8U9DE@_4@1A zug}lVhj0kwx~i%QKT2_NvB32N0C@WJDL#NEB_+Lm`&NMe{rmSVTecv+OeVW~_paCL z#W^eAVrXdS%a<>>noplTb#`|0Jilhx7Z(>>T3X;74)Oc!bncDvW)a~#*+-aare zfGjM_TCG-miXu>j!~6_4R@Lx4UsqRGR8*9clXLs_ZTL@uFus2MdhFP-%*@OS7cTtx@#BB;CnqPbUAvZ@ roqgoUku_(Jm0r9iz`y*T=D*_~XEHwtQ>00n00000NkvXXu0mjf7diIM literal 2335 zcmY*bdo{m<0bqRxL_Prg&j3p>kI zV;q4&SuiH)(jv*w9d2QBhH&qeq3|6aoVq z6@~in;e*k&ji1k*40QD5Ay3S&W~SI23h3ef{`F=!On@S)MaC-7o0hHa{$8cs;Rz92`t9L@@Jz%fJvVMN!=?+!|Nx|gg zQf&$kFo?>Z?_%KuoeX~?#hKyiNdLD(2T9V01WmUf^c>q?icnEfc(^vaz*55!iw&&E z?ju!c)Y(5PXl=E*ADq)^laY}@`Tf$;WLrmI#c7Yls?dRGr=M4zgpJf>xMoT$4Gj(+ zHZl2g@l?)=3+p@Q@b(zoAHjCd>G{}Mg8tEO(s5!UBt@k5g!|$(1jnyaQJ#zT^hgUIVOfZb$eazf62_GHjmN>~8>z5BWWEpxFZ*0VV zo14=t;o9L#(r;6#{DvF5AEu@@WE0@DJF9a;ZRe<+ot;Ey=TnAWwHjF*YduaHdm{hG z*Dk8(*sWW)`i6#7KJN&Y5+&8maBss#;F$p-adEjG1`64ZS~`ahk1uh1duMtIZDrlr z@%4GbVJ0ywuhHu1=|H3+)U1)mXS7I3Bt(zTsr*haZ4Wj(=7d*zAL7GH#nj7-y02Rl0qfgn?EjzG{N^=P;z z{7z9(5tB=JM!38omxQhL15)juozcli?eJe*kE8!UW<#NDN3TlgtFF2_^v|`mA6EA9 z@o4QhY}5F-20DJTJ=9Q74{L94PplgWv$eI|qbj+l#N60eHY6k@UEB4LOe3HC8RW;z z1eDP8moK5$AoXmJ*&ZIRCDgly9P&@!imscxdrx0q^Dj6!0;xGUClTD_n<^$@XJTVb z%hCNj9*xUS`H--)ZLaUi)M%C}F3-^Yli=;`P2BFvvj`b@J!~P zJs6upS`f-O@S~WDVM5Ey%;CAQdW#E}-honS&y5c%$};eTS9|;oIk>X2B0V{EQy5fM zX<3% z(5RK36cG^-?aT+8my1&pXR%n7ft||g3B1xj`bI|7GAz(&eA|7s$xbNC%SlSzOrUQP z*r>5A3zZa&$yIzm%MR+diG`TfO$f&wPONHr}jjTzhn z2W5Eb8R162x!@`{3|9%jzTQNuiV2UCP0v?+YA}K--WKBgg>!Vol1Qcbv$Jcz5J=>% zyskaBtb{TH4#?l7WoF8wW~q}y7f{DlB@bz9vnQ7t7S>KNh*tD7j`Jve=>tcOh=Z&p zw)kS)-Bk$A&U6ApI7tF;QRV_EAAo>tCt-Iz!E56#q?QvHscC7HwS_T1(C~j3Sg7r#~w7^2s18!P6hJ$^2f;s$Goj#%>4hm14Z67j`O zdH5^y!_v(OYx8QI*~V0b5T_@m)&^O+Iu=@4^YinqpaaFsIXyLN9C{lrEhZe#*{`J3 zSP|4^l@p1H+uDF>rHeB*BZe}^NpqZg(UJTfVP(vrJ(@6J`D;wT9c zYCGioFuYry2Hp;<^TmWDjolQ(6>fCd!YxaGeKQ7&&nqcxq9MaDx zcay5lhx&zug%L}5q^fofXL8O#=(<<=12-4YkKkISEUyPYf08j%T3Q~g*bF2RdA#^6 z=%Jue<(d&+|b#)8-`&}?`cU!DZUYY;Gk{_*&iCp$Hb(L3ER(@Vvn=7yH zhSkRB=F{o)NApX|Qx1c*F~%?j1@0*8DxXc2LS(gq+1buc{NnJtvx}jc(q|p*blr@k w{}SB^-xgX7->0&}`R^+5pS562N0283%y|~6JvYq+7Zw1pv&LgzS@}@@1s>*HxBvhE diff --git a/resources/images/rcvrnone.png b/resources/images/rcvrnone.png new file mode 100755 index 0000000000000000000000000000000000000000..d77a4749773a7771fd580559db6d07de2a8a1773 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61SFYwH*Nw_%*9TgAsieWw;%dH0CJP6LLy3n z63Z0|it^Jkb5a#bDhpB-90LLj85k<&gr3;Q+hD-MaPVGmMN7Gij1iv`qpMTHrg}$4 z-tc*E-sUV`U)7)e+Fdv_H1zzW>~)!pX>n|M5}X?Gx_^9Jc=@&E*cA9Zwuzjq3iwbA vv`xg*#W93qX7Zo^|LvKD5|SKPmwaM;^^KYR*}mjwKzRmFS3j3^P64nJ=qZCRW5rVY zvW;e)T!swNo-U3d6}OW9{QqyyER>Msz`EoUBT)VS|I7@pzA>}U;MvFr4nJ@ErkR#;MwT z(i_b>x$2p@JY5_^DsH`*W$$5?C~;27m~DaNSa(!zyH z_r|oexrsJ8oN(+|{P^19lP~%OL_~Duwrp43@oV;!bJyqZE8lOWUnRHW;k@tr_I&?X zd+&MWJ?HT4x8FVzzbXI6NI8K?4GC=%-Vs*6`ry-|-o19wcJt+bu2JAvaW(5jiPf}c z+S5-vZ|#dsjJ>{b_wMcji=OS<%`gAjyVthmaN?c&_y4b%aII99ot=H!R%>hPWns4j zt0ShRdau6Iyl?N`r*(CwUU{oc_N=gx3!b%mx3!Ip&4Re~i!WwK99y@3y&wn6zm=gP ztZ&PtyB5_uOiMi+vH9kaTeog~XAS`)-##2V)by~fs_NFX zO5OI7)mM{h(wu4v>xSzB9MyH(y|qKARqJpKi9{n)Q&O|Adf?xd)XQo`;Tw(Lh=Rx8IhJun3mhHE5v$(&k3DG+E z`s=?r#}-HEC`~>Y@s4%V%{8{wJ0f(F^77v8Z~XrKyKXjj>!BMbei%LI?d84Pd;Iff zFk%on(Wxb(_PH3p_{^qrcx?M^|JLeoMud6$^RFsAB_3PJc_ix^u z`B}REppepOqkH%7@7%I6qQ}z0;$Ov%J$ugl(9_e~vE{JW^`}pl+8$UN#;vcff5!A2 zQzOG=_v^1q-`QEs^pUCo2Hv+h?ZTZbDxOJta^6dW+J3t&KKM16mphwb*}22@!YdDZ zdwcizhlc9Cef3J~@#+w*b8LNXi+lRbAMFE!@ u|K2GrApUn{YXj#D6r_g2ubA|$oS~PW^Xc=txCg*I!{F)a=d#Wzp$Pyf4xNbr diff --git a/resources/images/stoplight.png b/resources/images/stoplight.png old mode 100644 new mode 100755 index 496c2fd34108f36ed9676c4bc6b412ffc5cf85c5..ebc288935faa841a7eed7e63820efab8d6a260f6 GIT binary patch literal 1564 zcmV+%2IKjOP)btPNY*(sswg z75d0$$LNra=?RMDS-Yy72GMW5W3JeIL z-EIdJ6&3$)z5<@-8HQm102D>tzJ0r>s0b%T(=^Mn0D#}We@7w_mSqhF1H&-UXcPxf z6eUU0-Me=~p^#RqWw0EwEVs0@l$V!d`rX~#rKP2pFJFHA_)!$a?Ck7{iVBy@Rb5@3 znVE@W!r^dFPfsWmf)Il0>T3Me=kpB9rlzLN%}pHk>(?){*$e=% zTCIC5)6>%kp?Exg>((trxl|SL!0B{Kl0>kO3;KM%zP>&@MhGe2@tC5hiHV7kkr86n z9t&P=e0=o zgr^@qdeQ*q%1TugO(s))ef^s^Z(^~S zx{ok|!JxrlNLLF0fZ1%8Bq<(`t9u&PxU{r%b#--jcQ+l&;^N|o6DM>!U25S;md3_L zzu({A->*vX;ll@?&v)a-4VtF+wGUD0L?Y4D)C2%{{P^+q_O_yHB9VCg`nADesI06M zMUhaK>^hpJA3b`MOeU{izy9pmv-9WATPzk)6lZ5=U%h&D;lhO{Po8ibmzq9MbpXe4 zLqkKCFJFH9_U+{4Bu&%FWRmCk-rnA8*RJ6n!B7NNaR5R{tJS*QZoAz+F)^{ezRq#n z#fukDpFRx$kY)Mc8Ah^TqP4ZPJ9q9(PEIBgiOkH*Xf)d0-Cb5z*4f#adbp(B5ddIe zVd3i4tC2|L=FOW|u3X_bE)t1MO-=Rm^f;YPK@eOn7deNhktm8KB_)N0h0Dv!_{35W z3}X zbzuJui(#=?91h3W*jPLsKg>sdzaRHfI#?{0t*xzSG@4o|a!19*#jC5UsW&u%rKP3( z{QRSRw7$Ns+~-(VC1!4JZfa`EK_HZ(Nklq~?%fLpgG$WS))wh$2qD8T@pv4oz_P5{?QU*v7DW-i z>&#{|!!R^W;}{4bMNxZhR7864;DOa@P1TH|sEmvZ>}fn%Q5r%R4u>U40szRe49d#N z(iQbDVKf?g($vLg>qvFR@rG-OJ~2&@^3ITKWeI(=h(SBaJ)& O0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ?%t=H+RCwC#T3<+$Z502#f83n^+H8M>X`mvZ5oH!ewTUJX9+G-d~9E~eP(=n``)1k zcJb~#&%^V3&U1dxIp;mh=g*&M&6+h>DZ_U#)4L4ZsqgG!|W z&+`ZdgK=G!W#RYxaq;3s_({U0^?H$$lY=c=w!maEp}M*nSy@?e{Xigqwzf9-e7=`TCJ7;lRzCHxoAE=Vz8>(bw09`}gmsC*YXn z9zA;WTPMP5wI)3YX#@DfhY!C6_|vCP5Cj1n$0eOlvVda%em4`7$zR)TvYHOSt$XK{-iC=D@q(aN37P@oiPT1{sxLhv0fBznCw;TES`6w?h$F^;CX

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 diff --git a/resources/images/up.png b/resources/images/up.png old mode 100644 new mode 100755 index 98f6717fc57625b67cb4ef1c7b3ff2ba8c866e2c..36baf668c4ab7bfee4036e8ccaf15182a3e7c642 GIT binary patch literal 362 zcmV-w0hRuVP)K)IklyFbsv^ry(#DLo$>w2!uc}gg^)cL)Z?JB6V`z zD9UdB&+Vt`B`V&_sVXz~-q&Bj;&ZiD004-nwRTK5GZDcx5jmibF_;-%%xq@+x~dY9 zOV5?!W4P7l(2oVj;OOqqaU$Zb^s5I$$1(F5Bhnv-jw2#f_4W0k<7%xJePigjc?{Sd zI_~?=xV@33ltrkN;tFQ=I{wu&BKo5aAobK!Pd)Y2Q%@ZLKF6MIugCYkXaE2J07*qo IM6N<$f=pGCr~m)} literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9F5M?jcysy3fAP*5S+ zBgmJ5p-Pp3p`n?9;pcxK{gQ#9)PRBERRU1!3~)xplF( z*+8J>p{i((rnkG^QP~|VUWT#`?0N@P-`J`?Qry+7Vo~r%*_UztlZmM(=kDGeqhY=? zf`OThN5bHNcJuMVDf`~1&U^m8V{c-Rm!6WI(z;c4Jk8tvgbUVQb>`rIvq`b#Kdau- z9W!l@-pfvl%eJ+*c>ZS9FYU6*Bg-?b^ec8=*S%YP{Zi5TY-y((Z#%qS?_IZcW~JuS z9S?M?W1~aA&iVZD!1{Nkxxrq?8S0bPuPxVgzwvrn?EdP~w`ICVCE}fqO8mD8egC9n zy=v&wN)8EwgaZwXVAmlrp8Fopk3tcznb#=86HXfU(x=c#1hD5@O1TaS?83{ F1OT{)lJEck diff --git a/resources/images/up45.png b/resources/images/up45.png old mode 100644 new mode 100755 index 455b4537d725c601fc8ad0831a640b9c67e6d616..b0721687b2da890999f8a1c03031208f86bb0d5c GIT binary patch literal 520 zcmV+j0{8uiP)<0+3~y5JE~RrSz)spEi{w##NdR^khpPc(tQtlFXqtwIJ_AN}UFRH3&$DeC;D0s+cWG0WrS}X+ zlK9=S9%?)ZKuYPMvXC}U)flpETj$7JmgQcJByEu+JPgB)%0fDD-}hH4BYA|4F>h6N za)-6n=juO^ui}YG8&^$0x@sEokD82psVT`HH8DvcG6@mAb?B8zG%aMEjov-h2apl7_k>sl6Ql0000< KMNUMnLSTXc0nkwZ literal 550 zcmV+>0@?kEP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-tVu*cRCwC#+TpFjAP@)ezb_8J2y9?CkP#SxZqO0Bfg|7sj$oZYH_#E<3GRK; z81*Huw7^mC54rx~{|NbOHcuHXA6V zptXk9dYNEj3~sj@>bib=rj$ZeRgd2Rz;?R@08~{4rPO>cLW!eoTLLh8XsyW@L)Kb4 z9*@EECkGP|Ip>1V_t7*>S>UN?V@&Y8*{Zbn9?rS%+LrExDWu{TQ?%~ky`PlFMdk2R zEP&ujo%}Do-|s)}#f!}0IkA_^g*SNal^uqGZ_%0~XJ3c4mS+yf%Gti}`K@q_m3{85 zS#3)(u~YV9lz{c#f9$=l*K2-o4D4SAj*#X9rC>jy4~IiOa0=`zx^3G$;FQ>BbjXJQ zl!$$vJ1ICPHu>?eL~Jm)RBRBqWb9~g>DW==C1C#zKA+Evz-C$DoY>?!oEw|8N^`&_ z+lRSelXO~~u+e*IZrG@&C63r==V7kcC|^8wyB%?k714b6rMs?sTuR{@vx4Pfnt%l? oU;ztQz@uUfU?nRo;N`^c02Y2t@=Y7lK>z>%07*qoM6N<$g5~%0^#A|> diff --git a/resources/images/upup.png b/resources/images/upup.png old mode 100644 new mode 100755 index c82440d703e23457a434c115b4ad841777eafe1c..b7eef9d9cadd6b3d15b19f070ecfd8f36f1e873b GIT binary patch literal 849 zcmV-X1FrmuP)aB^>EX>4U6ba`-PAVE-2F#rH~oK?uN4S+BV0KwiXLhc{)!+*XZ7|^Jxv=h3^N?_@0N~ z3+Lr)AxQ{wb8~}2p@5;GAsB`sI@T~37Z+%6Z%1EWA3Pq9$Ve3wh4pcuzPS{#6;raTtrm*wNAP-Z4Er zP17_*#@$7V#Ud9M7ypu|WpZ+omzS46mauJ`(P)&0VSMWF`FuP+KIY5IOY~iiUN4W1j%eF<<07VMx=PeCF)_h(I^D2Du~=jz z5}~f^t{u9rGm%KtllfXCl}gd?_X|nX(%ak1!^1;iiL0wC;YEGS?(QxtmCE-b)oPXT zc${9Zx8VW+?C$R7-rk<8L?)Br`1p8J9RL`M#rW{>@U_U((-RL44%pMv({up~p+sauiO7Z$kqspx8%jhrl!$C7 b5!rYJgoC`BPJ=$+00000NkvXXu0mjfD|3Ng literal 809 zcmV+^1J?YBP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;uSrBfRCwC#*}qFNaU2Kmch~76C=rPS4Y>qn)ZmyyL=iLuQQ*)RIP?dE&?qfI zLl7-(O0yE~F49ur5C=(=Lu5rniiPEQ@0Q00pQpz>e?3EfKJXdu-k;aqm;0VxA4$~I z2LKCxZj}}ESg8QmOW>Zn!vYqtfE(BI^E1-vG+tj{yE^>U)fH}UZ&9gK%pb%K*VEGz zgTWvHaBXdkFE20bM(ytI(qgf2Zf=g3mzQP_`{*e6;o*Vn>+Afr)e!)fmzO(=HVlK| zaF}+x{ddO9%nUV6`@i73yF0F~uKt0o_Vn~LudlD$&d_z8p-_l6o9#=+$jAtj$s{Y4 zO83E;Ooo2H|DV`u`+Pp0ot?Fu@%Z@2m6a7Lic&Yj<#I8RNKn`H?twK;YlyA()YKGD zPEJ}{J%K=gs;V~3P*s)jc)T9EJ#Z?OqSxy+g{`*J>EzMTk?D+^n;X*?w6+fp4p=Ic zIs-13%Z$Zhbh%tj4+4OLgM&OgJZzYAdV0#q$;p;705BX5vsf&)2Y!ElXEYk+(9lrJ zg8-n_YUSSE-nXmA)jr6r7wjX~2iyuH1l zzrPkYdt17=xS-GHGj)~SZa0sQ zkDJcO<#L>zoi%+oW3gD>ZApGD30S}a7O;Q?EMNf(Sik}nuz&?DU;ztQzycPqfCVgI n0k>SHKc@YVD$A1o>Ge4P(p7_8J(24a00000NkvXXu0mjfMO%HG diff --git a/src/cgm.c b/src/cgm.c old mode 100644 new mode 100755 index c7128f8..c704e0d --- a/src/cgm.c +++ b/src/cgm.c @@ -2,6 +2,15 @@ #include "stddef.h" #include "string.h" +// Global constants +#define NO_NOISE 0 +#define CLEAN_NOISE 1 +#define LIGHT_NOISE 2 +#define MEDIUM_NOISE 3 +#define HEAVY_NOISE 4 +#define WARMUP_NOISE 5 +#define OTHER_NOISE 6 + // global window variables // ANYTHING THAT IS CALLED BY PEBBLE API HAS TO BE NOT STATIC @@ -11,39 +20,41 @@ TextLayer *tophalf_layer = NULL; TextLayer *bg_layer = NULL; TextLayer *cgmtime_layer = NULL; TextLayer *message_layer = NULL; // BG DELTA & MESSAGE LAYER -TextLayer *battlevel_layer = NULL; +TextLayer *rig_battlevel_layer = NULL; +TextLayer *watch_battlevel_layer = NULL; TextLayer *t1dname_layer = NULL; TextLayer *time_watch_layer = NULL; -TextLayer *time_app_layer = NULL; TextLayer *date_app_layer = NULL; -TextLayer *awesomebg_layer = NULL; +TextLayer *happymsg_layer = NULL; +TextLayer *raw_calc_layer = NULL; +TextLayer *raw_unfilt_layer = NULL; +TextLayer *noise_layer = NULL; +TextLayer *calcraw_last1_layer = NULL; +TextLayer *calcraw_last2_layer = NULL; +TextLayer *calcraw_last3_layer = NULL; BitmapLayer *icon_layer = NULL; BitmapLayer *cgmicon_layer = NULL; -BitmapLayer *appicon_layer = NULL; -BitmapLayer *batticon_layer = NULL; BitmapLayer *perfectbg_layer = NULL; GBitmap *icon_bitmap = NULL; -GBitmap *appicon_bitmap = NULL; GBitmap *cgmicon_bitmap = NULL; GBitmap *specialvalue_bitmap = NULL; -GBitmap *batticon_bitmap = NULL; GBitmap *perfectbg_bitmap = NULL; -InverterLayer *inv_battlevel_layer = NULL; +InverterLayer *inv_rig_battlevel_layer = NULL; PropertyAnimation *perfectbg_animation = NULL; -PropertyAnimation *awesomebg_animation = NULL; +PropertyAnimation *happymsg_animation = NULL; static char time_watch_text[] = "00:00"; static char date_app_text[] = "Wed 13 "; // variables for AppSync AppSync sync_cgm; -// CGM message is 84 bytes -// Pebble needs additional 62 Bytes?!? Pad with additional 20 bytes -static uint8_t sync_buffer_cgm[166]; +// CGM message is 110 bytes +// Pebble needs additional 62 Bytes?!? Pad with additional 60 bytes +static uint8_t sync_buffer_cgm[212]; // variables for timers and time AppTimer *timer_cgm = NULL; @@ -64,16 +75,25 @@ uint32_t current_cgm_time = 0; char formatted_cgm_timeago[10] = {0}; char cgm_label_buffer[6] = {0}; uint32_t current_app_time = 0; -char formatted_app_timeago[10] = {0}; -char app_label_buffer[6] = {0}; char current_bg_delta[10] = {0}; char delta_label_buffer[14] = {0}; char formatted_bg_delta[14] = {0}; +char last_calc_raw[6] = {0}; +char last_raw_unfilt[6] = {0}; +uint8_t current_noise_value = 0; +char formatted_noise[8] = {0}; +char last_calc_raw1[6] = {0}; +char last_calc_raw2[6] = {0}; +char last_calc_raw3[6] = {0}; +char formatted_battlevel[10] = {0}; int current_bg = 0; +int current_calc_raw = 0; +int current_calc_raw1 = 0; bool currentBG_isMMOL = false; int converted_bgDelta = 0; char current_values[25] = {0}; +bool HaveCalcRaw = false; // global BG snooze timer static uint8_t lastAlertTime = 0; @@ -107,7 +127,7 @@ static bool PhoneOffAlert = false; static bool LowBatteryAlert = false; static bool DataOfflineAlert = false; -// global constants for time durations +// global constants for time durations; seconds static const uint8_t MINUTEAGO = 60; static const uint16_t HOURAGO = 60*(60); static const uint32_t DAYAGO = 24*(60*60); @@ -120,6 +140,9 @@ static const uint8_t TIME_TEXTBUFF_SIZE = 6; static const uint8_t DATE_TEXTBUFF_SIZE = 8; static const uint8_t LABEL_BUFFER_SIZE = 6; static const uint8_t TIMEAGO_BUFFER_SIZE = 10; +static const uint8_t HAPPYMSG_BUFFER_SIZE = 30; +static const uint8_t BG_BUFFER_SIZE = 6; +static const uint8_t BATTLEVEL_FORMAT_SIZE = 12; // ** START OF CONSTANTS THAT CAN BE CHANGED; DO NOT CHANGE IF YOU DO NOT KNOW WHAT YOU ARE DOING ** // ** FOR MMOL, ALL VALUES ARE STORED AS INTEGER; LAST DIGIT IS USED AS DECIMAL ** @@ -135,9 +158,9 @@ static const uint8_t TIMEAGO_BUFFER_SIZE = 10; // BG Ranges, MG/DL static const uint16_t SPECVALUE_BG_MGDL = 20; static const uint16_t SHOWLOW_BG_MGDL = 40; -static const uint16_t HYPOLOW_BG_MGDL = 55; -static const uint16_t BIGLOW_BG_MGDL = 60; -static const uint16_t MIDLOW_BG_MGDL = 70; +uint16_t HYPOLOW_BG_MGDL = 55; +uint16_t BIGLOW_BG_MGDL = 60; +uint16_t MIDLOW_BG_MGDL = 70; uint16_t LOW_BG_MGDL = 80; uint16_t HIGH_BG_MGDL = 180; @@ -152,9 +175,9 @@ static const uint16_t SHOWHIGH_BG_MGDL = 400; // GOOD : 5.0, 12.2 // BAD : 7 , 14.44 static const uint16_t SPECVALUE_BG_MMOL = 11; static const uint16_t SHOWLOW_BG_MMOL = 23; -static const uint16_t HYPOLOW_BG_MMOL = 30; -static const uint16_t BIGLOW_BG_MMOL = 33; -static const uint16_t MIDLOW_BG_MMOL = 39; +uint16_t HYPOLOW_BG_MMOL = 30; +uint16_t BIGLOW_BG_MMOL = 33; +uint16_t MIDLOW_BG_MMOL = 39; uint16_t LOW_BG_MMOL = 44; uint16_t HIGH_BG_MMOL = 100; @@ -208,7 +231,13 @@ static const bool TurnOff_CHECKPHONE_Msg = false; // Use for Sleep Face or anyone else for a custom load bool HardCodeNoVibrations = false; -// ** END OF CONSTANTS THAT CAN BE CHANGED; DO NOT CHANGE IF YOU DO NOT KNOW WHAT YOU ARE DOING ** +// Control Animations +// SPECIAL BOOL TO HARD CODE ANIMATIONS OFF; If you want no animations, SET TO true +// SPECIAL BOOL TO HARD CODE ANIMATIONS ALL ON; If you want all animations, SET TO true +// This is for people who want old ones too +// Use for a custom load +bool HardCodeNoAnimations = false; +bool HardCodeAllAnimations = false; // Control Vibrations for Config File // IF YOU WANT NO VIBRATIONS, SET TO true @@ -216,6 +245,14 @@ bool TurnOffAllVibrations = false; // IF YOU WANT LESS INTENSE VIBRATIONS, SET TO true bool TurnOffStrongVibrations = false; +// Control Raw data +// If you want to turn off vibrations for calculated raw, set to true +bool TurnOffVibrationsCalcRaw = false; +// If you want to see unfiltered raw, set to true +bool TurnOnUnfilteredRaw = false; + +// ** END OF CONSTANTS THAT CAN BE CHANGED; DO NOT CHANGE IF YOU DO NOT KNOW WHAT YOU ARE DOING ** + // Bluetooth Timer Wait Time, in Seconds // RANGE 0-240 // THIS IS ONLY FOR BAD BLUETOOTH CONNECTIONS @@ -227,15 +264,18 @@ static const uint8_t BT_ALERT_WAIT_SECS = 45; static const uint8_t WATCH_MSGSEND_SECS = 60; static const uint8_t LOADING_MSGSEND_SECS = 6; static const uint8_t PERFECTBG_ANIMATE_SECS = 10; -static const uint8_t AWESOMEBG_ANIMATE_SECS = 10; +static const uint8_t HAPPYMSG_ANIMATE_SECS = 10; // App Sync / Message retries, for timeout / busy problems // Change to see if there is a temp or long term problem -static const uint8_t APPSYNCANDMSG_RETRIES_MAX = 26; +// This is approximately number of seconds, so if set to 50, timeout is at 50 seconds +// However, this can vary widely - can be up to 6 seconds .... for 50, timeout can be up to 3 minutes +static const uint8_t APPSYNCANDMSG_RETRIES_MAX = 50; // HTML Request retries, for timeout / busy problems // Change to see if there is a temp or long term problem -static const uint8_t DATAOFFLINE_RETRIES_MAX = 4; +// This is number of minutes, so if set to 11 timeout is at 11 minutes +static const uint8_t DATAOFFLINE_RETRIES_MAX = 14; enum CgmKey { CGM_ICON_KEY = 0x0, // TUPLE_CSTRING, MAX 2 BYTES (10) @@ -245,22 +285,24 @@ enum CgmKey { CGM_DLTA_KEY = 0x4, // TUPLE_CSTRING, MAX 5 BYTES (BG DELTA, -100 or -10.0) CGM_UBAT_KEY = 0x5, // TUPLE_CSTRING, MAX 3 BYTES (UPLOADER BATTERY, 100) CGM_NAME_KEY = 0x6, // TUPLE_CSTRING, MAX 9 BYTES (Christine) - CGM_VALS_KEY = 0x7 // TUPLE_CSTRING, MAX 25 BYTES (0,000,000,000,000,0,0,0,0) + CGM_VALS_KEY = 0x7, // TUPLE_CSTRING, MAX 25 BYTES (0,000,000,000,000,0,0,0,0) + CGM_CLRW_KEY = 0x8, // TUPLE_CSTRING, MAX 4 BYTES (253 OR 22.2) + CGM_RWUF_KEY = 0x9, // TUPLE_CSTRING, MAX 4 BYTES (253 OR 22.2) + CGM_NOIZ_KEY = 0xA // TUPLE_INT, 4 BYTES (1-4) }; -// TOTAL MESSAGE DATA 4x3+2+5+3+9+25 = 56 BYTES -// TOTAL KEY HEADER DATA (STRINGS) 4x7+2 = 28 BYTES -// TOTAL MESSAGE 84 BYTES +// TOTAL MESSAGE DATA 4x6+2+5+3+9+25 = 68 BYTES +// TOTAL KEY HEADER DATA (STRINGS) 4x10+2 = 42 BYTES +// TOTAL MESSAGE 110 BYTES // ARRAY OF SPECIAL VALUE ICONS static const uint8_t SPECIAL_VALUE_ICONS[] = { - RESOURCE_ID_IMAGE_NONE, //0 + RESOURCE_ID_IMAGE_SPECVALUE_NONE, //0 RESOURCE_ID_IMAGE_BROKEN_ANTENNA, //1 RESOURCE_ID_IMAGE_BLOOD_DROP, //2 RESOURCE_ID_IMAGE_STOP_LIGHT, //3 RESOURCE_ID_IMAGE_HOURGLASS, //4 RESOURCE_ID_IMAGE_QUESTION_MARKS, //5 - RESOURCE_ID_IMAGE_LOGO, //6 - RESOURCE_ID_IMAGE_ERR //7 + RESOURCE_ID_IMAGE_LOGO //6 }; // INDEX FOR ARRAY OF SPECIAL VALUE ICONS @@ -271,35 +313,28 @@ static const uint8_t STOP_LIGHT_ICON_INDX = 3; static const uint8_t HOURGLASS_ICON_INDX = 4; static const uint8_t QUESTION_MARKS_ICON_INDX = 5; static const uint8_t LOGO_SPECVALUE_ICON_INDX = 6; -static const uint8_t ERR_SPECVALUE_ICON_INDX = 7; // ARRAY OF TIMEAGO ICONS static const uint8_t TIMEAGO_ICONS[] = { - RESOURCE_ID_IMAGE_NONE, //0 - RESOURCE_ID_IMAGE_PHONEON, //1 - RESOURCE_ID_IMAGE_PHONEOFF, //2 - RESOURCE_ID_IMAGE_RCVRON, //3 - RESOURCE_ID_IMAGE_RCVROFF //4 + RESOURCE_ID_IMAGE_RCVRNONE, //0 + RESOURCE_ID_IMAGE_RCVRON, //1 + RESOURCE_ID_IMAGE_RCVROFF //2 }; // INDEX FOR ARRAY OF TIMEAGO ICONS -static const uint8_t NONE_TIMEAGO_ICON_INDX = 0; -static const uint8_t PHONEON_ICON_INDX = 1; -static const uint8_t PHONEOFF_ICON_INDX = 2; -static const uint8_t RCVRON_ICON_INDX = 3; -static const uint8_t RCVROFF_ICON_INDX = 4; +static const uint8_t RCVRNONE_ICON_INDX = 0; +static const uint8_t RCVRON_ICON_INDX = 1; +static const uint8_t RCVROFF_ICON_INDX = 2; // ARRAY OF ICONS FOR PERFECT BG static const uint8_t PERFECTBG_ICONS[] = { - RESOURCE_ID_IMAGE_NONE, //0 - RESOURCE_ID_IMAGE_CLUB100, //1 - RESOURCE_ID_IMAGE_CLUB55 //2 + RESOURCE_ID_IMAGE_CLUB100, //0 + RESOURCE_ID_IMAGE_CLUB55 //1 }; // INDEX FOR ARRAY OF PERFECT BG ICONS -static const uint8_t NONE_PERFECTBG_ICON_INDX = 0; -static const uint8_t CLUB100_ICON_INDX = 1; -static const uint8_t CLUB55_ICON_INDX = 2; +static const uint8_t CLUB100_ICON_INDX = 0; +static const uint8_t CLUB55_ICON_INDX = 1; static char *translate_app_error(AppMessageResult result) { switch (result) { @@ -441,8 +476,9 @@ static void load_values(){ int num_a_items = 0; char *o; - int mgormm; - int vibes; + int mgormm = 0; + int vibes = 0; + int rawvibrate = 0; if (current_values == NULL) { return; } else { @@ -457,8 +493,26 @@ static void load_values(){ //APP_LOG(APP_LOG_LEVEL_DEBUG, "lowbg: %s", o); if (mgormm == 0){ LOW_BG_MGDL = myAtoi(o); + if (LOW_BG_MGDL < 60) { + MIDLOW_BG_MGDL = 55; + BIGLOW_BG_MGDL = 50; + HYPOLOW_BG_MGDL = 45; + } else if (LOW_BG_MGDL < 70) { + MIDLOW_BG_MGDL = 60; + BIGLOW_BG_MGDL = 55; + HYPOLOW_BG_MGDL = 50; + } } else { LOW_BG_MMOL = myAtoi(o); + if (LOW_BG_MMOL < 33) { + MIDLOW_BG_MMOL = 31; + BIGLOW_BG_MMOL = 28; + HYPOLOW_BG_MMOL = 25; + } else if (LOW_BG_MMOL < 39) { + MIDLOW_BG_MMOL = 33; + BIGLOW_BG_MMOL = 31; + HYPOLOW_BG_MMOL = 28; + } } break; case 3: @@ -511,6 +565,12 @@ static void load_values(){ //APP_LOG(APP_LOG_LEVEL_DEBUG, "timeformat: %s", o); timeformat = myAtoi(o); break; + case 10: + //APP_LOG(APP_LOG_LEVEL_DEBUG, "rawvibrate: %s", o); + rawvibrate = myAtoi(o); + if (rawvibrate == 0) { TurnOffVibrationsCalcRaw = true; } + else { TurnOffVibrationsCalcRaw = false; } + break; } o = strtok(NULL,","); } @@ -725,12 +785,10 @@ void handle_bluetooth_cgm(bool bt_connected) { // erase cgm and app ago times text_layer_set_text(cgmtime_layer, ""); - text_layer_set_text(time_app_layer, ""); // erase cgm icon - create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[NONE_TIMEAGO_ICON_INDX]); - // turn phone icon off - create_update_bitmap(&appicon_bitmap,appicon_layer,TIMEAGO_ICONS[PHONEOFF_ICON_INDX]); + create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[RCVRNONE_ICON_INDX]); + } else { @@ -761,6 +819,19 @@ void BT_timer_callback(void *data) { } // end BT_timer_callback +void handle_watch_battery_cgm(BatteryChargeState watch_charge_state) { + + static char watch_battery_text[] = "Wch 100%"; + + if (watch_charge_state.is_charging) { + snprintf(watch_battery_text, BATTLEVEL_FORMAT_SIZE, "CHARGING"); + } else { + snprintf(watch_battery_text, BATTLEVEL_FORMAT_SIZE, "Wch %d%%", watch_charge_state.charge_percent); + } + text_layer_set_text(watch_battlevel_layer, watch_battery_text); + +} // end handle_watch_battery_cgm + static void draw_date_from_app() { // VARIABLES @@ -797,12 +868,13 @@ void sync_error_callback_cgm(DictionaryResult appsync_dict_error, AppMessageResu DictionaryIterator *iter = NULL; AppMessageResult appsync_err_openerr = APP_MSG_OK; AppMessageResult appsync_err_senderr = APP_MSG_OK; + + bool bluetooth_connected_syncerror = true; // CODE START - bluetooth_connected_cgm = bluetooth_connection_service_peek(); - - if (!bluetooth_connected_cgm) { + bluetooth_connected_syncerror = bluetooth_connection_service_peek(); + if (!bluetooth_connected_syncerror) { // bluetooth is out, BT message already set; return out return; } @@ -824,7 +896,7 @@ void sync_error_callback_cgm(DictionaryResult appsync_dict_error, AppMessageResu if (appsync_err_openerr == APP_MSG_OK) { // could open app message outbox; send message appsync_err_senderr = app_message_outbox_send(); - if (appsync_err_senderr == APP_MSG_OK ) { + if (appsync_err_senderr == APP_MSG_OK) { // everything OK, reset AppSyncErrAlert so no vibrate AppSyncErrAlert = false; // sent message OK; return @@ -832,17 +904,9 @@ void sync_error_callback_cgm(DictionaryResult appsync_dict_error, AppMessageResu } // if appsync_err_senderr } // if appsync_err_openerr } // if appsyncandmsg_retries_counter - - // check bluetooth again - bluetooth_connected_cgm = bluetooth_connection_service_peek(); - if (!bluetooth_connected_cgm) { - // bluetooth is out, BT message already set; return out - return; - } - // flag error - if (appsyncandmsg_retries_counter >= APPSYNCANDMSG_RETRIES_MAX) { + if (appsyncandmsg_retries_counter > APPSYNCANDMSG_RETRIES_MAX) { APP_LOG(APP_LOG_LEVEL_INFO, "APP SYNC TOO MANY MESSAGES ERROR"); APP_LOG(APP_LOG_LEVEL_DEBUG, "APP SYNC MSG ERR CODE: %i RES: %s", appsync_error, translate_app_error(appsync_error)); APP_LOG(APP_LOG_LEVEL_DEBUG, "APP SYNC DICT ERR CODE: %i RES: %s", appsync_dict_error, translate_dict_error(appsync_dict_error)); @@ -853,23 +917,28 @@ void sync_error_callback_cgm(DictionaryResult appsync_dict_error, AppMessageResu APP_LOG(APP_LOG_LEVEL_DEBUG, "APP SYNC RESEND MSG OPEN ERR CODE: %i RES: %s", appsync_err_openerr, translate_app_error(appsync_err_openerr)); APP_LOG(APP_LOG_LEVEL_DEBUG, "APP SYNC RESEND MSG SEND ERR CODE: %i RES: %s", appsync_err_senderr, translate_app_error(appsync_err_senderr)); APP_LOG(APP_LOG_LEVEL_DEBUG, "AppSyncErrAlert: %i appsyncandmsg_retries_counter: %i", AppSyncErrAlert, appsyncandmsg_retries_counter); + return; } + + // check bluetooth again + bluetooth_connected_syncerror = bluetooth_connection_service_peek(); + if (!bluetooth_connected_syncerror) { + // bluetooth is out, BT message already set; return out + return; + } + + // set message to RESTART WATCH -> PHONE + text_layer_set_text(message_layer, "√APP/RESTRT"); // reset appsync retries counter appsyncandmsg_retries_counter = 0; - // set message to RESTART WATCH -> PHONE - text_layer_set_text(message_layer, "RSTRT WCH/PH"); - // erase cgm and app ago times text_layer_set_text(cgmtime_layer, ""); - text_layer_set_text(time_app_layer, ""); // erase cgm icon - create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[NONE_TIMEAGO_ICON_INDX]); + create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[RCVRNONE_ICON_INDX]); - // turn phone icon off - create_update_bitmap(&appicon_bitmap,appicon_layer,TIMEAGO_ICONS[PHONEOFF_ICON_INDX]); // check if need to vibrate if (!AppSyncErrAlert) { @@ -877,7 +946,7 @@ void sync_error_callback_cgm(DictionaryResult appsync_dict_error, AppMessageResu alert_handler_cgm(APPSYNC_ERR_VIBE); AppSyncErrAlert = true; } - + } // end sync_error_callback_cgm void inbox_dropped_handler_cgm(AppMessageResult appmsg_indrop_error, void *context) { @@ -888,11 +957,13 @@ void inbox_dropped_handler_cgm(AppMessageResult appmsg_indrop_error, void *conte AppMessageResult appmsg_indrop_openerr = APP_MSG_OK; AppMessageResult appmsg_indrop_senderr = APP_MSG_OK; + bool bluetooth_connected_inboxdrop = true; + // CODE START - bluetooth_connected_cgm = bluetooth_connection_service_peek(); + bluetooth_connected_inboxdrop = bluetooth_connection_service_peek(); - if (!bluetooth_connected_cgm) { + if (!bluetooth_connected_inboxdrop) { // bluetooth is out, BT message already set; return out return; } @@ -923,15 +994,15 @@ void inbox_dropped_handler_cgm(AppMessageResult appmsg_indrop_error, void *conte } // if appsyncandmsg_retries_counter // check bluetooth again - bluetooth_connected_cgm = bluetooth_connection_service_peek(); + bluetooth_connected_inboxdrop = bluetooth_connection_service_peek(); - if (!bluetooth_connected_cgm) { + if (!bluetooth_connected_inboxdrop) { // bluetooth is out, BT message already set; return out return; } // flag error - if (appsyncandmsg_retries_counter >= APPSYNCANDMSG_RETRIES_MAX) { + if (appsyncandmsg_retries_counter > APPSYNCANDMSG_RETRIES_MAX) { APP_LOG(APP_LOG_LEVEL_INFO, "APPMSG IN DROP TOO MANY MESSAGES ERROR"); APP_LOG(APP_LOG_LEVEL_DEBUG, "APPMSG IN DROP ERR CODE ERR CODE: %i RES: %s", appmsg_indrop_error, translate_app_error(appmsg_indrop_error)); APP_LOG(APP_LOG_LEVEL_DEBUG, "appsyncandmsg_retries_counter: %i", appsyncandmsg_retries_counter); @@ -941,23 +1012,20 @@ void inbox_dropped_handler_cgm(AppMessageResult appmsg_indrop_error, void *conte APP_LOG(APP_LOG_LEVEL_DEBUG, "APPMSG IN DROP RESEND MSG OPEN ERR CODE: %i RES: %s", appmsg_indrop_openerr, translate_app_error(appmsg_indrop_openerr)); APP_LOG(APP_LOG_LEVEL_DEBUG, "APPMSG IN DROP RESEND MSG SEND ERR CODE: %i RES: %s", appmsg_indrop_senderr, translate_app_error(appmsg_indrop_senderr)); APP_LOG(APP_LOG_LEVEL_DEBUG, "AppMsgInDropAlert: %i appsyncandmsg_retries_counter: %i", AppMsgInDropAlert, appsyncandmsg_retries_counter); + return; } + + // set message to RESTART WATCH -> PHONE + text_layer_set_text(message_layer, "√APP/RESTRT"); // reset appsync retries counter appsyncandmsg_retries_counter = 0; - - // set message to RESTART WATCH -> PHONE - text_layer_set_text(message_layer, "RSTRT WCH/PH"); - + // erase cgm and app ago times text_layer_set_text(cgmtime_layer, ""); - text_layer_set_text(time_app_layer, ""); // erase cgm icon - create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[NONE_TIMEAGO_ICON_INDX]); - - // turn phone icon off - create_update_bitmap(&appicon_bitmap,appicon_layer,TIMEAGO_ICONS[PHONEOFF_ICON_INDX]); + create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[RCVRNONE_ICON_INDX]); // check if need to vibrate if (!AppMsgInDropAlert) { @@ -976,11 +1044,13 @@ void outbox_failed_handler_cgm(DictionaryIterator *failed, AppMessageResult appm AppMessageResult appmsg_outfail_openerr = APP_MSG_OK; AppMessageResult appmsg_outfail_senderr = APP_MSG_OK; + bool bluetooth_connected_outboxfail = true; + // CODE START - bluetooth_connected_cgm = bluetooth_connection_service_peek(); + bluetooth_connected_outboxfail = bluetooth_connection_service_peek(); - if (!bluetooth_connected_cgm) { + if (!bluetooth_connected_outboxfail) { // bluetooth is out, BT message already set; return out return; } @@ -1011,15 +1081,15 @@ void outbox_failed_handler_cgm(DictionaryIterator *failed, AppMessageResult appm } // if appsyncandmsg_retries_counter // check bluetooth again - bluetooth_connected_cgm = bluetooth_connection_service_peek(); + bluetooth_connected_outboxfail = bluetooth_connection_service_peek(); - if (!bluetooth_connected_cgm) { + if (!bluetooth_connected_outboxfail) { // bluetooth is out, BT message already set; return out return; } // flag error - if (appsyncandmsg_retries_counter >= APPSYNCANDMSG_RETRIES_MAX) { + if (appsyncandmsg_retries_counter > APPSYNCANDMSG_RETRIES_MAX) { APP_LOG(APP_LOG_LEVEL_INFO, "APPMSG OUT FAIL ERROR"); APP_LOG(APP_LOG_LEVEL_DEBUG, "APPMSG OUT FAIL ERR CODE: %i RES: %s", appmsg_outfail_error, translate_app_error(appmsg_outfail_error)); APP_LOG(APP_LOG_LEVEL_DEBUG, "appsyncandmsg_retries_counter: %i", appsyncandmsg_retries_counter); @@ -1029,31 +1099,28 @@ void outbox_failed_handler_cgm(DictionaryIterator *failed, AppMessageResult appm APP_LOG(APP_LOG_LEVEL_DEBUG, "APPMSG OUT FAIL RESEND MSG OPEN ERR CODE: %i RES: %s", appmsg_outfail_openerr, translate_app_error(appmsg_outfail_openerr)); APP_LOG(APP_LOG_LEVEL_DEBUG, "APPMSG OUT FAIL RESEND MSG SEND ERR CODE: %i RES: %s", appmsg_outfail_senderr, translate_app_error(appmsg_outfail_senderr)); APP_LOG(APP_LOG_LEVEL_DEBUG, "AppMsgOutFailAlert: %i appsyncandmsg_retries_counter: %i", AppMsgOutFailAlert, appsyncandmsg_retries_counter); + return; } + + // set message to RESTART WATCH -> PHONE + text_layer_set_text(message_layer, "√APP/RESTRT"); // reset appsync retries counter appsyncandmsg_retries_counter = 0; - - // set message to RESTART WATCH -> PHONE - text_layer_set_text(message_layer, "RSTRT WCH/PH"); // erase cgm and app ago times text_layer_set_text(cgmtime_layer, ""); - text_layer_set_text(time_app_layer, ""); // erase cgm icon - create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[NONE_TIMEAGO_ICON_INDX]); - - // turn phone icon off - create_update_bitmap(&appicon_bitmap,appicon_layer,TIMEAGO_ICONS[PHONEOFF_ICON_INDX]); - + create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[RCVRNONE_ICON_INDX]); + // check if need to vibrate if (!AppMsgOutFailAlert) { //APP_LOG(APP_LOG_LEVEL_INFO, "APPMSG OUT FAIL ERROR: VIBRATE"); alert_handler_cgm(APPMSG_OUTFAIL_VIBE); AppMsgOutFailAlert = true; } - + } // end outbox_failed_handler_cgm static void load_icon() { @@ -1075,16 +1142,15 @@ static void load_icon() { // ARRAY OF ARROW ICON IMAGES const uint8_t ARROW_ICONS[] = { - 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_LOGO, //8 - RESOURCE_ID_IMAGE_ERR //9 + RESOURCE_ID_IMAGE_SPECVALUE_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_LOGO //8 }; // INDEX FOR ARRAY OF ARROW ICON IMAGES @@ -1097,7 +1163,6 @@ static void load_icon() { const uint8_t DOWN_ICON_INDX = 6; const uint8_t DOWNDOWN_ICON_INDX = 7; const uint8_t LOGO_ARROW_ICON_INDX = 8; - const uint8_t ERR_ARROW_ICON_INDX = 9; // Got an icon value, check data offline condition, clear vibrate flag if needed if ( (strcmp(current_bg_delta, "OFF") < 0) || (strcmp(current_bg_delta, "OFF") > 0) ) { @@ -1159,8 +1224,8 @@ static void load_icon() { create_update_bitmap(&icon_bitmap,icon_layer,ARROW_ICONS[LOGO_ARROW_ICON_INDX]); } else { - // unexpected, set error icon - create_update_bitmap(&icon_bitmap,icon_layer,ARROW_ICONS[ERR_ARROW_ICON_INDX]); + // unexpected, set logo icon + create_update_bitmap(&icon_bitmap,icon_layer,ARROW_ICONS[LOGO_ARROW_ICON_INDX]); } DoubleDownAlert = false; } @@ -1175,6 +1240,7 @@ static void load_icon() { static void load_bg_delta(); static void load_cgmtime(); static void load_apptime(); +static void load_rig_battlevel(); // ANIMATION CODE @@ -1185,8 +1251,7 @@ void perfectbg_animation_started(Animation *animation, void *data) { // clear out BG and icon text_layer_set_text(bg_layer, " "); - //create_update_bitmap(&icon_bitmap,icon_layer,PERFECTBG_ICONS[NONE_PERFECTBG_ICON_INDX]); - text_layer_set_text(message_layer, "DONT WRY BE:)"); + text_layer_set_text(message_layer, "WHOO HOO!\0"); } // end perfectbg_animation_started @@ -1223,7 +1288,7 @@ void animate_perfectbg() { GRect from_perfectbg_rect = GRect(0,0,0,0); GRect to_perfectbg_rect = GRect(0,0,0,0); - Layer *animate_perfectbg_layer = NULL; + Layer *animate_perfectbg_layer = NULL; // CODE START @@ -1237,8 +1302,8 @@ void animate_perfectbg() { create_update_bitmap(&perfectbg_bitmap,perfectbg_layer,PERFECTBG_ICONS[CLUB100_ICON_INDX]); } animate_perfectbg_layer = bitmap_layer_get_layer(perfectbg_layer); - from_perfectbg_rect = GRect(0, -7, 95, 47); - to_perfectbg_rect = GRect(144, -7, 95, 47); + from_perfectbg_rect = GRect(0, 3, 95, 47); + to_perfectbg_rect = GRect(144, 3, 95, 47); destroy_perfectbg_animation(&perfectbg_animation); //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE BG, CREATE FRAME"); perfectbg_animation = property_animation_create_layer_frame(animate_perfectbg_layer, &from_perfectbg_rect, &to_perfectbg_rect); @@ -1257,81 +1322,85 @@ void animate_perfectbg() { } //end animate_perfectbg -// AWESOMEBG ANIMATION -void awesomebg_animation_started(Animation *animation, void *data) { +// happymsg ANIMATION +void happymsg_animation_started(Animation *animation, void *data) { - //APP_LOG(APP_LOG_LEVEL_INFO, "AWESOME BG ANIMATE, ANIMATION STARTED ROUTINE, CLEAR OUT BG DELTA"); + //APP_LOG(APP_LOG_LEVEL_INFO, "HAPPY MSG ANIMATE, ANIMATION STARTED ROUTINE, CLEAR OUT BG DELTA"); // clear out BG delta / message layer text_layer_set_text(message_layer, ""); text_layer_set_text(cgmtime_layer, ""); - text_layer_set_text(time_app_layer, ""); - create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[NONE_TIMEAGO_ICON_INDX]); - create_update_bitmap(&appicon_bitmap,appicon_layer,TIMEAGO_ICONS[NONE_TIMEAGO_ICON_INDX]); + text_layer_set_text(rig_battlevel_layer, ""); + create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[RCVRNONE_ICON_INDX]); -} // end awesomebg_animation_started +} // end happymsg_animation_started -void awesomebg_animation_stopped(Animation *animation, bool finished, void *data) { +void happymsg_animation_stopped(Animation *animation, bool finished, void *data) { - //APP_LOG(APP_LOG_LEVEL_INFO, "AWESOME BG ANIMATE, ANIMATION STOPPED ROUTINE"); + //APP_LOG(APP_LOG_LEVEL_INFO, "HAPPY MSG ANIMATE, ANIMATION STOPPED ROUTINE"); // set BG delta / message layer - //APP_LOG(APP_LOG_LEVEL_DEBUG, "AWESOME BG ANIMATE, ANIMATION STOPPED, SET TO BG DELTA); + //APP_LOG(APP_LOG_LEVEL_DEBUG, "HAPPY MSG ANIMATE, ANIMATION STOPPED, SET TO BG DELTA); load_bg_delta(); load_cgmtime(); load_apptime(); + load_rig_battlevel(); -} // end awesomebg_animation_stopped +} // end happymsg_animation_stopped -void destroy_awesomebg_animation(PropertyAnimation **awesomebg_animation) { - if (*awesomebg_animation == NULL) { +void destroy_happymsg_animation(PropertyAnimation **happymsg_animation) { + if (*happymsg_animation == NULL) { return; } - if (animation_is_scheduled((Animation*) *awesomebg_animation)) { - animation_unschedule((Animation*) *awesomebg_animation); + if (animation_is_scheduled((Animation*) *happymsg_animation)) { + animation_unschedule((Animation*) *happymsg_animation); } - property_animation_destroy(*awesomebg_animation); - *awesomebg_animation = NULL; -} // end destroy_awesomebg_animation + property_animation_destroy(*happymsg_animation); + *happymsg_animation = NULL; +} // end destroy_happymsg_animation -void animate_awesomebg() { +void animate_happymsg(char *happymsg_to_display) { // VARIABLES // for animation - GRect from_awesomebg_rect = GRect(0,0,0,0); - GRect to_awesomebg_rect = GRect(0,0,0,0); + GRect from_happymsg_rect = GRect(0,0,0,0); + GRect to_happymsg_rect = GRect(0,0,0,0); - Layer *animate_awesomebg_layer = NULL; + Layer *animate_happymsg_layer = NULL; + static char animate_happymsg_buffer[30] = {0}; // CODE START - //APP_LOG(APP_LOG_LEVEL_INFO, "ANIMATE AWESOMEBG"); + //APP_LOG(APP_LOG_LEVEL_INFO, "ANIMATE HAPPY MSG"); // slide BG out to right - //APP_LOG(APP_LOG_LEVEL_INFO, "AWESOME BG, ANIMATE BG, SLIDE BG"); - text_layer_set_text(awesomebg_layer, "EVERYTHING IS AWESOME"); - animate_awesomebg_layer = text_layer_get_layer(awesomebg_layer); - from_awesomebg_rect = GRect(-10, 33, 144, 55); - to_awesomebg_rect = GRect(144, 33, 144, 55); - destroy_awesomebg_animation(&awesomebg_animation); - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE BG, CREATE FRAME"); - awesomebg_animation = property_animation_create_layer_frame(animate_awesomebg_layer, &from_awesomebg_rect, &to_awesomebg_rect); - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE BG, SET DURATION AND CURVE"); - animation_set_duration((Animation*) awesomebg_animation, AWESOMEBG_ANIMATE_SECS*MS_IN_A_SECOND); - animation_set_curve((Animation*) awesomebg_animation, AnimationCurveLinear); - - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE BG, SET HANDLERS"); - animation_set_handlers((Animation*) awesomebg_animation, (AnimationHandlers) { - .started = (AnimationStartedHandler) awesomebg_animation_started, - .stopped = (AnimationStoppedHandler) awesomebg_animation_stopped, + //APP_LOG(APP_LOG_LEVEL_INFO, "ANIMATE HAPPY MSG, SLIDE BG"); + //APP_LOG(APP_LOG_LEVEL_DEBUG, "ANIMATE HAPPY MSG, STRING PASSED: %s", happymsg_to_display); + strncpy(animate_happymsg_buffer, happymsg_to_display, HAPPYMSG_BUFFER_SIZE); + text_layer_set_text(happymsg_layer, animate_happymsg_buffer); + //APP_LOG(APP_LOG_LEVEL_DEBUG, "ANIMATE HAPPY MSG, MSG IN BUFFER: %s", animate_happymsg_buffer); + animate_happymsg_layer = text_layer_get_layer(happymsg_layer); + from_happymsg_rect = GRect(-10, 33, 144, 55); + to_happymsg_rect = GRect(144, 33, 144, 55); + destroy_happymsg_animation(&happymsg_animation); + //APP_LOG(APP_LOG_LEVEL_INFO, "ANIMATE HAPPY MSG, CREATE FRAME"); + happymsg_animation = property_animation_create_layer_frame(animate_happymsg_layer, &from_happymsg_rect, &to_happymsg_rect); + //APP_LOG(APP_LOG_LEVEL_INFO, "ANIMATE HAPPY MSG, SET DURATION AND CURVE"); + animation_set_duration((Animation*) happymsg_animation, HAPPYMSG_ANIMATE_SECS*MS_IN_A_SECOND); + animation_set_curve((Animation*) happymsg_animation, AnimationCurveLinear); + + //APP_LOG(APP_LOG_LEVEL_INFO, "ANIMATE HAPPY MSG, SET HANDLERS"); + animation_set_handlers((Animation*) happymsg_animation, (AnimationHandlers) { + .started = (AnimationStartedHandler) happymsg_animation_started, + .stopped = (AnimationStoppedHandler) happymsg_animation_stopped, }, NULL /* callback data */); - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE BG, SCHEDULE"); - animation_schedule((Animation*) awesomebg_animation); + //APP_LOG(APP_LOG_LEVEL_INFO, "ANIMATE HAPPY MSG, SCHEDULE"); + animation_schedule((Animation*) happymsg_animation); -} //end animate_awesomebg +} //end animate_happymsg static void load_bg() { //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, FUNCTION START"); @@ -1439,6 +1508,16 @@ static void load_bg() { // pointers to be used to MGDL or MMOL values for parsing uint16_t *bg_ptr = NULL; uint8_t *specvalue_ptr = NULL; + + // happy message; max message 24 characters + // DO NOT GO OVER 24 CHARACTERS, INCLUDING SPACES OR YOU WILL CRASH + // YOU HAVE BEEN WARNED + char happymsg_buffer111[26] = "EVERYTHING IS AWESOME\0"; + char happymsg_buffer123[26] = "ABC EASY AS... D*CAN*BE\0"; + char happymsg_buffer130[26] = "DON'T WORRY BE:)HAPPY\0"; + char happymsg_buffer65[26] = "STAYIN ALIVE AH,HA,HA,HA\0"; + char happymsg_buffer200[26] = "SHAKE*IT*OFF SHAKE IT!\0"; + char happymsg_buffer300[26] = "PREPARE 4 GLORY! SPARTA!\0"; // CODE START @@ -1449,19 +1528,19 @@ static void load_bg() { // set special value alert to false no matter what specvalue_alert = false; - - // initialize inverter layers to hide - //layer_set_hidden((Layer *)inv_bg_layer, true); - //layer_set_hidden((Layer *)inv_icon_layer, true); // see if we're doing MGDL or MMOL; get currentBG_isMMOL value in myBGAtoi - // convert BG value from string to int + // convert BG value from string to int + + // FOR TESTING ONLY + //strncpy(last_bg, "5", BG_BUFFER_SIZE); + //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD BG, BGATOI IN, CURRENT_BG: %d LAST_BG: %s ", current_bg, last_bg); current_bg = myBGAtoi(last_bg); //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD BG, BG ATOI OUT, CURRENT_BG: %d LAST_BG: %s ", current_bg, last_bg); //APP_LOG(APP_LOG_LEVEL_DEBUG, "LAST BG: %s", last_bg); - //APP_LOG(APP_LOG_LEVEL_DEBUG, "CURRENT BG: %i", current_bg); + //APP_LOG(APP_LOG_LEVEL_DEBUG, "CURRENT BG: %i", current_bg); if (!currentBG_isMMOL) { bg_ptr = BG_MGDL; @@ -1538,9 +1617,9 @@ static void load_bg() { specvalue_alert = true; } else if (current_bg < bg_ptr[SPECVALUE_BG_INDX]) { - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, UNEXPECTED SPECIAL VALUE: SET ERR ICON"); + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, UNEXPECTED SPECIAL VALUE: SET LOGO ICON"); text_layer_set_text(bg_layer, ""); - create_update_bitmap(&specialvalue_bitmap,icon_layer,SPECIAL_VALUE_ICONS[ERR_SPECVALUE_ICON_INDX]); + create_update_bitmap(&specialvalue_bitmap,icon_layer,SPECIAL_VALUE_ICONS[LOGO_SPECVALUE_ICON_INDX]); specvalue_alert = true; } // end special value checks @@ -1562,20 +1641,104 @@ static void load_bg() { //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD BG, SET TO BG: %s ", last_bg); text_layer_set_text(bg_layer, last_bg); - if ( ((!currentBG_isMMOL) && (current_bg == 100)) || ((currentBG_isMMOL) && (current_bg == 55)) ) { - // PERFECT BG CLUB, ANIMATE BG - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE PERFECT BG"); - animate_perfectbg(); - } // perfect bg club, animate BG + if (!HardCodeNoAnimations) { + if ( ((!currentBG_isMMOL) && (current_bg == 100)) || ((currentBG_isMMOL) && (current_bg == 55)) ) { + // PERFECT BG CLUB, ANIMATE BG + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE PERFECT BG"); + animate_perfectbg(); + } // perfect bg club, animate BG + + // EVERY TIME YOU DO A NEW MESSAGE, YOU HAVE TO ALLOCATE A NEW HAPPY MSG BUFFER AT THE TOP OF LOAD BG FUNCTION + + if ((!currentBG_isMMOL) && (current_bg == 123)) { + // ANIMATE HAPPY MSG LAYER + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE HAPPY MSG LAYER"); + animate_happymsg(happymsg_buffer123); + } // animate happy msg layer @ 123 - if ( ((!currentBG_isMMOL) && (current_bg == 130)) || ((currentBG_isMMOL) && (current_bg == 75)) ) { - // AWESOME BG CLUB, ANIMATE MESSAGE LAYER - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE MESSAGE LAYER"); - animate_awesomebg(); - } // awesome bg club, animate message layer + if ((currentBG_isMMOL) && (current_bg == 65)) { + // ANIMATE HAPPY MSG LAYER + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE HAPPY MSG LAYER"); + animate_happymsg(happymsg_buffer65); + } // animate happy msg layer @ 65 + + if ( ((!currentBG_isMMOL) && (current_bg == 200)) || ((currentBG_isMMOL) && (current_bg == 110)) ) { + // ANIMATE HAPPY MSG LAYER + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE HAPPY MSG LAYER"); + animate_happymsg(happymsg_buffer200); + } // animate happy msg layer @ 300 + + if ((!currentBG_isMMOL) && (current_bg == 300)) { + // ANIMATE HAPPY MSG LAYER + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE HAPPY MSG LAYER"); + animate_happymsg(happymsg_buffer300); + } // animate happy msg layer @ 300 + + if (HardCodeAllAnimations) { + // extra animations for those that want them, these are the old ones + if ( ((!currentBG_isMMOL) && (current_bg == 111)) || ((currentBG_isMMOL) && (current_bg == 60)) ) { + // ANIMATE HAPPY MSG LAYER + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE HAPPY MSG LAYER"); + animate_happymsg(happymsg_buffer111); + } // animate happy msg layer @ 111 + + if ( ((!currentBG_isMMOL) && (current_bg == 130)) || ((currentBG_isMMOL) && (current_bg == 70)) ) { + // ANIMATE HAPPY MSG LAYER + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, ANIMATE HAPPY MSG LAYER"); + animate_happymsg(happymsg_buffer130); + } // animate happy msg layer @ 130 + } // HardCodeAllAnimations + + } // HardCodeNoAnimations; end all animation code + + } } // end bg checks (if special_value_bitmap) + + // see if we're going to use the current bg or the calculated raw bg for vibrations + if ( ((current_bg > 0) && (current_bg < bg_ptr[SPECVALUE_BG_INDX])) && (HaveCalcRaw) ) { + + current_calc_raw = myBGAtoi(last_calc_raw); + + //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD BG, TurnOffVibrationsCalcRaw: %d", TurnOffVibrationsCalcRaw); + + if (!TurnOffVibrationsCalcRaw) { + // set current_bg to calculated raw so we can vibrate on that instead + current_bg = current_calc_raw; + if (!currentBG_isMMOL) { + bg_ptr = BG_MGDL; + specvalue_ptr = SPECVALUE_MGDL; + } + else { + bg_ptr = BG_MMOL; + specvalue_ptr = SPECVALUE_MMOL; + } + } // TurnOffVibrationsCalcRaw + + // use calculated raw values in BG field; if different cascade down so we have last three values + if (current_calc_raw != current_calc_raw1) { + strncpy(last_calc_raw3, last_calc_raw2, BG_BUFFER_SIZE); + strncpy(last_calc_raw2, last_calc_raw1, BG_BUFFER_SIZE); + strncpy(last_calc_raw1, last_calc_raw, BG_BUFFER_SIZE); + current_calc_raw1 = current_calc_raw; + } + } + + else { + // if not in special values or don't have calculated raw, blank out the fields + strncpy(last_calc_raw1, " ", BG_BUFFER_SIZE); + strncpy(last_calc_raw2, " ", BG_BUFFER_SIZE); + strncpy(last_calc_raw3, " ", BG_BUFFER_SIZE); + } + + // set bg field accordingly for calculated raw layer + text_layer_set_text(calcraw_last1_layer, last_calc_raw1); + text_layer_set_text(calcraw_last2_layer, last_calc_raw2); + text_layer_set_text(calcraw_last3_layer, last_calc_raw3); + + //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD BG, START VIBRATE, CURRENT_BG: %d LAST_BG: %s ", current_bg, last_bg); + //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD BG, START VIBRATE, CURRENT_CALC_RAW: %d LAST_CALC_RAW: %s ", current_calc_raw, last_calc_raw); + //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD BG, START VIBRATE, CALC_RAW 2: %d FORMAT CALC RAW 2: %s ", current_calc_raw2, formatted_calc_raw2); + //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD BG, START VIBRATE, CALC_RAW 3: %d FORMAT CALC RAW 2: %s ", current_calc_raw3, formatted_calc_raw3); - } } // end bg checks (if special_value_bitmap) - // check BG and vibrate if needed //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, CHECK TO SEE IF WE NEED TO VIBRATE"); // check for SPECIAL VALUE @@ -1585,19 +1748,19 @@ static void load_bg() { //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, SPECIAL VALUE BG ALERT"); //APP_LOG(APP_LOG_LEVEL_DEBUG, "lastAlertTime SPEC VALUE SNOOZE VALUE IN: %i", lastAlertTime); - //APP_LOG(APP_LOG_LEVEL_DEBUG, "specvalue_overwrite IN: %i", specvalue_overwrite); + //APP_LOG(APP_LOG_LEVEL_DEBUG, "specvalue_overwrite IN: %i", specvalue_overwrite); - // send alert and handle a bouncing connection + // send alert and handle a bouncing connection if ((lastAlertTime == 0) || (!specvalue_overwrite)) { - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, SPECIAL VALUE: VIBRATE"); + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BG, SPECIAL VALUE: VIBRATE"); alert_handler_cgm(SPECVALUE_VIBE); // don't know where we are coming from, so reset last alert time no matter what - // set to 1 to prevent bouncing connection + // set to 1 to prevent bouncing connection lastAlertTime = 1; if (!specvalue_overwrite) { specvalue_overwrite = true; } } - // if hit snooze, reset snooze counter; will alert next time around + // if hit snooze, reset snooze counter; will alert next time around if (lastAlertTime > SPECVALUE_SNZ_MIN) { lastAlertTime = 0; specvalue_overwrite = false; @@ -1864,7 +2027,7 @@ static void load_cgmtime() { // Init code or error code; set text layer & icon to empty value // APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD CGMTIME, CGM TIME AGO INIT OR ERROR CODE: %s", cgm_label_buffer); text_layer_set_text(cgmtime_layer, ""); - create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[NONE_TIMEAGO_ICON_INDX]); + create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[RCVRNONE_ICON_INDX]); } else { // set rcvr on icon @@ -1905,7 +2068,7 @@ static void load_cgmtime() { } else { strncpy (formatted_cgm_timeago, "ERR", TIMEAGO_BUFFER_SIZE); - create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[NONE_TIMEAGO_ICON_INDX]); + create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[RCVRNONE_ICON_INDX]); } text_layer_set_text(cgmtime_layer, formatted_cgm_timeago); @@ -1942,21 +2105,7 @@ static void load_apptime(){ // CODE START - draw_date_from_app(); - - // initialize label buffer and icon - strncpy(app_label_buffer, "", LABEL_BUFFER_SIZE); - - //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD APPTIME, NEW APP TIME: %lu", current_app_time); - - // check for init or error code - if (current_app_time == 0) { - text_layer_set_text(time_app_layer, ""); - create_update_bitmap(&appicon_bitmap,appicon_layer,TIMEAGO_ICONS[NONE_TIMEAGO_ICON_INDX]); - } - else { - // set phone on icon - create_update_bitmap(&appicon_bitmap,appicon_layer,TIMEAGO_ICONS[PHONEON_ICON_INDX]); + draw_date_from_app(); app_time_now = time(NULL); @@ -1966,59 +2115,26 @@ static void load_apptime(){ //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD APPTIME, CURRENT APP TIMEAGO: %lu", current_app_timeago); - if (current_app_timeago < (MINUTEAGO)) { - app_timeago_diff = 0; - strncpy (formatted_app_timeago, "OK", TIMEAGO_BUFFER_SIZE); - } - else if (current_app_timeago < HOURAGO) { - app_timeago_diff = (current_app_timeago / MINUTEAGO); - snprintf(formatted_app_timeago, TIMEAGO_BUFFER_SIZE, "%i", app_timeago_diff); - strncpy(app_label_buffer, "m", LABEL_BUFFER_SIZE); - strcat(formatted_app_timeago, app_label_buffer); - } - else if (current_app_timeago < DAYAGO) { - app_timeago_diff = (current_app_timeago / HOURAGO); - snprintf(formatted_app_timeago, TIMEAGO_BUFFER_SIZE, "%i", app_timeago_diff); - strncpy(app_label_buffer, "h", LABEL_BUFFER_SIZE); - strcat(formatted_app_timeago, app_label_buffer); - } - else if (current_app_timeago < WEEKAGO) { - app_timeago_diff = (current_app_timeago / DAYAGO); - snprintf(formatted_app_timeago, TIMEAGO_BUFFER_SIZE, "%i", app_timeago_diff); - strncpy(app_label_buffer, "d", LABEL_BUFFER_SIZE); - strcat(formatted_app_timeago, app_label_buffer); - } - else { - strncpy (formatted_app_timeago, "ERR", TIMEAGO_BUFFER_SIZE); - create_update_bitmap(&appicon_bitmap,appicon_layer,TIMEAGO_ICONS[NONE_TIMEAGO_ICON_INDX]); - } - - //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD APPTIME, FORMATTED APP TIMEAGO STRING: %s", formatted_app_timeago); - text_layer_set_text(time_app_layer, formatted_app_timeago); - - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD APPTIME, CHECK FOR PHONE OFF ICON"); - // check to see if we need to set phone off icon - if ( (app_timeago_diff >= PHONEOUT_WAIT_MIN) || ( (strcmp(app_label_buffer, "") != 0) && (strcmp(app_label_buffer, "m") != 0) ) ) { - // set phone off icon - create_update_bitmap(&appicon_bitmap,appicon_layer,TIMEAGO_ICONS[PHONEOFF_ICON_INDX]); + app_timeago_diff = (current_app_timeago / MINUTEAGO); + if ( (current_app_timeago < HOURAGO) && (app_timeago_diff >= PHONEOUT_WAIT_MIN) ) { // erase cgm ago times and cgm icon text_layer_set_text(cgmtime_layer, ""); - create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[NONE_TIMEAGO_ICON_INDX]); + create_update_bitmap(&cgmicon_bitmap,cgmicon_layer,TIMEAGO_ICONS[RCVRNONE_ICON_INDX]); - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD APPTIME, CHECK IF HAVE TO VIBRATE"); - // Vibrate if we need to - if (!PhoneOffAlert) { - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD APPTIME, READ APP TIMEAGO: VIBRATE"); - alert_handler_cgm(PHONEOUT_VIBE); - PhoneOffAlert = true; - } + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD APPTIME, CHECK IF HAVE TO VIBRATE"); + // Vibrate if we need to + if (!PhoneOffAlert) { + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD APPTIME, READ APP TIMEAGO: VIBRATE"); + alert_handler_cgm(PHONEOUT_VIBE); + PhoneOffAlert = true; + } } else { // reset PhoneOffAlert - PhoneOffAlert = false; - } - } // else init code + PhoneOffAlert = false; + } + //} // else init code //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD APPTIME, FUNCTION OUT"); } // end load_apptime @@ -2049,7 +2165,7 @@ static void load_bg_delta() { // check for CHECK CGM condition, if true set message if ((CGMOffAlert) && (!TurnOff_CHECKCGM_Msg)) { - text_layer_set_text(message_layer, "CHECK CGM"); + text_layer_set_text(message_layer, "CHECK RIG"); return; } @@ -2074,7 +2190,7 @@ static void load_bg_delta() { // check for DATA OFFLINE condition, if true set message to fix condition if (strcmp(current_bg_delta, "OFF") == 0) { if (dataoffline_retries_counter >= DATAOFFLINE_RETRIES_MAX) { - strncpy(formatted_bg_delta, "DATA OFFLINE", MSGLAYER_BUFFER_SIZE); + strncpy(formatted_bg_delta, "ATTN: NO DATA", MSGLAYER_BUFFER_SIZE); text_layer_set_text(message_layer, formatted_bg_delta); text_layer_set_text(bg_layer, " "); if (!DataOfflineAlert) { @@ -2093,7 +2209,7 @@ static void load_bg_delta() { // check if LOADING.., if true set message // put " " (space) in bg field so logo continues to show if (strcmp(current_bg_delta, "LOAD") == 0) { - strncpy(formatted_bg_delta, "LOADING 6.4", MSGLAYER_BUFFER_SIZE); + strncpy(formatted_bg_delta, "LOADING 7.0", MSGLAYER_BUFFER_SIZE); text_layer_set_text(message_layer, formatted_bg_delta); text_layer_set_text(bg_layer, " "); create_update_bitmap(&icon_bitmap,icon_layer,SPECIAL_VALUE_ICONS[LOGO_SPECVALUE_ICON_INDX]); @@ -2164,57 +2280,27 @@ static void load_bg_delta() { } // end load_bg_delta -static void load_battlevel() { +static void load_rig_battlevel() { //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, FUNCTION START"); // CONSTANTS - const uint8_t BATTLEVEL_FORMATTED_SIZE = 6; - - // ARRAY OF BATTERY LEVEL ICONS - 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 - }; - - // INDEX FOR ARRAY OF BATTERY LEVEL ICONS - const uint8_t BATTEMPTY_ICON_INDX = 0; - const uint8_t BATT10_ICON_INDX = 1; - const uint8_t BATT20_ICON_INDX = 2; - const uint8_t BATT30_ICON_INDX = 3; - const uint8_t BATT40_ICON_INDX = 4; - const uint8_t BATT50_ICON_INDX = 5; - const uint8_t BATT60_ICON_INDX = 6; - const uint8_t BATT70_ICON_INDX = 7; - const uint8_t BATT80_ICON_INDX = 8; - const uint8_t BATT90_ICON_INDX = 9; - const uint8_t BATTFULL_ICON_INDX = 10; - const uint8_t BATTNONE_ICON_INDX = 11; + const uint8_t BATTLEVEL_LABEL_SIZE = 5; + const uint8_t BATTLEVEL_PERCENT_SIZE = 6; // VARIABLES int current_battlevel = 0; - + // CODE START // initialize inverter layer to hide - layer_set_hidden((Layer *)inv_battlevel_layer, true); - + layer_set_hidden((Layer *)inv_rig_battlevel_layer, true); + //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD BATTLEVEL, LAST BATTLEVEL: %s", last_battlevel); if (strcmp(last_battlevel, " ") == 0) { // Init code or no battery, can't do battery; set text layer & icon to empty value //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, NO BATTERY"); - text_layer_set_text(battlevel_layer, ""); - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATTNONE_ICON_INDX]); + text_layer_set_text(rig_battlevel_layer, ""); LowBatteryAlert = false; return; } @@ -2222,15 +2308,13 @@ static void load_battlevel() { if (strcmp(last_battlevel, "0") == 0) { // Zero battery level; set here, so if we get zero later we know we have an error instead //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, ZERO BATTERY, SET STRING"); - text_layer_set_text(battlevel_layer, "0%"); - layer_set_hidden((Layer *)inv_battlevel_layer, false); + text_layer_set_text(rig_battlevel_layer, "0%"); + layer_set_hidden((Layer *)inv_rig_battlevel_layer, false); if (!LowBatteryAlert) { //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, ZERO BATTERY, VIBRATE"); alert_handler_cgm(LOWBATTERY_VIBE); LowBatteryAlert = true; - } - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, ZERO BATTERY, SET ICON"); - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATTEMPTY_ICON_INDX]); + } return; } @@ -2239,81 +2323,93 @@ static void load_battlevel() { //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD BATTLEVEL, CURRENT BATTLEVEL: %i", current_battlevel); if ((current_battlevel <= 0) || (current_battlevel > 100) || (last_battlevel[0] == '-')) { - // got a negative or out of bounds or error battery level + // got a negative or out of bounds or error battery level //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, UNKNOWN, ERROR BATTERY"); - text_layer_set_text(battlevel_layer, "ERR"); - layer_set_hidden((Layer *)inv_battlevel_layer, false); - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATTNONE_ICON_INDX]); + text_layer_set_text(rig_battlevel_layer, "ERR"); + layer_set_hidden((Layer *)inv_rig_battlevel_layer, false); return; } - - // get current battery level and set battery level text with percent - snprintf(battlevel_percent, BATTLEVEL_FORMATTED_SIZE, "%i%%", current_battlevel); - text_layer_set_text(battlevel_layer, battlevel_percent); - - // check battery level, set battery level icon - if ( (current_battlevel > 90) && (current_battlevel <= 100) ) { - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATTFULL_ICON_INDX]); - LowBatteryAlert = false; - } - else if (current_battlevel > 80) { - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATT90_ICON_INDX]); - LowBatteryAlert = false; - } - else if (current_battlevel > 70) { - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATT80_ICON_INDX]); - LowBatteryAlert = false; - } - else if (current_battlevel > 60) { - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATT70_ICON_INDX]); - LowBatteryAlert = false; - } - else if (current_battlevel > 50) { - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATT60_ICON_INDX]); - LowBatteryAlert = false; - } - else if (current_battlevel > 40) { - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATT50_ICON_INDX]); - LowBatteryAlert = false; - } - else if (current_battlevel > 30) { - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATT40_ICON_INDX]); - LowBatteryAlert = false; - } - else if (current_battlevel > 20) { - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATT30_ICON_INDX]); - LowBatteryAlert = false; - } - else if (current_battlevel > 10) { - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATT20_ICON_INDX]); - layer_set_hidden((Layer *)inv_battlevel_layer, false); - if (!LowBatteryAlert) { - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, LOW BATTERY, 20 OR LESS, VIBRATE"); - alert_handler_cgm(LOWBATTERY_VIBE); - LowBatteryAlert = true; - } + // initialize formatted battlevel + strncpy(formatted_battlevel, " ", BATTLEVEL_FORMAT_SIZE); + + // get current battery level and set battery level text with percent + if (current_battlevel < 10) { strncpy(formatted_battlevel, "Rig ", BATTLEVEL_LABEL_SIZE); } + else { strncpy(formatted_battlevel, "Rig ", BATTLEVEL_LABEL_SIZE); } + snprintf(battlevel_percent, BATTLEVEL_PERCENT_SIZE, "%i%%", current_battlevel); + strcat(formatted_battlevel, battlevel_percent); + text_layer_set_text(rig_battlevel_layer, formatted_battlevel); + + if ( (current_battlevel > 10) && (current_battlevel <= 20) ) { + layer_set_hidden((Layer *)inv_rig_battlevel_layer, false); + if (!LowBatteryAlert) { + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, LOW BATTERY, 20 OR LESS, VIBRATE"); + alert_handler_cgm(LOWBATTERY_VIBE); + LowBatteryAlert = true; } - else if (current_battlevel > 5) { - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATT10_ICON_INDX]); - layer_set_hidden((Layer *)inv_battlevel_layer, false); - if (!LowBatteryAlert) { - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, LOW BATTERY, 10 OR LESS, VIBRATE"); - alert_handler_cgm(LOWBATTERY_VIBE); - LowBatteryAlert = true; - } - } - else if ( (current_battlevel > 0) && (current_battlevel <= 5) ) { - create_update_bitmap(&batticon_bitmap,batticon_layer,BATTLEVEL_ICONS[BATTEMPTY_ICON_INDX]); - layer_set_hidden((Layer *)inv_battlevel_layer, false); - if (!LowBatteryAlert) { - //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, LOW BATTERY, 5 OR LESS, VIBRATE"); - alert_handler_cgm(LOWBATTERY_VIBE); - LowBatteryAlert = true; - } + } + + if ( (current_battlevel > 5) && (current_battlevel <= 10) ) { + layer_set_hidden((Layer *)inv_rig_battlevel_layer, false); + if (!LowBatteryAlert) { + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, LOW BATTERY, 10 OR LESS, VIBRATE"); + alert_handler_cgm(LOWBATTERY_VIBE); + LowBatteryAlert = true; } + } + + if ( (current_battlevel > 0) && (current_battlevel <= 5) ) { + layer_set_hidden((Layer *)inv_rig_battlevel_layer, false); + if (!LowBatteryAlert) { + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, LOW BATTERY, 5 OR LESS, VIBRATE"); + alert_handler_cgm(LOWBATTERY_VIBE); + LowBatteryAlert = true; + } + } //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD BATTLEVEL, END FUNCTION"); -} // end load_battlevel +} // end load_rig_battlevel + +static void load_noise() { + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD NOISE, FUNCTION START"); + + // CONSTANTS + const uint8_t NOISE_FORMATTED_SIZE = 8; + + //APP_LOG(APP_LOG_LEVEL_DEBUG, "LOAD NOISE, CURRENT NOISE VALUE: %i ", current_noise_value); + + switch (current_noise_value) { + + case NO_NOISE:; + strncpy(formatted_noise, " ", NOISE_FORMATTED_SIZE); + break; + case CLEAN_NOISE:; + strncpy(formatted_noise, "Cln", NOISE_FORMATTED_SIZE); + break; + case LIGHT_NOISE:; + strncpy(formatted_noise, "Lgt", NOISE_FORMATTED_SIZE); + break; + case MEDIUM_NOISE:; + strncpy(formatted_noise, "Med", NOISE_FORMATTED_SIZE); + break; + case HEAVY_NOISE:; + strncpy(formatted_noise, "Hvy", NOISE_FORMATTED_SIZE); + break; + case WARMUP_NOISE:; + strncpy(formatted_noise, " ", NOISE_FORMATTED_SIZE); + break; + case OTHER_NOISE:; + strncpy(formatted_noise, " ", NOISE_FORMATTED_SIZE); + break; + default:; + strncpy(formatted_noise, "ERR", NOISE_FORMATTED_SIZE); + } + + //APP_LOG(APP_LOG_LEVEL_DEBUG, "SYNC TUPLE, NOISE: %s ", formatted_noise); + + text_layer_set_text(noise_layer, formatted_noise); + + //APP_LOG(APP_LOG_LEVEL_INFO, "LOAD NOISE, END FUNCTION"); +} // end load_noise void sync_tuple_changed_callback_cgm(const uint32_t key, const Tuple* new_tuple, const Tuple* old_tuple, void* context) { //APP_LOG(APP_LOG_LEVEL_INFO, "SYNC TUPLE"); @@ -2349,14 +2445,14 @@ void sync_tuple_changed_callback_cgm(const uint32_t key, const Tuple* new_tuple, case CGM_TCGM_KEY:; //APP_LOG(APP_LOG_LEVEL_INFO, "SYNC TUPLE: READ CGM TIME"); - current_cgm_time = new_tuple->value->uint32; + current_cgm_time = new_tuple->value->uint32; //APP_LOG(APP_LOG_LEVEL_DEBUG, "SYNC TUPLE, CGM TIME VALUE: %i ", current_cgm_time); load_cgmtime(); break; // break for CGM_TCGM_KEY case CGM_TAPP_KEY:; //APP_LOG(APP_LOG_LEVEL_INFO, "SYNC TUPLE: READ APP TIME NOW"); - current_app_time = new_tuple->value->uint32; + current_app_time = new_tuple->value->uint32; //APP_LOG(APP_LOG_LEVEL_DEBUG, "SYNC TUPLE, APP TIME VALUE: %i ", current_app_time); load_apptime(); break; // break for CGM_TAPP_KEY @@ -2374,21 +2470,47 @@ void sync_tuple_changed_callback_cgm(const uint32_t key, const Tuple* new_tuple, strncpy(last_battlevel, new_tuple->value->cstring, BATTLEVEL_MSGSTR_SIZE); //APP_LOG(APP_LOG_LEVEL_DEBUG, "SYNC TUPLE, BATTERY LEVEL VALUE: %s ", last_battlevel); //APP_LOG(APP_LOG_LEVEL_INFO, "SYNC TUPLE: BATTERY LEVEL, CALL LOAD BATTLEVEL"); - load_battlevel(); + load_rig_battlevel(); //APP_LOG(APP_LOG_LEVEL_INFO, "SYNC TUPLE: BATTERY LEVEL OUT"); break; // break for CGM_UBAT_KEY - case CGM_NAME_KEY: + case CGM_NAME_KEY:; //APP_LOG(APP_LOG_LEVEL_INFO, "SYNC TUPLE: T1D NAME"); text_layer_set_text(t1dname_layer, new_tuple->value->cstring); break; // break for CGM_NAME_KEY - case CGM_VALS_KEY: + case CGM_VALS_KEY:; //APP_LOG(APP_LOG_LEVEL_INFO, "SYNC TUPLE: VALUES"); strncpy(current_values, new_tuple->value->cstring, VALUE_MSGSTR_SIZE); load_values(); - break; // break for CGM_VALS_KEY - + break; // break for CGM_VALS_KEY + + case CGM_CLRW_KEY:; + //APP_LOG(APP_LOG_LEVEL_INFO, "SYNC TUPLE: CALCULATED RAW"); + strncpy(last_calc_raw, new_tuple->value->cstring, BG_MSGSTR_SIZE); + if ( (strcmp(last_calc_raw, "0") == 0) || (strcmp(last_calc_raw, "0.0") == 0) ) { + strncpy(last_calc_raw, " ", BG_MSGSTR_SIZE); + HaveCalcRaw = false; + } + else { HaveCalcRaw = true; } + text_layer_set_text(raw_calc_layer, last_calc_raw); + break; // break for CGM_CLRW_KEY + + case CGM_RWUF_KEY:; + //APP_LOG(APP_LOG_LEVEL_INFO, "SYNC TUPLE: RAW UNFILTERED"); + strncpy(last_raw_unfilt, new_tuple->value->cstring, BG_MSGSTR_SIZE); + if ( (strcmp(last_raw_unfilt, "0") == 0) || (strcmp(last_raw_unfilt, "0.0") == 0) || (!TurnOnUnfilteredRaw) ) { + strncpy(last_raw_unfilt, " ", BG_MSGSTR_SIZE); + } + text_layer_set_text(raw_unfilt_layer, last_raw_unfilt); + break; // break for CGM_RWUF_KEY + + case CGM_NOIZ_KEY:; + //APP_LOG(APP_LOG_LEVEL_INFO, "SYNC TUPLE: NOISE"); + current_noise_value = new_tuple->value->uint8; + //APP_LOG(APP_LOG_LEVEL_DEBUG, "SYNC TUPLE, NOISE: %i ", current_noise_value); + load_noise(); + break; // break for CGM_NOIZ_KEY } // end switch(key) } // end sync_tuple_changed_callback_cgm() @@ -2465,14 +2587,10 @@ void handle_minute_tick_cgm(struct tm* tick_time_cgm, TimeUnits units_changed_cg ++lastAlertTime; //APP_LOG(APP_LOG_LEVEL_DEBUG, "lastAlertTime OUT: %i", lastAlertTime); + // check watch battery + handle_watch_battery_cgm(battery_state_service_peek()); + } - else if (units_changed_cgm & DAY_UNIT) { - //APP_LOG(APP_LOG_LEVEL_INFO, "TICK TIME DAY CODE"); - tick_return_cgm = strftime(date_app_text, DATE_TEXTBUFF_SIZE, "%a %d", tick_time_cgm); - if (tick_return_cgm != 0) { - text_layer_set_text(date_app_layer, date_app_text); - } - } } // end handle_minute_tick_cgm @@ -2487,20 +2605,20 @@ void window_load_cgm(Window *window_cgm) { window_layer_cgm = window_get_root_layer(window_cgm); // TOPHALF WHITE - tophalf_layer = text_layer_create(GRect(0, 0, 144, 88)); + tophalf_layer = text_layer_create(GRect(0, 0, 144, 83)); text_layer_set_text_color(tophalf_layer, GColorBlack); text_layer_set_background_color(tophalf_layer, GColorWhite); text_layer_set_font(tophalf_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD)); text_layer_set_text_alignment(tophalf_layer, GTextAlignmentCenter); layer_add_child(window_layer_cgm, text_layer_get_layer(tophalf_layer)); - // AWESOME BG LAYER - awesomebg_layer = text_layer_create(GRect(-10, 33, 144, 55)); - text_layer_set_text_color(awesomebg_layer, GColorBlack); - text_layer_set_background_color(awesomebg_layer, GColorClear); - text_layer_set_font(awesomebg_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); - text_layer_set_text_alignment(awesomebg_layer, GTextAlignmentCenter); - layer_add_child(window_layer_cgm, text_layer_get_layer(awesomebg_layer)); + // HAPPY MSG LAYER + happymsg_layer = text_layer_create(GRect(-10, 33, 144, 55)); + text_layer_set_text_color(happymsg_layer, GColorBlack); + text_layer_set_background_color(happymsg_layer, GColorClear); + text_layer_set_font(happymsg_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(happymsg_layer, GTextAlignmentCenter); + layer_add_child(window_layer_cgm, text_layer_get_layer(happymsg_layer)); // DELTA BG / MESSAGE LAYER message_layer = text_layer_create(GRect(0, 33, 144, 55)); @@ -2511,28 +2629,22 @@ void window_load_cgm(Window *window_cgm) { layer_add_child(window_layer_cgm, text_layer_get_layer(message_layer)); // ICON, ARROW OR SPECIAL VALUE - icon_layer = bitmap_layer_create(GRect(85, -7, 78, 50)); - bitmap_layer_set_alignment(icon_layer, GAlignTopLeft); + icon_layer = bitmap_layer_create(GRect(78, -2, 78, 50)); + bitmap_layer_set_alignment(icon_layer, GAlignCenter); bitmap_layer_set_background_color(icon_layer, GColorClear); - layer_add_child(window_layer_cgm, bitmap_layer_get_layer(icon_layer)); - - // INVERTER ICON LAYER - //inv_icon_layer = inverter_layer_create(GRect(85, -7, 78, 47)); - //layer_add_child(window_get_root_layer(window_cgm), inverter_layer_get_layer(inv_icon_layer)); - - // APP TIME AGO ICON - appicon_layer = bitmap_layer_create(GRect(118, 63, 40, 24)); - bitmap_layer_set_alignment(appicon_layer, GAlignLeft); - bitmap_layer_set_background_color(appicon_layer, GColorWhite); - layer_add_child(window_layer_cgm, bitmap_layer_get_layer(appicon_layer)); - - // APP TIME AGO READING - time_app_layer = text_layer_create(GRect(77, 58, 40, 24)); - text_layer_set_text_color(time_app_layer, GColorBlack); - text_layer_set_background_color(time_app_layer, GColorClear); - text_layer_set_font(time_app_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); - text_layer_set_text_alignment(time_app_layer, GTextAlignmentRight); - layer_add_child(window_layer_cgm, text_layer_get_layer(time_app_layer)); + layer_add_child(window_layer_cgm, bitmap_layer_get_layer(icon_layer)); + + // RIG BATTERY LEVEL + rig_battlevel_layer = text_layer_create(GRect(70, 61, 72, 22)); + text_layer_set_text_color(rig_battlevel_layer, GColorBlack); + text_layer_set_background_color(rig_battlevel_layer, GColorClear); + text_layer_set_font(rig_battlevel_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD)); + text_layer_set_text_alignment(rig_battlevel_layer, GTextAlignmentRight); + layer_add_child(window_layer_cgm, text_layer_get_layer(rig_battlevel_layer)); + + // INVERTER BATTERY LAYER + inv_rig_battlevel_layer = inverter_layer_create(GRect(112, 66, 30, 15)); + layer_add_child(window_get_root_layer(window_cgm), inverter_layer_get_layer(inv_rig_battlevel_layer)); // BG bg_layer = text_layer_create(GRect(0, -5, 95, 47)); @@ -2542,24 +2654,44 @@ void window_load_cgm(Window *window_cgm) { text_layer_set_text_alignment(bg_layer, GTextAlignmentCenter); layer_add_child(window_layer_cgm, text_layer_get_layer(bg_layer)); + // CALCULATED RAW INSTEAD OF BG - LAST VALUE (1) + calcraw_last1_layer = text_layer_create(GRect(0, -7, 40, 25)); + text_layer_set_text_color(calcraw_last1_layer, GColorBlack); + text_layer_set_background_color(calcraw_last1_layer, GColorClear); + text_layer_set_font(calcraw_last1_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(calcraw_last1_layer, GTextAlignmentLeft); + layer_add_child(window_layer_cgm, text_layer_get_layer(calcraw_last1_layer)); + + // CALCULATED RAW INSTEAD OF BG - 2ND LAST VALUE (2) + calcraw_last2_layer = text_layer_create(GRect(32, 3, 40, 25)); + text_layer_set_text_color(calcraw_last2_layer, GColorBlack); + text_layer_set_background_color(calcraw_last2_layer, GColorClear); + text_layer_set_font(calcraw_last2_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(calcraw_last2_layer, GTextAlignmentLeft); + layer_add_child(window_layer_cgm, text_layer_get_layer(calcraw_last2_layer)); + + // CALCULATED RAW INSTEAD OF BG - 3RD LAST VALUE (3) + calcraw_last3_layer = text_layer_create(GRect(63, 16, 40, 25)); + text_layer_set_text_color(calcraw_last3_layer, GColorBlack); + text_layer_set_background_color(calcraw_last3_layer, GColorClear); + text_layer_set_font(calcraw_last3_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(calcraw_last3_layer, GTextAlignmentLeft); + layer_add_child(window_layer_cgm, text_layer_get_layer(calcraw_last3_layer)); + // PERFECT BG perfectbg_layer = bitmap_layer_create(GRect(0, -7, 95, 47)); bitmap_layer_set_alignment(perfectbg_layer, GAlignTopLeft); bitmap_layer_set_background_color(perfectbg_layer, GColorClear); layer_add_child(window_layer_cgm, bitmap_layer_get_layer(perfectbg_layer)); - // INVERTER BG LAYER - //inv_bg_layer = inverter_layer_create(GRect(0, -5, 95, 47)); - //layer_add_child(window_get_root_layer(window_cgm), inverter_layer_get_layer(inv_bg_layer)); - // CGM TIME AGO ICON - cgmicon_layer = bitmap_layer_create(GRect(5, 63, 40, 24)); + cgmicon_layer = bitmap_layer_create(GRect(2, 63, 40, 19)); bitmap_layer_set_alignment(cgmicon_layer, GAlignLeft); bitmap_layer_set_background_color(cgmicon_layer, GColorWhite); layer_add_child(window_layer_cgm, bitmap_layer_get_layer(cgmicon_layer)); // CGM TIME AGO READING - cgmtime_layer = text_layer_create(GRect(28, 58, 40, 24)); + cgmtime_layer = text_layer_create(GRect(26, 56, 40, 24)); text_layer_set_text_color(cgmtime_layer, GColorBlack); text_layer_set_background_color(cgmtime_layer, GColorClear); text_layer_set_font(cgmtime_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); @@ -2567,48 +2699,63 @@ void window_load_cgm(Window *window_cgm) { layer_add_child(window_layer_cgm, text_layer_get_layer(cgmtime_layer)); // T1D NAME - t1dname_layer = text_layer_create(GRect(5, 138, 69, 28)); + t1dname_layer = text_layer_create(GRect(2, 140, 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_cgm, 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_cgm, bitmap_layer_get_layer(batticon_layer)); - - // BATTERY LEVEL - battlevel_layer = text_layer_create(GRect(110, 144, 38, 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_cgm, text_layer_get_layer(battlevel_layer)); - // INVERTER BATTERY LAYER - inv_battlevel_layer = inverter_layer_create(GRect(110, 149, 38, 15)); - layer_add_child(window_get_root_layer(window_cgm), inverter_layer_get_layer(inv_battlevel_layer)); - - // CURRENT ACTUAL TIME FROM WATCH - time_watch_layer = text_layer_create(GRect(0, 82, 144, 44)); + // WATCH BATTERY LEVEL + watch_battlevel_layer = text_layer_create(GRect(71, 145, 72, 22)); + text_layer_set_text_color(watch_battlevel_layer, GColorWhite); + text_layer_set_background_color(watch_battlevel_layer, GColorBlack); + text_layer_set_font(watch_battlevel_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD)); + text_layer_set_text_alignment(watch_battlevel_layer, GTextAlignmentRight); + handle_watch_battery_cgm(battery_state_service_peek()); + layer_add_child(window_layer_cgm, text_layer_get_layer(watch_battlevel_layer)); + + // TIME; CURRENT ACTUAL TIME FROM WATCH + time_watch_layer = text_layer_create(GRect(0, 102, 144, 44)); text_layer_set_text_color(time_watch_layer, GColorWhite); text_layer_set_background_color(time_watch_layer, GColorClear); text_layer_set_font(time_watch_layer, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD)); text_layer_set_text_alignment(time_watch_layer, GTextAlignmentCenter); layer_add_child(window_layer_cgm, text_layer_get_layer(time_watch_layer)); - // CURRENT ACTUAL DATE FROM APP - date_app_layer = text_layer_create(GRect(0, 120, 144, 25)); + // DATE + date_app_layer = text_layer_create(GRect(39, 80, 72, 28)); text_layer_set_text_color(date_app_layer, GColorWhite); text_layer_set_background_color(date_app_layer, GColorClear); - text_layer_set_font(date_app_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_font(date_app_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD)); text_layer_set_text_alignment(date_app_layer, GTextAlignmentCenter); draw_date_from_app(); layer_add_child(window_layer_cgm, text_layer_get_layer(date_app_layer)); + // RAW CALCULATED + raw_calc_layer = text_layer_create(GRect(1, 76, 40, 25)); + text_layer_set_text_color(raw_calc_layer, GColorWhite); + text_layer_set_background_color(raw_calc_layer, GColorClear); + text_layer_set_font(raw_calc_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(raw_calc_layer, GTextAlignmentLeft); + layer_add_child(window_layer_cgm, text_layer_get_layer(raw_calc_layer)); + + // NOISE + noise_layer = text_layer_create(GRect(85, 76, 58, 27)); + text_layer_set_text_color(noise_layer, GColorWhite); + text_layer_set_background_color(noise_layer, GColorClear); + text_layer_set_font(noise_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(noise_layer, GTextAlignmentRight); + layer_add_child(window_layer_cgm, text_layer_get_layer(noise_layer)); + + // RAW UNFILT + raw_unfilt_layer = text_layer_create(GRect(1, 92, 40, 25)); + text_layer_set_text_color(raw_unfilt_layer, GColorWhite); + text_layer_set_background_color(raw_unfilt_layer, GColorClear); + text_layer_set_font(raw_unfilt_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); + text_layer_set_text_alignment(raw_unfilt_layer, GTextAlignmentLeft); + layer_add_child(window_layer_cgm, text_layer_get_layer(raw_unfilt_layer)); + // put " " (space) in bg field so logo continues to show // " " (space) also shows these are init values, not bad or null values Tuplet initial_values_cgm[] = { @@ -2619,7 +2766,10 @@ void window_load_cgm(Window *window_cgm) { TupletCString(CGM_DLTA_KEY, "LOAD"), TupletCString(CGM_UBAT_KEY, " "), TupletCString(CGM_NAME_KEY, " "), - TupletCString(CGM_VALS_KEY, " ") + TupletCString(CGM_VALS_KEY, " "), + TupletCString(CGM_CLRW_KEY, " "), + TupletCString(CGM_RWUF_KEY, " "), + TupletInteger(CGM_NOIZ_KEY, 0) }; //APP_LOG(APP_LOG_LEVEL_INFO, "WINDOW LOAD, ABOUT TO CALL APP SYNC INIT"); @@ -2643,17 +2793,13 @@ void window_unload_cgm(Window *window_cgm) { //APP_LOG(APP_LOG_LEVEL_INFO, "WINDOW UNLOAD, DESTROY GBITMAPS IF EXIST"); destroy_null_GBitmap(&icon_bitmap); - destroy_null_GBitmap(&appicon_bitmap); destroy_null_GBitmap(&cgmicon_bitmap); destroy_null_GBitmap(&specialvalue_bitmap); - destroy_null_GBitmap(&batticon_bitmap); destroy_null_GBitmap(&perfectbg_bitmap); //APP_LOG(APP_LOG_LEVEL_INFO, "WINDOW UNLOAD, DESTROY BITMAPS IF EXIST"); destroy_null_BitmapLayer(&icon_layer); destroy_null_BitmapLayer(&cgmicon_layer); - destroy_null_BitmapLayer(&appicon_layer); - destroy_null_BitmapLayer(&batticon_layer); destroy_null_BitmapLayer(&perfectbg_layer); //APP_LOG(APP_LOG_LEVEL_INFO, "WINDOW UNLOAD, DESTROY TEXT LAYERS IF EXIST"); @@ -2661,19 +2807,25 @@ void window_unload_cgm(Window *window_cgm) { destroy_null_TextLayer(&bg_layer); destroy_null_TextLayer(&cgmtime_layer); destroy_null_TextLayer(&message_layer); - destroy_null_TextLayer(&battlevel_layer); + destroy_null_TextLayer(&rig_battlevel_layer); + destroy_null_TextLayer(&watch_battlevel_layer); destroy_null_TextLayer(&t1dname_layer); destroy_null_TextLayer(&time_watch_layer); - destroy_null_TextLayer(&time_app_layer); destroy_null_TextLayer(&date_app_layer); - destroy_null_TextLayer(&awesomebg_layer); + destroy_null_TextLayer(&happymsg_layer); + destroy_null_TextLayer(&raw_calc_layer); + destroy_null_TextLayer(&raw_unfilt_layer); + destroy_null_TextLayer(&noise_layer); + destroy_null_TextLayer(&calcraw_last1_layer); + destroy_null_TextLayer(&calcraw_last2_layer); + destroy_null_TextLayer(&calcraw_last3_layer); //APP_LOG(APP_LOG_LEVEL_INFO, "WINDOW UNLOAD, DESTROY INVERTER LAYERS IF EXIST"); - destroy_null_InverterLayer(&inv_battlevel_layer); + destroy_null_InverterLayer(&inv_rig_battlevel_layer); // destroy animation destroy_perfectbg_animation(&perfectbg_animation); - destroy_perfectbg_animation(&awesomebg_animation); + destroy_perfectbg_animation(&happymsg_animation); //APP_LOG(APP_LOG_LEVEL_INFO, "WINDOW UNLOAD OUT"); } // end window_unload_cgm @@ -2685,7 +2837,10 @@ static void init_cgm(void) { tick_timer_service_subscribe(MINUTE_UNIT, &handle_minute_tick_cgm); // subscribe to the bluetooth connection service - bluetooth_connection_service_subscribe(handle_bluetooth_cgm); + bluetooth_connection_service_subscribe(&handle_bluetooth_cgm); + + // subscribe to the watch battery state service + battery_state_service_subscribe(&handle_watch_battery_cgm); // init the window pointer to NULL if it needs it if (window_cgm != NULL) { @@ -2726,6 +2881,9 @@ static void deinit_cgm(void) { //APP_LOG(APP_LOG_LEVEL_INFO, "DEINIT, UNSUBSCRIBE BLUETOOTH"); bluetooth_connection_service_unsubscribe(); + // unsubscribe to the watch battery state service + battery_state_service_unsubscribe(); + // cancel timers if they exist //APP_LOG(APP_LOG_LEVEL_INFO, "DEINIT, CANCEL APP TIMER"); if (timer_cgm != NULL) { diff --git a/src/js/pebble-js-app.js b/src/js/pebble-js-app.js old mode 100644 new mode 100755 index b7cbc22..3086025 --- a/src/js/pebble-js-app.js +++ b/src/js/pebble-js-app.js @@ -4,7 +4,7 @@ function fetchCgmData() { //console.log ("START fetchCgmData"); // declare local variables for message data - var response, message; + var response, responsebgs, responsecals, message; //get options from configuration window var opts = [ ].slice.call(arguments).pop( ); @@ -22,7 +22,10 @@ function fetchCgmData() { dlta: "NOEP", ubat: " ", name: " ", - vals: " " + vals: " ", + clrw: " ", + rwuf: " ", + noiz: 0 }; console.log("NO ENDPOINT JS message", JSON.stringify(message)); @@ -52,30 +55,32 @@ function fetchCgmData() { // Load response response = JSON.parse(req.responseText); - response = response.bgs; + responsebgs = response.bgs; + responsecals = response.cals; // check response data - if (response && response.length > 0) { + if (responsebgs && responsebgs.length > 0) { // response data is good; send log with response // console.log('got response', JSON.stringify(response)); // initialize message data - + // get direction arrow and BG - var currentDirection = response[0].direction, - values= " ", + var currentDirection = responsebgs[0].direction, + values = " ", currentIcon = "10", - currentBG = response[0].sgv, - //currentBG = "130", - //typeBG = opts.radio, + currentBG = responsebgs[0].sgv, + //currentBG = "100", + currentConvBG = currentBG, + specialValue = false, // get timezone offset timezoneDate = new Date(), timezoneOffset = timezoneDate.getTimezoneOffset(), // get CGM time delta and format - readingTime = new Date(response[0].datetime).getTime(), + readingTime = new Date(responsebgs[0].datetime).getTime(), //readingTime = null, formatReadTime = Math.floor( (readingTime / 1000) - (timezoneOffset * 60) ), @@ -85,18 +90,58 @@ function fetchCgmData() { formatAppTime = Math.floor( (appTime / 1000) - (timezoneOffset * 60) ), // get BG delta and format - currentBGDelta = response[0].bgdelta, + currentBGDelta = responsebgs[0].bgdelta, //currentBGDelta = -8, formatBGDelta = " ", // get battery level - currentBattery = response[0].battery, + currentBattery = responsebgs[0].battery, //currentBattery = "100", - // get name of T1D - NameofT1DPerson = opts.t1name; - - //currentDirection = "NONE"; + + // get NameofT1DPerson and IOB + NameofT1DPerson = opts.t1name, + currentIOB = responsebgs[0].iob, + + // sensor fields + currentCalcRaw = 0, + //currentCalcRaw = 100000, + formatCalcRaw = " ", + currentRawFilt = responsebgs[0].filtered, + formatRawFilt = " ", + currentRawUnfilt = responsebgs[0].unfiltered, + formatRawUnfilt = " ", + currentNoise = responsebgs[0].noise, + currentIntercept = "undefined", + currentSlope = "undefined", + currentScale = "undefined", + currentRatio = 0; + + // get name of T1D; if iob (case insensitive), use IOB + if ( (NameofT1DPerson.toUpperCase() === "IOB") && + ((typeof currentIOB != "undefined") && (currentIOB != "null")) ) { + NameofT1DPerson = "IOB:" + currentIOB; + } + else { + NameofT1DPerson = opts.t1name; + } + + if (responsecals && responsecals.length > 0) { + currentIntercept = responsecals[0].intercept; + currentSlope = responsecals[0].slope; + currentScale = responsecals[0].scale; + } + //currentDirection = "NONE"; + + // set some specific flags needed for later + if (opts.radio == "mgdl_form") { + if (currentBG < 30) { specialValue = true; } + } + else { + if (currentBG < 1.7) { specialValue = true; } + currentConvBG = (Math.round(currentBG * 18.018).toFixed(0)); + } + // convert arrow to a number string; sending number string to save memory // putting NOT COMPUTABLE first because that's most common and can get out fastest switch (currentDirection) { @@ -115,17 +160,60 @@ function fetchCgmData() { // if no battery being sent yet, then send nothing to watch // console.log("Battery Value: " + currentBattery); - if (typeof currentBattery == "undefined") { + if ( (typeof currentBattery == "undefined") || (currentBattery == "null") ) { currentBattery = " "; } // assign bg delta string formatBGDelta = ((currentBGDelta > 0 ? '+' : '') + currentBGDelta); + + //console.log("Current Unfiltered: " + currentRawUnfilt); + //console.log("Current Intercept: " + currentIntercept); + //console.log("Special Value Flag: " + specialValue); + //console.log("Current BG: " + currentBG); + // assign calculated raw value if we can + if ( (typeof currentIntercept != "undefined") && (currentIntercept != "null") ){ + if (specialValue) { + // don't use ratio adjustment + currentCalcRaw = (currentScale * (currentRawUnfilt - currentIntercept) / currentSlope); + //console.log("Special Value Calculated Raw: " + currentCalcRaw); + } + else { + currentRatio = (currentScale * (currentRawFilt - currentIntercept) / currentSlope / currentConvBG); + currentCalcRaw = (currentScale * (currentRawUnfilt - currentIntercept) / currentSlope / currentRatio); + //console.log("Current Ratio: " + currentRatio); + //console.log("Normal BG Calculated Raw: " + currentCalcRaw); + } + } // if currentIntercept + + // assign raw sensor values if they exist + if ( (typeof currentRawUnfilt != "undefined") && (currentRawUnfilt != "null") ) { + if (opts.radio == "mgdl_form") { + formatRawFilt = ((Math.round(currentRawFilt / 1000)).toFixed(0)); + formatRawUnfilt = ((Math.round(currentRawUnfilt / 1000)).toFixed(0)); + formatCalcRaw = ((Math.round(currentCalcRaw)).toFixed(0)); + //console.log("Format Unfiltered: " + formatRawUnfilt); + } + else { + formatRawFilt = ((Math.round(((currentRawFilt/1000)*0.0555) * 10) / 10).toFixed(1)); + formatRawUnfilt = ((Math.round(((currentRawUnfilt/1000)*0.0555) * 10) / 10).toFixed(1)); + formatCalcRaw = ((Math.round(currentCalcRaw)*0.0555).toFixed(1)); + //console.log("Format Unfiltered: " + formatRawUnfilt); + } + } // if currentRawUnfilt + + //console.log("Calculated Raw To Be Sent: " + formatCalcRaw); + + // assign blank noise if it doesn't exist + if ( (typeof currentNoise == "undefined") || (currentNoise == "null") ) { + currentNoise = 0; + } + if (opts.radio == "mgdl_form") { values = "0"; //mgdl selected } else { - values = "1"; //mmol selected + values = "1"; //mmol selected } values += "," + opts.lowbg; //Low BG Level values += "," + opts.highbg; //High BG Level @@ -139,9 +227,16 @@ function fetchCgmData() { } else { values += ",1"; //Time Format 24 Hour } + // Vibrate on raw value in special value; Yes = 1; No = 0; + if ( (currentCalcRaw !== 0) && (opts.rawvibrate == "1") ) { + values += ",1"; // Vibrate on raw value when in special values + } else { + values += ",0"; // Do not vibrate on raw value when in special values + } //console.log("Current Value: " + values); - + //console.log("Current rawvibrate: " + opts.rawvibrate); + //console.log("Current currentCalcRaw: " + currentCalcRaw); // debug logs; uncomment when need to debug something @@ -163,7 +258,10 @@ function fetchCgmData() { dlta: formatBGDelta, ubat: currentBattery, name: NameofT1DPerson, - vals: values + vals: values, + clrw: formatCalcRaw, + rwuf: formatRawUnfilt, + noiz: currentNoise }; // send message data to log and to watch @@ -193,7 +291,7 @@ function fetchCgmData() { }; console.log("DATA OFFLINE JS message", JSON.stringify(message)); MessageQueue.sendAppMessage(message); - }, 45000 ); // timeout in ms; set at 45 seconds; can not go beyond 59 seconds + }, 59000 ); // timeout in ms; set at 45 seconds; can not go beyond 59 seconds } // end fetchCgmData // message queue-ing to pace calls from C function on watch @@ -348,7 +446,7 @@ Pebble.addEventListener("appmessage", Pebble.addEventListener("showConfiguration", function(e) { console.log("Showing Configuration", JSON.stringify(e)); - Pebble.openURL('http://nightscout.github.io/cgm-pebble/s1-config-6.html'); + Pebble.openURL('http://nightscout.github.io/cgm-pebble/s1-config-7.html'); }); Pebble.addEventListener("webviewclosed", function(e) { diff --git a/wscript b/wscript old mode 100644 new mode 100755 index 15d208f..fbc4753 --- a/wscript +++ b/wscript @@ -5,6 +5,7 @@ # Feel free to customize this to your needs. # +import os.path try: from sh import CommandNotFound, jshint, cat, ErrorReturnCode_2 hint = jshint @@ -32,15 +33,25 @@ def build(ctx): # Concatenate all our JS files (but not recursively), and only if any JS exists in the first place. ctx.path.make_node('src/js/').mkdir() - js_paths = [node.abspath() for node in ctx.path.ant_glob("src/*.js")] + js_paths = ctx.path.ant_glob(['src/*.js', 'src/**/*.js']) if js_paths: - ctx.exec_command(['cat'] + js_paths, stdout=open('src/js/pebble-js-app.js', 'a')) + ctx(rule='cat ${SRC} > ${TGT}', source=js_paths, target='pebble-js-app.js') + has_js = True + else: + has_js = False ctx.load('pebble_sdk') ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'), target='pebble-app.elf') - ctx.pbl_bundle(elf='pebble-app.elf', - js=ctx.path.ant_glob('src/js/**/*.js')) + if os.path.exists('worker_src'): + ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'), + target='pebble-worker.elf') + ctx.pbl_bundle(elf='pebble-app.elf', + worker_elf='pebble-worker.elf', + js='pebble-js-app.js' if has_js else []) + else: + ctx.pbl_bundle(elf='pebble-app.elf', + js='pebble-js-app.js' if has_js else [])