forked from FOSS/BangleApps
fix time formatting
parent
602679c6bc
commit
10a50fdde2
|
@ -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});
|
||||
|
||||
|
|
Loading…
Reference in New Issue