From f0cbe07d1dceab32de7b7be8e5174ccd6e92cfb3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 19:52:05 +0100 Subject: [PATCH] Two screens --- apps/lcars/bg_right.png | Bin 0 -> 791 bytes apps/lcars/lcars.app.js | 185 ++++++++++++++++++++++++++++++------ apps/lcars/screenshot.png | Bin 5139 -> 4813 bytes apps/lcars/screenshot_2.png | Bin 0 -> 2671 bytes 4 files changed, 155 insertions(+), 30 deletions(-) create mode 100644 apps/lcars/bg_right.png create mode 100644 apps/lcars/screenshot_2.png diff --git a/apps/lcars/bg_right.png b/apps/lcars/bg_right.png new file mode 100644 index 0000000000000000000000000000000000000000..6e23a5d6ebc0687268a27c368507b63ed435d2b1 GIT binary patch literal 791 zcmV+y1L*vTP)u=77?@_KC=}5|wjz5wZD`KUTKmqT@jSO- z-kr~UXW!lZ&hG38gr$UnEH1q+^tPY>YBwfF1q1-z;&TavrJU^?Epi-7rrce>jIfk% z@4qZ$}v#kR_%l%g*pk2wJWfKa{RR1o0sbG8+742wST<^BmN#~wcL6$zAz#zwJe zwO;f;mWML|KF(pKyFDn@PMq5hF&77_q&I<)#~8 z8Z8%)laqEF^M597uOAPETpL0t`Ei^l7Q~1VBSwrEvE5)XO;h$~j@VT2X39=C9tycC zDtpIOVTCIz&nzpOZff#WRQ9f`f{f|bsuR)ZcSkQi0RYp~>ioJs0qo+$B9j<1cYHN^ z-}~gUW0+}bo*KPx+pTq!PyOksV3`O)_;r29J$#f@X2b%wez;su&vbPqfc})@egR7% V)8R{}8ms^S002ovPDHLkV1jhMZOi}w literal 0 HcmV?d00001 diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 8ac1dfe14..96fe186c2 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -16,6 +16,9 @@ for (const key in saved_settings) { settings[key] = saved_settings[key] } let hrmValue = 0; +var stepsData = new Array(24).fill(0); +var hrmData = new Array(24).fill(0); + /* * Colors to use @@ -25,17 +28,29 @@ let cOrange = "#FF9900"; let cPurple = "#FF00DC"; let cWhite = "#FFFFFF"; +/* + * Position in lcars + */ +let lcarsViewPos = 0; +let drag; + /* * Requirements and globals */ const locale = require('locale'); -var backgroundImage = { +var bgLeft = { width : 27, height : 176, bpp : 3, transparent : 0, buffer : require("heatshrink").decompress(atob("AAUM2XLlgCCwAJBBAuy4EAmQIF5cggAIGlmwgYIG2XIF42wF4ImGF4ImHJoQmGJoQdJhZNHNY47CgRNGBIJZHHgRiGBIRQ/KH5QCAFCh/eX5Q/KAwdCAGVbtu27YCCoAJBkuWrNlAQRGCiwRDAQPQBIMJCIYCBsAJBgomEtu0WoQmEy1YBIMBHYttIwQ7FyxQ/KHFlFAQ7F2weCHYplKChRTCCg5TCHw5TMAD0GzVp0wCCBBGaBIMaBAtpwECBA2mwEJBAugDgMmCIwJBF5EABAtoeQQvGCYQdPJoI7LMQzTCLJKAGzAJBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A==")) } +var bgRight = { + width : 27, height : 176, bpp : 3, + transparent : 0, + buffer : require("heatshrink").decompress(atob("lmy5YCDBIUyBAmy5AJBhYUG2EAhgIFAQMAgQIGCgQABCg4ABEAwUNFI2AKZHAKZEgGRZTGOIUDQxJxGKH5Q/agwAnUP7y/KH4yGeVYAJrdt23bAQVABIMly1ZsoCCMgUWCIYCB6AJBhIRDAQNgBIMFEwlt2i1CEwmWrAJBgI7FtpGCHYuWKH5QxEwpQDlo7F0A7IqBZBEwo7BCIwCBJo53CJoxiCJpIAdgOmzVpAQR/CgAIEAQJ2CBAoCBBIMmCg1oD4QLGFQUCCjQ+CKYw+CKY4JCKYwoCGRMaGREJDoroCgwdFzBlLKH5QvAHih/eX5Q/KE4A8UP7y/KH5QGDpg7HJoxZCCIx3CJowmCF4yACJox/CgAA=")) +} + var iconEarth = { width : 50, height : 50, bpp : 3, buffer : require("heatshrink").decompress(atob("AFtx48ECBsDwU5k/yhARLjgjBjlzAQMQEZcIkOP/fn31IEZgCBnlz58cEpM4geugEgwU/8+WNZJHDuHHvgmBCQ8goEOnVgJoMnyV58mACItHI4X8uAFBuVHnnz4BuGxk4////Egz3IkmWvPgNw8f/prB//BghTC+AjE7848eMjNnzySBwUJkmf/BuGuPDAQIjBiPHhhTCSQnjMo0ITANJn44Dg8MuFBggCCiFBcAJ0Bv5xEh+ITo2OhHkyf/OIQdBWwVHhgjBNwUE+fP/5EEgePMoYLBhMgyVJk/+BQQdC688I4XxOIc8v//NAvr+QEBj/5NwKVBy1/QYUciPBhk1EAJrC+KeC489QYaMBgU/8BNB9+ChEjz1Jkn/QYMBDQIgCcYTCCiP/nlzJQmenMAgV4//uy/9wRaB/1J8iVCcAfHjt9TYYICnhKCgRKBw159/v//r927OIeeoASBDQccvv3791KYVDBYPLJQeCnPnz//AAP6ocEjEkXgMgJQtz79fLAP8KYkccAcJ8Gf/f/xu/cAMQ4eP5MlyQRCMolx40YsOGBAPfnnzU4KVDpKMBvz8Dh0/8me7IICgkxJQXPIgZTD58sEgcJk+eNoONnFBhk4/5uB/pcDg5KD+4mEv4CBXISVDhEn31/8/+mH7x//JQK5CAAMB4JBCnnxJQf/+fJEgkAa4L+CAQOOjMn/1bXIRxDJQXx58f//Hhlz/88EgsChMgz/Zs/+nfkyV/8huDOI6SD498NwoACi1Z8+S/Plz17/+QCI7jC+ZxBmfPnojIAAMDcYWSp//2wRJEwq2GABECjMgNYwAmA=")) @@ -86,7 +101,7 @@ var iconNoBattery = { // Font to use: // -Graphics.prototype.setFontAntonioSmall = function(scale) { +Graphics.prototype.setFontAntonioMedium = function(scale) { // Actual height 20 (19 - 0) g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAA//mP/5gAAAAAAAAAAAAA/gAMAAAAAA/gAPAAAEIIBP+H/8D+IYBP+H/8D+IABCAAwIAfnwP8+PHh448eP3+B4fAAAAAAAH/AD/4AwGAMBgD/4Af8GAAPgAPgAfgAfAAfAA+AAOP/AH/4BgGAYBgH/4A/8AAAAAAAAAQAA/B+f4/+GMPhjv/4/h8Dg/gAcYwAAPwADgAAAAAAAAB//8///sAAaAACAAAMAAb//+f//AAAAAAAbAAGwAA4AA/wADgABsAAbAAAAAAAgAAMAAPwAD8AAMAADAAAAAAAAAAHAAB/AAOAAAAAAAAMAADAAAwAAMAACAAAAAAAAAABgAAYAAAAAAAAA4AD+AP+A/4A/gAOAAAAAAAAAH//j//8wADMAAz//8f/+AAAAAAAMAADAABgAA//+P//gAAAAAAAAAAAAAfgfP4fzAfswfDP/gx/gMAAAHgPj4D8wMDMHAz//8f3+AAEAAAAADwAH8APzA/AwP//j//4AAwAAAD/Hw/x+MwBjOAYz/+Mf/AAAAAAAH//j//8wYDMGAz9/8fP+AAcDAAAwAAMAfjB/4z/wP+AD4AAwAAAAOB/f4///MHAzBwM///H9/gAAAAAAH/Pj/78wGDMBgz//8f/+AAAAAAADhwA4cAAAAAAAAAAAAAADh/A4fgAAAAOAAHwABsAA7gAccAGDAAAAANgADYAA2AANgADYAA2AAAAAAAABgwAccADuAAbAAHwAA4AAAAHwAD8c4/POMHAD/wAfwAAAAAAAAD/wD//B4B4Y/HMf8zMBMyATMwczP+M4BzHwcgf+AA+AAAAAAD4A/+P/8D+DA/4wH/+AB/4AAeAAAAAAA//+P//jBgYwYGP//j//4PH4AAAAAAAf/+P//zgAcwADP4fz+P4Ph8AAAAAAA//+P//jAAYwAGPADj//4P/4AAAAAAA//+P//jBgYwYGMGBgAAAAAAP//j//4wYAMGADBgAAAAAAAA//w///PAHzAQM4MHP7/x+/8AAAAAAD//4//+AGAABgAAYAP//j//4AAAAAAAAAA//+P//gAAAAAAAAAAAHwAB+AABgAAY//+P//AAAAAAAAAAD//4//+APgAf+Afj8PgPjAAYAAAAAAD//4//+AABgAAYAAGAAAAAAA//+P//j/gAD/wAB/gAP4B/4P/AD//4//+AAAAAAAAAAP//j//4P4AAfwAA/g//+P//gAAAAAAAAAA//g//+PAHjAAY4AOP//h//wAAAAAAD//4//+MDADAwA4cAP/AB/gAAAAAAAA//g//+PAHjAAc4APv//5//yAAAAAAD//4//+MGADBgA48AP//h+f4AAAAAAB+Pw/z+MOBjBwY/P+Hx/AAHgwAAMAAD//4//+MAADAAAAAAP//D//4AAOAABgAA4//+P//AAAAwAAP8AD//AA/+AAfgP/4//gPwAAAAA+AAP/4Af/4AD+A//j/wA/wAD/+AA/4B/+P/+D+AAAAAMADj8P4P/4A/4B//w+A+MABgAAA4AAPwAB/gAB/+A//j/gA+AAMAAAAAYwB+MH/jf+Y/8GPwBjAAAAAAP//7//+wABsAAYAAAAAAPAAD/gAH/gAD/gAD4AACAAADAAGwABv//7//+AAAA=="), 32, atob("BQUHCAgVCQQFBQkHBQcFBwgICAgICAgICAgFBQcHBwgPCQkJCQcHCQoFCQkHDQoJCQkJCAYJCQ0ICAcGBwY="), 20+(scale<<8)+(1<<16)); } @@ -146,9 +161,9 @@ function drawHoriztonatlBgLine(color, x1, x2, y, h){ function drawLock(){ - g.setFontAntonioSmall(); + g.setFontAntonioMedium(); g.setColor(cOrange); - g.clearRect(120, 10, g.getWidth(), 80); + g.clearRect(120, 10, g.getWidth(), 75); g.drawString("LCARS", 130, 15); g.drawString("B-JS2", 130, 35); if(Bangle.isLocked()){ @@ -174,7 +189,7 @@ function drawState(){ // Alarm within symbol g.setFontAlign(-1, -1, 0); - g.setFontAntonioSmall(); + g.setFontAntonioMedium(); g.drawString("STATUS", 123, 97); if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); @@ -183,23 +198,16 @@ function drawState(){ } } -function draw(){ - - // First handle alarm to show this correctly afterwards - handleAlarm(); - - // Next draw the watch face - g.reset(); - g.clearRect(0, 0, g.getWidth(), g.getHeight()); +function drawPosition0(){ // Draw background image - g.drawImage(backgroundImage, 0, 0); - drawHoriztonatlBgLine(cBlue, 35, 120, 0, 4); + g.drawImage(bgLeft, 0, 0); + drawHoriztonatlBgLine(cBlue, 25, 120, 0, 4); drawHoriztonatlBgLine(cBlue, 130, 176, 0, 4); - drawHoriztonatlBgLine(cPurple, 35, 110, 81, 3); - drawHoriztonatlBgLine(cPurple, 120, 176, 81, 3); - drawHoriztonatlBgLine(cOrange, 35, 110, 87, 3); - drawHoriztonatlBgLine(cOrange, 120, 176, 87, 3); + drawHoriztonatlBgLine(cPurple, 20, 70, 80, 4); + drawHoriztonatlBgLine(cPurple, 80, 176, 80, 4); + drawHoriztonatlBgLine(cOrange, 35, 110, 87, 4); + drawHoriztonatlBgLine(cOrange, 120, 176, 87, 4); drawHoriztonatlBgLine(cOrange, 20, 176, 171, 5); // Draw logo @@ -214,7 +222,7 @@ function draw(){ // Write date g.setColor(cWhite); - g.setFontAntonioSmall(); + g.setFontAntonioMedium(); var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); @@ -228,6 +236,65 @@ function draw(){ // Draw state drawState(); +} + +function drawPosition1(){ + // Draw background image + g.drawImage(bgRight, 149, 0); + drawHoriztonatlBgLine(cBlue, 0, 140, 0, 4); + drawHoriztonatlBgLine(cPurple, 0, 80, 80, 4); + drawHoriztonatlBgLine(cPurple, 90, 150, 80, 4); + drawHoriztonatlBgLine(cOrange, 0, 50, 87, 4); + drawHoriztonatlBgLine(cOrange, 60, 140, 87, 4); + drawHoriztonatlBgLine(cOrange, 0, 150, 171, 5); + + // Draw steps bars + g.setColor(cWhite); + + // HRM + require("graph").drawBar(g, hrmData, { + axes : true, + gridx : 4, + gridy : 50, + width : 140, + height : 50, + x: 5, + y: 25 + }); + + // Steps + require("graph").drawBar(g, stepsData, { + axes : true, + gridx : 4, + gridy : 2500, + width : 140, + height : 50, + x: 5, + y: 115 + }); + + g.setFontAntonioMedium(); + g.drawString("HRM", 123, 7); + g.drawString("STEPS", 116, 94); +} + +function draw(){ + // First handle alarm to show this correctly afterwards + handleAlarm(); + + // Handle steps for graph data + handleSteps(); + + // Next draw the watch face + g.reset(); + g.clearRect(0, 0, g.getWidth(), g.getHeight()); + + // Draw current lcars position + if(lcarsViewPos == 0){ + drawPosition0(); + } else if (lcarsViewPos == 1) { + drawPosition1(); + } // Queue draw in one minute queueDraw(); @@ -240,7 +307,7 @@ function draw(){ function getSteps() { if (stepsWidget() !== undefined) return stepsWidget().getSteps(); - return "???"; + return 0; } function stepsWidget() { @@ -252,6 +319,15 @@ function stepsWidget() { return undefined; } +function handleSteps(){ + var current_h = (new Date()).getHours(); + if(current_h == 0){ + stepsData[current_h] = getSteps(); + } else { + stepsData[current_h] = getSteps() - stepsData[current_h-1]; + } +} + /* * Handle alarm @@ -315,19 +391,68 @@ Bangle.on('charging',function(charging) { }); Bangle.on('HRM', function (hrm) { + var current_h = (new Date()).getHours(); + hrmValue = hrm.bpm; + hrmData[current_h] = (hrmData[current_h] + hrmValue) / 2 }); -Bangle.on('swipe',function(dir) { - // Increase alarm - if(dir == -1){ - if(isAlarmEnabled()){ - settings.alarm += 5; - } else { - settings.alarm = getCurrentTimeInMinutes() + 5; - } + +function increaseAlarm(){ + if(isAlarmEnabled()){ + settings.alarm += 5; + } else { + settings.alarm = getCurrentTimeInMinutes() + 5; } + Storage.writeJSON(SETTINGS_FILE, settings); +} + + +function decreaseAlarm(){ + if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ + settings.alarm -= 5; + } else { + settings.alarm = -1; + } + + Storage.writeJSON(SETTINGS_FILE, settings); +} + + +// Thanks to the app "gbmusic" for this code to detect swipes in all 4 directions. +Bangle.on("drag", e => { + if (!drag) { // start dragging + drag = {x: e.x, y: e.y}; + } else if (!e.b) { // released + const dx = e.x-drag.x, dy = e.y-drag.y; + drag = null; + + // Horizontal swipe + if (Math.abs(dx)>Math.abs(dy)+10) { + if(dx > 0){ + lcarsViewPos = 0; + } else { + lcarsViewPos = 1; + } + + // Vertical swipe + } else if (Math.abs(dy)>Math.abs(dx)+10) { + if(dy > 0){ + decreaseAlarm(); + } else { + increaseAlarm(); + } + } + + draw(); + } +}); + + +/*Bangle.on('swipe',function(dir) { + + // Decrease alarm if(dir == +1){ if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ @@ -342,7 +467,7 @@ Bangle.on('swipe',function(dir) { // Update alarm state Storage.writeJSON(SETTINGS_FILE, settings); -}); +});*/ /* * Lets start widgets, listen for btn etc. diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 768c4a172e33f1cc478bc14a13400688af7bbbb2..98bf50546ab06532dbee2dcb58524a138c9ed9f2 100644 GIT binary patch delta 4809 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
Dt*ApQ z5T6g=3&nv8NHilL0QNZ4N~?j$ViBoqbo#v-fF*5@>RswzWX)qsh=CfII#^raaLge6 z%>t$8c{G5L@+7->+HDOUtqycxdf8T!AkwUR>C`J@JQ=t-Q5;Q0C$@(3m9pE1n@}fXWiWvNC0=6 zFbf!IfdueK>u25F78tS<*WKzYAT98=z>u>LY5lZ7lm&({uoOSlc4W9`(gh>MKu9ng zF{X961UdA>wP}Vp^0SRkJGTCd*ta#!5C-;w^x3&$K-y6Yz$I_1fqzQARsgs5wYR-T z<=<~1lR#bW=zctX_PR14ibS|R4Pjtps}kL3rvS6wbZ&KQFMzpo9*7-U+Z&Oum2s_n z5pCONvn!nkMo%^MybarGygLF|vz2roB+Wy?+-iR*-?9w+>~IvrSvpmFuC*bmebJyW zWkRPWj+7NcHL&OXFn9y5n?zFwW z0Q>#@i>)11et#P6K-+mK2EHnQC22y#Yuw_J11gnI*4x;qGh5SDSbSmXWX4Sf2CwOF zW#AqFOYA!v1Aj#wYUTtOxbEu@^Md)M!FekNZe=KmF)hhK9XH}89<9&f=K))H+9-3E z-z`R`ns^{49JNOLBDBds}USv?HAAIz!1Teg>f z;>?uM4Q-5=GXacP>4s^3K+R11n_0Ls4kZvl-hb%WBQD?>3dHOQV8lu{Nz=l_KMYK5 z#cVrEXCGS5L<|8ix?^RvagG)`-6a?CmgYEZTI!Mf9=E zWqpou*MGc1HE8#lTd%)zaoj0G?6y z4szz8&F3v-UrXwHCTRH{+3+>vJqCU!?te%CBfz$%`&9ufYF+Ex?$?W)W%=~}w=gbc z;vzvDw_AFK#ZnqrTHH})Y-M20uxObc=bVvNym?32WN2;|38~RjZWf_jP6M+IV!pde z({apQ(s0_ib!z7pERvCD1TbadVnaC^QC%wqYTnu}Xq3Y3GzwPEn0L~^5}4}g9|j!V)CfHPOWUv%16vFY zJK&x0?f|y5YwL5bAGGw#GO%<2$74KhBZEdt=xTk&MI2(2FD53MmLA~wl7A7MQ3k7R zLm1d<)Rmrdp}8xy@65JbfpLE&#N(;F-y0*H|MuLpeWoL_u5~Ps47`pnZ`qR}8u*r$ z&Q2d@uvjw?a?ry0rqok3E~O8mredYm>CJ; zC`Qk6VrIrw?f7#qM1nX@PC~5;nk)5-z1So{oFKjuNVNcidNWT{bYd1`WIN}REAZ7) j3Fi5n8xb14`k?*~5mv6K=tf)E00000NkvXXu0mjfVF)RR delta 5138 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