From b39e13f9f7898a46d245cf51cc6b879fa2c588c5 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Fri, 7 Jun 2024 12:58:15 -0700 Subject: [PATCH] inititial commit --- apps/burn/ChangeLog | 1 + apps/burn/bangle1-burn-screenshot.png | Bin 0 -> 13968 bytes apps/burn/burn-icon.js | 5 + apps/burn/burn.js | 254 ++++++++++++++++++++++++++ apps/burn/burn_icon.png | Bin 0 -> 1744 bytes apps/burn/metadata.json | 15 ++ 6 files changed, 275 insertions(+) create mode 100644 apps/burn/ChangeLog create mode 100644 apps/burn/bangle1-burn-screenshot.png create mode 100644 apps/burn/burn-icon.js create mode 100644 apps/burn/burn.js create mode 100644 apps/burn/burn_icon.png create mode 100644 apps/burn/metadata.json diff --git a/apps/burn/ChangeLog b/apps/burn/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/burn/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/burn/bangle1-burn-screenshot.png b/apps/burn/bangle1-burn-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fef0e701eb4ecf2987f773cce2e4585582c94818 GIT binary patch literal 13968 zcmeIYbyQqW6DABH!686!f`^0z8C(Vi2=0*Jo&g5;8Qk521qcqoJ-9=#;2zu(oWb2; zC;7eleS6OCyJz>m_nvcS`gT=6UG;Qz-R|iLRaTV3!6e5-LPElkkrscC_&)r7qd!7? zR`7atBOyI~=ccL&dk=P|v2(CBF}H%yz+CMhG!Pea6C@;;xxFOI*cY#H10JAZpho~? zATB!FJjL$Og^IEInURTGqw|#2y*$KOQr-A5a_qpOMBqt=_wpgY%VHA0=ya^QrdMgQ z$n_Z9H9g|Cq*5|+a{^s9IJ)88?A#`WTOLxD?x{nG#8r;v)XCT47nS=qobRi+$8>WmG_~|iLnM%%=c{xeHEYskR5ns zZ4KtWG{N*UC-ya4S*!ojQq*C!S4|FqK|4l;$Bje=^}Cz93}J1XOShJo{N-nDWS1wG zl<7jkEk}f2C*8J3pO!2yUoKX7)~p?$A*_t`a2C7rkiU161PW27wk3^~8jL=Gu=f{N zg)B{os(3`lmcp+!WiUr*oB>Z)p*pLRR{)Rw5jodLzHH=v%1BIIkEu`XT?*WLToX9k zg4E1p(2}dQVRqAjb$(vySQ94PSa>-M3ea{U^Z8C?H5q$=bI_2p*>Ej5GXAqqz}{RD zdxP(0LgO+i-0QS)+L9SRTjSKgMRB&hmrD?OKMXN`vFNP4j&aztlag_$Xhj=%9N_x( z8`-pF2*Wm3ZGYTWhhxW4H)`R*^qr9M`fP{sd)g-zxpalOGtm9l_`PraOv3!%425IA zh-pqTF3aU|Kp{Ka`UV1lrcL_FPexgi@WSfjC|Kf*C*SGd3Df;n3 zEdx_+ZS-n*!$12&by7v%u(Hm7X(Ev`wk2Y+eA8}|M1la4PCJqOk|L@s&l|fOFC9bj){?XxL5ndl z)LnOzbQ?<`icGqeHOt8D;v3%DC*#_Uuc0dr8&u_~au6*#dHG5mHR}3jX2KsSd5FZi zKEj34vb;R5SQDe<&2nbZS!s5}Lf>OTYvbMe#NTMpU?i-3h_oDX-3dxl)NW$QMydlN z4O3dvO_rpJ=XyvUC`kiOxRH2%JpzQPEYZ+T*p7$z)OYzN_!o3!cLwVaF)9pXWUsUho2h zhwE=Ld*LSJyw(=6$(kK-+S0e!T>j%?wNQ&JMpa0pe42%ITrJOuOy(6=T$ z#NQh<;!68t)(jJFeHmg#M*&%_=uLgeDUO3f#`9#Mn8X}jFCCj?bYO~KZ1To3uw{{% zN}V?$(Y1|6Dt)7KdBzqSBvHdZs#h7KIpRH7s?v3-qKWbA#D@v+zFGP3pH%b(nEn)A=z>1~oJdWr^NkhMc8Uzvo0>#^LPCT3P|CHr!_P)(qvwo|mmUl$2~ z9tgNd#~W%bIWVOex9~Xrz%HF``5LSIMUfLz%H@?-n&}3≶#bUUV;y>Q|pfECFji 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 { + const date = new Date(); + // Month is 0-indexed, so we add 1 to get the correct month number + return `${date.getMonth() + 1}-${date.getDate()}-${date.getFullYear()}`; +}; + +// Counter object to keep track of the count and the date +let counter = { count: 0, date: dayString() }; + +// Function to read the counter from the file +function readCounterFromFile() { + try { + // Open the file in read mode + file = Storage.open(PATH, "r"); + let line = file.readLine(); + + // If the file has content, parse it and update the counter + if (line) { + let splitLine = line.trim().split(","); + counter = { count: parseInt(splitLine[0]), date: splitLine[1] }; + } + } catch (err) { + // If the file does not exist, the counter will remain 0 + } +} + +// Function to write the counter to the file +function writeCounterToFile() { + // Open the file in write mode + file = Storage.open(PATH, "w"); + // Write the counter and date to the file + file.write(counter.count.toString() + "," + counter.date + "\n"); +} + +// Function to reset the counter +function resetCounter() { + // Reset the counter to 0 and update the date + counter = { count: 0, date: dayString() }; +} + +// Function to update the counter value +function updateCounterValue(value) { + // Update the counter with the new value, ensuring it's not less than 0 + counter = { count: Math.max(0, value), date: dayString() }; +} + +// Function to update the counter +function updateCounter(value) { + // If the date has changed, reset the counter + if (counter.date != dayString()) { + resetCounter(); + } else { + // Otherwise, update the counter value + updateCounterValue(value); + } + + // Write the updated counter to the file + writeCounterToFile(); + // Update the screen with the new counter value + updateScreen(); +} + +// Function to set a watch on a button to update the counter when pressed +function counterButtonWatch(button, increment) { + setWatch( + () => { + // If the button is for incrementing, or the counter is greater than 0, update the counter + if (increment || counter.count > 0) { + updateCounter( + counter.count + (increment ? getInterval() : -getInterval()) + ); + // Update the screen with the new counter value + updateScreen(); + } + }, + button, + { repeat: true } + ); +} + +// Function to create interval functions +const createIntervalFunctions = function () { + // Array of intervals + const intervals = [50, 100, 200, 10]; + // Current location in the intervals array + let location = 0; + + // Function to get the current interval + const getInterval = function () { + return intervals[location]; + }; + + // Function to rotate the increment + const rotateIncrement = function () { + // Update the location to the next index in the intervals array, wrapping around if necessary + location = (location + 1) % intervals.length; + // Update the screen with the new increment + updateScreen(); + }; + + // Return the getInterval and rotateIncrement functions + return { getInterval, rotateIncrement }; +}; + +// Create the interval functions +const intervalFunctions = createIntervalFunctions(); +const getInterval = intervalFunctions.getInterval; +const rotateIncrement = intervalFunctions.rotateIncrement; + +// Check if the hardware version is Bangle.js 2 +const BANGLEJS2 = process.env.HWVERSION == 2; + +// Variables for drag handling and screen coordinates +let drag, y, x; + +// If the hardware version is Bangle.js 2, set the coordinates accordingly +if (BANGLEJS2) { + drag = undefined; + y = 45; + x = 5; +} else { + // If the hardware version is Bangle.js 1, set the coordinates accordingly + y = 100; + x = 25; +} + +// Function to update the screen +function updateScreen() { + // Clear the screen area for the counter + g.clearRect(0, 50, 250, BANGLEJS2 ? 130 : 150) + .setBgColor(g.theme.bg) + .setColor(g.theme.fg) + .setFont("Vector", 40) + .setFontAlign(0, 0) + // Draw the counter value + .drawString(Math.floor(counter.count), g.getWidth() / 2, 100) + .setFont("6x8") + // Clear the screen area for the increment + .clearRect(g.getWidth() / 2 - 50, 140, g.getWidth() / 2 + 50, 160) + // Draw the increment value + .drawString("Increment: " + getInterval(), g.getWidth() / 2, 150); + + // If the hardware version is Bangle.js 1, draw the increment and decrement buttons + if (!BANGLEJS2) { + g.drawString("-", 45, 100).drawString("+", 185, 100); + } +} + +// If the hardware version is Bangle.js 2, set up the drag handling and button watch +if (BANGLEJS2) { + // Set up drag handling + Bangle.on("drag", (e) => { + // If this is the start of a drag, record the initial coordinates + if (!drag) { + drag = { x: e.x, y: e.y }; + return; + } + + // If the button is still being pressed, ignore this event + if (e.b) return; + + // Calculate the change in x and y from the start of the drag + const dx = e.x - drag.x; + const dy = e.y - drag.y; + // Reset the drag start coordinates + drag = null; + + // Determine if the drag is primarily horizontal or vertical + const isHorizontalDrag = Math.abs(dx) > Math.abs(dy) + 10; + const isVerticalDrag = Math.abs(dy) > Math.abs(dx) + 10; + + // If the drag is primarily horizontal, ignore it + if (isHorizontalDrag) { + return; + } + + // If the drag is primarily vertical, update the counter + if (isVerticalDrag) { + // If the drag is downwards and the counter is greater than 0, decrease the counter + if (dy > 0 && counter.count > 0) { + updateCounter(counter.count - getInterval()); + } else if (dy < 0) { + // If the drag is upwards, increase the counter + updateCounter(counter.count + getInterval()); + } + // Update the screen with the new counter value + updateScreen(); + } + }); + + // Set a watch on the button to rotate the increment when pressed + setWatch(rotateIncrement, BTN1, { repeat: true }); +} else { + // If the hardware version is Bangle.js 1, set up the button watches + + // Set watch on button to increase the counter + counterButtonWatch(BTN1, true); + counterButtonWatch(BTN5, true); // screen tap + // Set watch on button to decrease the counter + counterButtonWatch(BTN3, false); + counterButtonWatch(BTN4, false); // screen tap + + // Set a watch on button to rotate the increment when pressed + setWatch( + () => { + rotateIncrement(); + }, + BTN2, + { repeat: true } + ); +} + +// clear the screen +g.clear(); + +// Set the background and foreground colors +g.setBgColor(g.theme.bg).setColor(g.theme.fg); + +// Load and draw the widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +// Read the counter from the file +readCounterFromFile(); +// Update the screen with the counter value +updateScreen(); diff --git a/apps/burn/burn_icon.png b/apps/burn/burn_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..23d4a13e6fae6dcbd0c04597f36731274a8b197e GIT binary patch literal 1744 zcmbW0e@q)?7{}kcw(BS(&=r=kjd2{_)$x*rvx@+a0$eOU%kC9 z$Ycz4fXPPUh*K8+Sez{ACYBnM5t5AsHE|&(W^++PCc4EXitz^<#NqQ^+Z3t(p-*!6 zzW03I?{m-dKJVM-s&K^VcIXg7an4fS4Wo%XY8AZS&RU#6i0W;!*<4PWjcILfk(!=w zL@0BxYp}5Nx@Fgm!&Lz`$y#vgRKsY+Hr}2R(Ah^5nqT&&lx6?flM(0aAGokk-MVyS z{Ktj6?~a`uV>Tb}&M(M+^5fFJwS&4n^@aIA%}sTlp2FR(J-MGZ?^Kz;*=HCZedEBD z{u82)={~gOxoT-B$LMUE*mZb$>6hQLulcJ-Ry%xS$pci;;0r^^7t60&_XnDG4lnoF zvYr~7y*GOyqxQ_h!3X_wEyEqzvHQ7(48yOpsr5OxW)B$rS1;)+x4tTrzw=`1_v4=( z8}NIx{40fzVoxS_HJ*E5*6OdbLyWbzCs&twt)$m`J~1}t&gl=A;wO*y)#yIb)h#|_ ziP_O`EB>)|W-9Q3;k!d_lWt-r|K^-2;kKqZY3@F$yTuewB@q_>afM>Zyi8- zFz^E?kt9W;7u)nCtFRH!KqPD^t1w8Fz{p?Oy&w#GVcbnXJ@HUbTLjRFe2F9-33=85 zisyL=%Ugp>>4?GrKq(;NQf8Ey=WVheJiWn>3;=TM(SYJOvsIrY2;>s3HvpU-QG!sF zu-=W3f#Y((wO0_L0ogH#6%B|-BM5(wL_!5Y)xUv_S*e1GbiuVjLD`g0g1~G5D3QxS zC_Sn^=z#|$vK%FV68Quqm^KFbuit79C^T+b07JAG`B5GQAj)cT1Q{d7zEEU1r69mE zEdsEJzC6qXiGu(KmJy{-!VGq)LV!ddXIqA4Mj2t38V9r1U1f&CSBeJ=I7-=sk5VCua z8rnq47cCJ5^ui5*0R;dUf<`7ZyvX5aIW8B5|6?l7WZ=wvF->lo1+o*}N}Wgn9M7u> zsDll~vIc5JNM%zLHU(Iq8`wuHfZ`Cj0}Q;ByUel-$!^ literal 0 HcmV?d00001 diff --git a/apps/burn/metadata.json b/apps/burn/metadata.json new file mode 100644 index 000000000..576d6ef9e --- /dev/null +++ b/apps/burn/metadata.json @@ -0,0 +1,15 @@ +{ + "id": "burn", + "name": "Burn", + "version": "0.01", + "description": "Calorie Counter", + "icon": "burn_icon.png", + "tags": "tool", + "supports": ["BANGLEJS", "BANGLEJS2"], + "screenshots": [{"url":"bangle1-burn-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"burn.app.js","url":"burn.js"}, + {"name":"burn.img","url":"burn-icon.js","evaluate":true} + ] +}