From 10a50fdde236bffd27d0255ec1b48dd17f8a2239 Mon Sep 17 00:00:00 2001 From: 7kasper Date: Sun, 2 Jan 2022 20:29:28 +0100 Subject: [PATCH] fix time formatting --- apps/presentor/app.js | 500 +++++++++++++++++++++--------------------- 1 file changed, 254 insertions(+), 246 deletions(-) diff --git a/apps/presentor/app.js b/apps/presentor/app.js index 819f1ebc2..1d836b7ae 100644 --- a/apps/presentor/app.js +++ b/apps/presentor/app.js @@ -63,81 +63,80 @@ const SpecialReport = new Uint8Array([ ]); const MouseButton = { -NONE : 0, -LEFT : 1, -RIGHT : 2, -MIDDLE : 4, -BACK : 8, -FORWARD: 16 + NONE : 0, + LEFT : 1, + RIGHT : 2, + MIDDLE : 4, + BACK : 8, + FORWARD: 16 }; const kb = require("ble_hid_keyboard"); const Layout = require("Layout"); const Locale = require("locale"); -let mainLayout = new Layout( { -'type': 'v', -filly: 1, -c: [ - { - type: 'txt', - font: '6x8', - label: 'Presentor', - valign: -1, - halign: 0, - col: g.theme.fg1, - // bgCol: g.theme.bg2, - bgCol: '#00F', - fillx: 1, - }, { - type: 'h', - fillx: 1, - c: [ - { - type: 'txt', - font: '15%', - label: '00:00', - id: 'Time', - halign: -1, - pad: 3 - }, { - fillx: 1 - }, { - type: 'txt', - font: '15%', - label: '00:00', - id: 'Timer', - halign: 1, - pad: 3 - } - ] - }, { - type: 'txt', - font: '10%', - label: '+00:00', - id: 'RestTime', - col: '#fff' - }, { - type: 'txt', - font: '10%', - label: '--------------' - }, { - type: 'txt', - font: '15%', - label: 'Presenting', - id: 'Subject' - }, { - type: 'txt', - font: '6x8', - label: 'Swipe down to start the time.', - id: 'Notes', - col: '#ff0', - fillx: 1, - filly: 1, - valign: 1 - } - -] +let mainLayout = new Layout({ + 'type': 'v', + filly: 1, + c: [ + { + type: 'txt', + font: '6x8', + label: 'Presentor', + valign: -1, + halign: 0, + col: g.theme.fg1, + // bgCol: g.theme.bg2, + bgCol: '#00F', + fillx: 1, + }, { + type: 'h', + fillx: 1, + c: [ + { + type: 'txt', + font: '15%', + label: '00:00', + id: 'Time', + halign: -1, + pad: 3 + }, { + fillx: 1 + }, { + type: 'txt', + font: '15%', + label: '00:00', + id: 'Timer', + halign: 1, + pad: 3 + } + ] + }, { + type: 'txt', + font: '10%', + label: '+00:00', + id: 'RestTime', + col: '#fff' + }, { + type: 'txt', + font: '10%', + label: '--------------' + }, { + type: 'txt', + font: '15%', + label: 'Presenting', + id: 'Subject' + }, { + type: 'txt', + font: '6x8', + label: 'Swipe down to start the time.', + id: 'Notes', + col: '#ff0', + fillx: 1, + filly: 1, + valign: 1 + } + ] }, {lazy:true}); let settings = {pparts: [], sversion: 0}; @@ -172,84 +171,93 @@ let clearToSend = true; // Presentation Timers let ptimers = []; -function loadSettings() { -settings = require("Storage").readJSON('presentor.json'); -for (let i = 0; i < settings.pparts.length; i++) { - ptimers[i] = { - active: false, - tracked: -1, - left: settings.pparts[i].minutes * 60 + settings.pparts[i].seconds - }; +function formatTimePart(time) { + time = Math.floor(Math.abs(time)); + return time < 10 ? `0${time}` : `${time}`; } + +function formatTime(time, doPlus) { + return `${time < 0 ? '-' : (doPlus ? '+' : '')}${formatTimePart(time/60)}:${formatTimePart(time%60)}`; +} + +function loadSettings() { + settings = require("Storage").readJSON('presentor.json'); + for (let i = 0; i < settings.pparts.length; i++) { + ptimers[i] = { + active: false, + tracked: -1, + left: settings.pparts[i].minutes * 60 + settings.pparts[i].seconds + }; + } } function getCurrentTimer() { -if (pparti < 0) return '00:00'; -if (!settings.pparts || pparti >= settings.pparts.length) return '00:00'; -if (ptimers[pparti].tracked == -1) return '00:00'; -ptimers[pparti].left -= (getTime() - ptimers[pparti].tracked); -ptimers[pparti].tracked = getTime(); -return `${Math.floor(ptimers[pparti].left/60)}:${Math.floor(ptimers[pparti].left%60)}`; + if (pparti < 0) return '00:00'; + if (!settings.pparts || pparti >= settings.pparts.length) return '00:00'; + if (ptimers[pparti].tracked == -1) return '00:00'; + ptimers[pparti].left -= (getTime() - ptimers[pparti].tracked); + ptimers[pparti].tracked = getTime(); + return formatTime(ptimers[pparti].left); } function getRestTime() { -let rem = 0; -// Add all remaining time from previous presentation parts. -for (let i = 0; i < pparti; i++) { - rem += ptimers[i].left; -} -return `${rem >= 0 ? '+':'-'}${Math.floor(rem/60)}:${Math.floor(rem%60)}`; + let rem = 0; + // Add all remaining time from previous presentation parts. + for (let i = 0; i < pparti; i++) { + rem += ptimers[i].left; + } + return formatTime(rem, true); } function drawMainFrame() { -var d = new Date(); -// update time -mainLayout.Time.label = Locale.time(d,1); -// update timer -mainLayout.Timer.label = getCurrentTimer(); -mainLayout.RestTime.label = getRestTime(); -mainLayout.render(); -// schedule a draw for the next minute -if (timeoutDraw != -1) clearTimeout(timeoutDraw); -timeoutDraw = setTimeout(function() { - timeoutDraw = -1; - drawMainFrame(); -}, 1000 - (Date.now() % 1000)); + var d = new Date(); + // update time + mainLayout.Time.label = Locale.time(d,1); + // update timer + mainLayout.Timer.label = getCurrentTimer(); + mainLayout.RestTime.label = getRestTime(); + mainLayout.render(); + // schedule a draw for the next minute + if (timeoutDraw != -1) clearTimeout(timeoutDraw); + timeoutDraw = setTimeout(function() { + timeoutDraw = -1; + drawMainFrame(); + }, 1000 - (Date.now() % 1000)); } function drawMain() { -g.clear(); -mainLayout.forgetLazyState(); -drawMainFrame(); -// mainLayout.render(); -// E.showMessage('Presentor'); + g.clear(); + mainLayout.forgetLazyState(); + drawMainFrame(); + // mainLayout.render(); + // E.showMessage('Presentor'); } function doPPart(r) { -pparti += r; -if (pparti < 0) return; -if (!settings.pparts || pparti >= settings.pparts.length) return; -let ppart = settings.pparts[pparti]; -mainLayout.Subject.label = ppart.subject; -mainLayout.Notes.label = ppart.notes; -ptimers[pparti].tracked = getTime(); -drawMainFrame(); + pparti += r; + if (pparti < 0) return; + if (!settings.pparts || pparti >= settings.pparts.length) return; + let ppart = settings.pparts[pparti]; + mainLayout.Subject.label = ppart.subject; + mainLayout.Notes.label = ppart.notes; + ptimers[pparti].tracked = getTime(); + drawMainFrame(); } NRF.setServices(undefined, { hid : SpecialReport }); // TODO: figure out how to detect HID. NRF.on('HID', function() { -HIDenabled = true; + HIDenabled = true; }); function moveMouse(x,y,b,wheel,hwheel,callback) { -if (!HIDenabled) return; -if (!b) b = 0; -if (!wheel) wheel = 0; -if (!hwheel) hwheel = 0; -NRF.sendHIDReport([1,b,x,y,wheel,hwheel,0,0], function() { - if (callback) callback(); -}); + if (!HIDenabled) return; + if (!b) b = 0; + if (!wheel) wheel = 0; + if (!hwheel) hwheel = 0; + NRF.sendHIDReport([1,b,x,y,wheel,hwheel,0,0], function() { + if (callback) callback(); + }); } // function getSign(x) { @@ -257,160 +265,160 @@ NRF.sendHIDReport([1,b,x,y,wheel,hwheel,0,0], function() { // } function scroll(wheel,hwheel,callback) { -moveMouse(0,0,0,wheel,hwheel,callback); + moveMouse(0,0,0,wheel,hwheel,callback); } // Single click a certain button (immidiatly release). function clickMouse(b, callback) { -if (!HIDenabled) return; -NRF.sendHIDReport([1,b,0,0,0,0,0,0], function() { - NRF.sendHIDReport([1,0,0,0,0,0,0,0], function() { - if (callback) callback(); + if (!HIDenabled) return; + NRF.sendHIDReport([1,b,0,0,0,0,0,0], function() { + NRF.sendHIDReport([1,0,0,0,0,0,0,0], function() { + if (callback) callback(); + }); }); -}); } function pressKey(keyCode, modifiers, callback) { -if (!HIDenabled) return; -if (!modifiers) modifiers = 0; -NRF.sendHIDReport([2, modifiers,0,keyCode,0,0,0,0], function() { - NRF.sendHIDReport([2,0,0,0,0,0,0,0], function() { - if (callback) callback(); + if (!HIDenabled) return; + if (!modifiers) modifiers = 0; + NRF.sendHIDReport([2, modifiers,0,keyCode,0,0,0,0], function() { + NRF.sendHIDReport([2,0,0,0,0,0,0,0], function() { + if (callback) callback(); + }); }); -}); } function handleAcc(acc) { -let rRoll = acc.y * -50; -let rPitch = acc.x * -100; -if (mCal > 10) { - //console.log("x: " + (rRoll - homeRoll) + " y:" + (rPitch - homePitch)); - moveMouse(acc.y * -50 - homeRoll, acc.x * -100 - homePitch); -} else { - //console.log("homeroll: " +homeRoll +"homepitch: " + homePitch); - homeRoll = rRoll * 0.7 + homeRoll * 0.3; - homePitch = rPitch * 0.7 + homePitch * 0.3; - mCal = mCal + 1; -} + let rRoll = acc.y * -50; + let rPitch = acc.x * -100; + if (mCal > 10) { + //console.log("x: " + (rRoll - homeRoll) + " y:" + (rPitch - homePitch)); + moveMouse(acc.y * -50 - homeRoll, acc.x * -100 - homePitch); + } else { + //console.log("homeroll: " +homeRoll +"homepitch: " + homePitch); + homeRoll = rRoll * 0.7 + homeRoll * 0.3; + homePitch = rPitch * 0.7 + homePitch * 0.3; + mCal = mCal + 1; + } } Bangle.on('lock', function(on) { -if (on && holding) { - Bangle.setLocked(false); - Bangle.setLCDPower(1); -} + if (on && holding) { + Bangle.setLocked(false); + Bangle.setLCDPower(1); + } }); function startHolding() { -pressKey(kb.KEY.F10); -holding = true; -Bangle.buzz(); -E.showMessage('Holding'); -Bangle.on('accel', handleAcc); -Bangle.setLCDPower(1); + pressKey(kb.KEY.F10); + holding = true; + Bangle.buzz(); + E.showMessage('Holding'); + Bangle.on('accel', handleAcc); + Bangle.setLCDPower(1); } function stopHolding() { -clearTimeout(timeoutId); -if (holding) { - pressKey(kb.KEY.F10); - homePitch = 0; - homeRoll = 0; - holding = false; - mCal = 0; - Bangle.removeListener('accel', handleAcc); - Bangle.buzz(); - drawMain(); -} else { - timeoutId = setTimeout(drawMain, 1000); -} -clearTimeout(timeoutHolding); -timeoutHolding = -1; + clearTimeout(timeoutId); + if (holding) { + pressKey(kb.KEY.F10); + homePitch = 0; + homeRoll = 0; + holding = false; + mCal = 0; + Bangle.removeListener('accel', handleAcc); + Bangle.buzz(); + drawMain(); + } else { + timeoutId = setTimeout(drawMain, 1000); + } + clearTimeout(timeoutHolding); + timeoutHolding = -1; } Bangle.on('drag', function(e) { -if (cttl == 0) { cttl = getTime(); } -if (trackPadMode) { - if (lastx + lasty == 0) { - lastx = e.x; - lasty = e.y; - mttl = getTime(); - } - if (clearToSend) { - clearToSend = false; - let difX = e.x - lastx, difY = e.y - lasty; - let dT = getTime() - mttl; - let vX = difX / dT, vY = difY / dT; - //let qX = getSign(difX) * Math.pow(Math.abs(difX), 1.2); - //let qY = getSign(difY) * Math.pow(Math.abs(difY), 1.2); - let qX = difX + 0.02 * vX, qY = difY + 0.02 * vY; - moveMouse(qX, qY, 0, 0, 0, function() { - setTimeout(function() {clearToSend = true;}, 50); - }); - lastx = e.x; - lasty = e.y; - mttl = getTime(); - console.log("Dx: " + (qX) + " Dy: " + (qY)); - } - if (!e.b) { - // short press - if (getTime() - cttl < 0.2) { - clickMouse(MouseButton.LEFT); - console.log("click left"); + if (cttl == 0) { cttl = getTime(); } + if (trackPadMode) { + if (lastx + lasty == 0) { + lastx = e.x; + lasty = e.y; + mttl = getTime(); } - // longer press in center - else if (getTime() - cttl < 0.6 && e.x > g.getWidth()/4 && e.x < 3 * g.getWidth()/4 && e.y > g.getHeight() / 4 && e.y < 3 * g.getHeight() / 4) { - clickMouse(MouseButton.RIGHT); - console.log("click right"); + if (clearToSend) { + clearToSend = false; + let difX = e.x - lastx, difY = e.y - lasty; + let dT = getTime() - mttl; + let vX = difX / dT, vY = difY / dT; + //let qX = getSign(difX) * Math.pow(Math.abs(difX), 1.2); + //let qY = getSign(difY) * Math.pow(Math.abs(difY), 1.2); + let qX = difX + 0.02 * vX, qY = difY + 0.02 * vY; + moveMouse(qX, qY, 0, 0, 0, function() { + setTimeout(function() {clearToSend = true;}, 50); + }); + lastx = e.x; + lasty = e.y; + mttl = getTime(); + console.log("Dx: " + (qX) + " Dy: " + (qY)); } - cttl = 0; - lastx = 0; - lasty = 0; - } -} else { - if(!e.b){ - Bangle.buzz(100); - if(lasty > 40){ - doPPart(1); - E.showMessage('down'); - } else if(lasty < -40){ - doPPart(-1); - E.showMessage('up'); - } else if(lastx > 40){ - E.showMessage('right'); - //kb.tap(kb.KEY.RIGHT, 0); - scroll(-1); - } else if(lastx < -40){ - E.showMessage('left'); - //kb.tap(kb.KEY.LEFT, 0); - scroll(1); - } else if(lastx==0 && lasty==0 && holding == false){ - E.showMessage('press'); - clickMouse(MouseButton.LEFT); + if (!e.b) { + // short press + if (getTime() - cttl < 0.2) { + clickMouse(MouseButton.LEFT); + console.log("click left"); + } + // longer press in center + else if (getTime() - cttl < 0.6 && e.x > g.getWidth()/4 && e.x < 3 * g.getWidth()/4 && e.y > g.getHeight() / 4 && e.y < 3 * g.getHeight() / 4) { + clickMouse(MouseButton.RIGHT); + console.log("click right"); + } + cttl = 0; + lastx = 0; + lasty = 0; } - stopHolding(); - lastx = 0; - lasty = 0; - } else{ - lastx = lastx + e.dx; - lasty = lasty + e.dy; - if (timeoutHolding == -1) { - timeoutHolding = setTimeout(startHolding, 500); + } else { + if(!e.b){ + Bangle.buzz(100); + if(lasty > 40){ + doPPart(1); + E.showMessage('down'); + } else if(lasty < -40){ + doPPart(-1); + E.showMessage('up'); + } else if(lastx > 40){ + E.showMessage('right'); + //kb.tap(kb.KEY.RIGHT, 0); + scroll(-1); + } else if(lastx < -40){ + E.showMessage('left'); + //kb.tap(kb.KEY.LEFT, 0); + scroll(1); + } else if(lastx==0 && lasty==0 && holding == false){ + E.showMessage('press'); + clickMouse(MouseButton.LEFT); + } + stopHolding(); + lastx = 0; + lasty = 0; + } else{ + lastx = lastx + e.dx; + lasty = lasty + e.dy; + if (timeoutHolding == -1) { + timeoutHolding = setTimeout(startHolding, 500); + } } } -} }); function onBtn() { -if (trackPadMode) { - trackPadMode = false; - stopHolding(); - drawMain(); -} else { - clearToSend = true; - trackPadMode = true; - E.showMessage('Mouse'); -} -Bangle.buzz(); + if (trackPadMode) { + trackPadMode = false; + stopHolding(); + drawMain(); + } else { + clearToSend = true; + trackPadMode = true; + E.showMessage('Mouse'); + } + Bangle.buzz(); } setWatch(onBtn, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat: true});