Merge branch 'master' of github.com:espruino/BangleApps
|
|
@ -1,3 +1,4 @@
|
||||||
0.01: New App!
|
0.01: New App!
|
||||||
0.02: Fixed issue with wrong device informations
|
0.02: Fixed issue with wrong device informations
|
||||||
0.03: Ensure manufacturer:undefined doesn't overflow screen
|
0.03: Ensure manufacturer:undefined doesn't overflow screen
|
||||||
|
0.04: Set Bangle.js 2 compatible, show widgets
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ let menu = {
|
||||||
|
|
||||||
function showMainMenu() {
|
function showMainMenu() {
|
||||||
menu["< Back"] = () => load();
|
menu["< Back"] = () => load();
|
||||||
|
Bangle.drawWidgets();
|
||||||
return E.showMenu(menu);
|
return E.showMenu(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -55,5 +56,6 @@ function waitMessage() {
|
||||||
E.showMessage("scanning");
|
E.showMessage("scanning");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Bangle.loadWidgets();
|
||||||
scan();
|
scan();
|
||||||
waitMessage();
|
waitMessage();
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,11 @@
|
||||||
"id": "bledetect",
|
"id": "bledetect",
|
||||||
"name": "BLE Detector",
|
"name": "BLE Detector",
|
||||||
"shortName": "BLE Detector",
|
"shortName": "BLE Detector",
|
||||||
"version": "0.03",
|
"version": "0.04",
|
||||||
"description": "Detect BLE devices and show some informations.",
|
"description": "Detect BLE devices and show some informations.",
|
||||||
"icon": "bledetect.png",
|
"icon": "bledetect.png",
|
||||||
"tags": "app,bluetooth,tool",
|
"tags": "app,bluetooth,tool",
|
||||||
"supports": ["BANGLEJS"],
|
"supports": ["BANGLEJS", "BANGLEJS2"],
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
"storage": [
|
"storage": [
|
||||||
{"name":"bledetect.app.js","url":"bledetect.js"},
|
{"name":"bledetect.app.js","url":"bledetect.js"},
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,3 @@
|
||||||
0.01: New App!
|
0.01: New App!
|
||||||
0.02: Removed "wake LCD on face-up"-feature: A watch-face should not set things like "wake LCD on face-up".
|
0.02: Removed "wake LCD on face-up"-feature: A watch-face should not set things like "wake LCD on face-up".
|
||||||
|
0.03: Fix the clock for dark mode.
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ function draw_clock(){
|
||||||
// g.drawLine(clock_center.x - radius, clock_center.y, clock_center.x + radius, clock_center.y);
|
// g.drawLine(clock_center.x - radius, clock_center.y, clock_center.x + radius, clock_center.y);
|
||||||
// g.drawLine(clock_center.x, clock_center.y - radius, clock_center.x, clock_center.y + radius);
|
// g.drawLine(clock_center.x, clock_center.y - radius, clock_center.x, clock_center.y + radius);
|
||||||
|
|
||||||
g.setColor(g.theme.fg);
|
g.setColor(g.theme.dark ? g.theme.bg : g.theme.fg);
|
||||||
let ticks = [0, 90, 180, 270];
|
let ticks = [0, 90, 180, 270];
|
||||||
ticks.forEach((item)=>{
|
ticks.forEach((item)=>{
|
||||||
let agl = item+180;
|
let agl = item+180;
|
||||||
|
|
@ -92,13 +92,13 @@ function draw_clock(){
|
||||||
let minute_agl = minute_angle(date);
|
let minute_agl = minute_angle(date);
|
||||||
g.drawImage(hour_hand, hour_pos_x(hour_agl), hour_pos_y(hour_agl), {rotate:hour_agl*p180}); //
|
g.drawImage(hour_hand, hour_pos_x(hour_agl), hour_pos_y(hour_agl), {rotate:hour_agl*p180}); //
|
||||||
g.drawImage(minute_hand, minute_pos_x(minute_agl), minute_pos_y(minute_agl), {rotate:minute_agl*p180}); //
|
g.drawImage(minute_hand, minute_pos_x(minute_agl), minute_pos_y(minute_agl), {rotate:minute_agl*p180}); //
|
||||||
g.setColor(g.theme.fg);
|
g.setColor(g.theme.dark ? g.theme.bg : g.theme.fg);
|
||||||
g.fillCircle(clock_center.x, clock_center.y, 6);
|
g.fillCircle(clock_center.x, clock_center.y, 6);
|
||||||
g.setColor(g.theme.bg);
|
g.setColor(g.theme.dark ? g.theme.fg : g.theme.bg);
|
||||||
g.fillCircle(clock_center.x, clock_center.y, 3);
|
g.fillCircle(clock_center.x, clock_center.y, 3);
|
||||||
|
|
||||||
// draw minute ticks. Takes long time to draw!
|
// draw minute ticks. Takes long time to draw!
|
||||||
g.setColor(g.theme.fg);
|
g.setColor(g.theme.dark ? g.theme.bg : g.theme.fg);
|
||||||
for (var i=0; i<60; i++){
|
for (var i=0; i<60; i++){
|
||||||
let agl = i*6+180;
|
let agl = i*6+180;
|
||||||
g.drawImage(tick1.asImage(), rotate_around_x(big_wheel_x(i*6), agl, tick1), rotate_around_y(big_wheel_y(i*6), agl, tick1), {rotate:agl*p180});
|
g.drawImage(tick1.asImage(), rotate_around_x(big_wheel_x(i*6), agl, tick1), rotate_around_y(big_wheel_y(i*6), agl, tick1), {rotate:agl*p180});
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"id": "crowclk",
|
"id": "crowclk",
|
||||||
"name": "Crow Clock",
|
"name": "Crow Clock",
|
||||||
"version": "0.02",
|
"version": "0.03",
|
||||||
"description": "A simple clock based on Bold Clock that has MST3K's Crow T. Robot for a face",
|
"description": "A simple clock based on Bold Clock that has MST3K's Crow T. Robot for a face",
|
||||||
"icon": "crow_clock.png",
|
"icon": "crow_clock.png",
|
||||||
"screenshots": [{"url":"screenshot_crow.png"}],
|
"screenshots": [{"url":"screenshot_crow.png"}],
|
||||||
|
|
|
||||||
|
|
@ -8,3 +8,4 @@
|
||||||
0.08: Optimize line wrapping for Bangle 2
|
0.08: Optimize line wrapping for Bangle 2
|
||||||
0.09: fix the trasparent widget bar if there are no widgets for Bangle 2
|
0.09: fix the trasparent widget bar if there are no widgets for Bangle 2
|
||||||
0.10: added "one click exit" setting for Bangle 2
|
0.10: added "one click exit" setting for Bangle 2
|
||||||
|
0.11: Fix bangle.js 1 white icons not displaying
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ function draw_icon(p,n,selected) {
|
||||||
var x = (n%3)*80;
|
var x = (n%3)*80;
|
||||||
var y = n>2?130:40;
|
var y = n>2?130:40;
|
||||||
(selected?g.setColor(0.3,0.3,0.3):g.setColor(0,0,0)).fillRect(x,y,x+79,y+89);
|
(selected?g.setColor(0.3,0.3,0.3):g.setColor(0,0,0)).fillRect(x,y,x+79,y+89);
|
||||||
|
g.setColor(g.theme.fg);
|
||||||
g.drawImage(s.read(apps[p*6+n].icon),x+10,y+10,{scale:1.25});
|
g.drawImage(s.read(apps[p*6+n].icon),x+10,y+10,{scale:1.25});
|
||||||
g.setColor(-1).setFontAlign(0,-1,0).setFont("6x8",1);
|
g.setColor(-1).setFontAlign(0,-1,0).setFont("6x8",1);
|
||||||
var txt = apps[p*6+n].name.split(" ");
|
var txt = apps[p*6+n].name.split(" ");
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"id": "dtlaunch",
|
"id": "dtlaunch",
|
||||||
"name": "Desktop Launcher",
|
"name": "Desktop Launcher",
|
||||||
"version": "0.10",
|
"version": "0.11",
|
||||||
"description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.",
|
"description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.",
|
||||||
"screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}],
|
"screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}],
|
||||||
"icon": "icon.png",
|
"icon": "icon.png",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
0.01: Initial version
|
0.01: Initial version
|
||||||
0.02: Temporary intermediate version
|
0.02: Temporary intermediate version
|
||||||
0.03: Basic colors
|
0.03: Basic colors
|
||||||
0.04: Bug fix score reset after Game Over, new icon
|
0.04: Bug fix score reset after Game Over, new icon
|
||||||
|
0.05: Chevron marker on the randomly added square
|
||||||
|
|
@ -11,6 +11,8 @@ When two tiles with the same number are squashed together they will add up as ex
|
||||||
|
|
||||||
**3 + 3 = 4** or **C + C = D** which is a representation of **2^3 + 2^3 = 2^4 = 16**
|
**3 + 3 = 4** or **C + C = D** which is a representation of **2^3 + 2^3 = 2^4 = 16**
|
||||||
|
|
||||||
|
After each move a new tile will be added on a random empty square. The value can be 1 or 2, and will be marked with a chevron.
|
||||||
|
|
||||||
So you can continue till you reach **1024** which equals **2^(10)**. So when you reach tile **10** you have won.
|
So you can continue till you reach **1024** which equals **2^(10)**. So when you reach tile **10** you have won.
|
||||||
|
|
||||||
The score is maintained by adding the outcome of the sum of all pairs of squashed tiles (4+16+4+8 etc.)
|
The score is maintained by adding the outcome of the sum of all pairs of squashed tiles (4+16+4+8 etc.)
|
||||||
|
|
@ -27,5 +29,8 @@ Use the side **BTN** to exit the game, score and tile positions will be saved.
|
||||||
|
|
||||||
Game 1024 is based on Saming's 2048 and Misho M. Petkovic 1024game.org and conceptually similar to Threes by Asher Vollmer.
|
Game 1024 is based on Saming's 2048 and Misho M. Petkovic 1024game.org and conceptually similar to Threes by Asher Vollmer.
|
||||||
|
|
||||||

|
In Dark theme with numbers:
|
||||||

|

|
||||||
|
|
||||||
|
In Light theme with characters:
|
||||||
|

|
||||||
|
|
@ -17,7 +17,7 @@ const cellChars = [
|
||||||
const maxUndoLevels = 4;
|
const maxUndoLevels = 4;
|
||||||
const noExceptions = true;
|
const noExceptions = true;
|
||||||
let charIndex = 0; // plain numbers on the grid
|
let charIndex = 0; // plain numbers on the grid
|
||||||
|
const themeBg = g.theme.bg;
|
||||||
|
|
||||||
|
|
||||||
const scores = {
|
const scores = {
|
||||||
|
|
@ -304,13 +304,29 @@ class Cell {
|
||||||
this.previousExpVals=[];
|
this.previousExpVals=[];
|
||||||
this.idx = idx;
|
this.idx = idx;
|
||||||
this.cb = cb;
|
this.cb = cb;
|
||||||
|
this.isRndm = false;
|
||||||
|
this.ax = x0;
|
||||||
|
this.ay = Math.floor(0.2*width+y0);
|
||||||
|
this.bx = Math.floor(0.3*width+x0);
|
||||||
|
this.by = Math.floor(0.5*width+y0);
|
||||||
|
this.cx = x0;
|
||||||
|
this.cy = Math.floor(0.8*width+y0);
|
||||||
}
|
}
|
||||||
getColor(i) {
|
getColor(i) {
|
||||||
return cellColors[i >= cellColors.length ? cellColors.length -1 : i];
|
return cellColors[i >= cellColors.length ? cellColors.length -1 : i];
|
||||||
}
|
}
|
||||||
drawBg() {
|
drawBg() {
|
||||||
g.setColor(this.getColor(this.expVal).bg)
|
debug(()=>console.log("Drawbg!!"));
|
||||||
.fillRect(this.x0, this.y0, this.x1, this.y1);
|
if (this.isRndm == true) {
|
||||||
|
debug(()=>console.log('Random: (ax)', this.ax));
|
||||||
|
g.setColor(this.getColor(this.expVal).bg)
|
||||||
|
.fillRect(this.x0, this.y0, this.x1, this.y1)
|
||||||
|
.setColor(themeBg)
|
||||||
|
.fillPoly([this.cx,this.cy,this.bx,this.by,this.ax,this.ay]);
|
||||||
|
} else {
|
||||||
|
g.setColor(this.getColor(this.expVal).bg)
|
||||||
|
.fillRect(this.x0, this.y0, this.x1, this.y1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
drawNumber() {
|
drawNumber() {
|
||||||
if (this.expVal !== 0) {
|
if (this.expVal !== 0) {
|
||||||
|
|
@ -346,6 +362,19 @@ class Cell {
|
||||||
this.cb(this.expVal);
|
this.cb(this.expVal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
setRndmFalse() {
|
||||||
|
this.isRndm = false;
|
||||||
|
}
|
||||||
|
setRndmTrue() {
|
||||||
|
this.isRndm = true;
|
||||||
|
}
|
||||||
|
drawRndmIndicator(){
|
||||||
|
if (this.isRndm == true) {
|
||||||
|
debug(()=>console.log('Random: (ax)', this.ax));
|
||||||
|
g.setColor(this.getColor(0).bg)
|
||||||
|
.fillPoly(this.ax,this.ay,this.bx,this.by,this.cx,this.cy);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function undoGame() {
|
function undoGame() {
|
||||||
|
|
@ -387,11 +416,12 @@ function createGrid () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function messageGameOver () {
|
function messageGameOver () {
|
||||||
g.setColor("#1a0d00")
|
const c = (g.theme.dark) ? {"fg": "#FFFFFF", "bg": "#808080"} : {"fg": "#FF0000", "bg": "#000000"};
|
||||||
|
g.setColor(c.bg)
|
||||||
.setFont12x20(2).setFontAlign(0,0,0)
|
.setFont12x20(2).setFontAlign(0,0,0)
|
||||||
.drawString("G A M E", middle.x+13, middle.y-24)
|
.drawString("G A M E", middle.x+13, middle.y-24)
|
||||||
.drawString("O V E R !", middle.x+13, middle.y+24);
|
.drawString("O V E R !", middle.x+13, middle.y+24);
|
||||||
g.setColor("#ffffff")
|
g.setColor(c.fg)
|
||||||
.drawString("G A M E", middle.x+12, middle.y-25)
|
.drawString("G A M E", middle.x+12, middle.y-25)
|
||||||
.drawString("O V E R !", middle.x+12, middle.y+25);
|
.drawString("O V E R !", middle.x+12, middle.y+25);
|
||||||
}
|
}
|
||||||
|
|
@ -417,11 +447,13 @@ function addRandomNumber() {
|
||||||
if (emptySquaresIdxs.length > 0) {
|
if (emptySquaresIdxs.length > 0) {
|
||||||
let randomIdx = Math.floor( emptySquaresIdxs.length * Math.random() );
|
let randomIdx = Math.floor( emptySquaresIdxs.length * Math.random() );
|
||||||
allSquares[emptySquaresIdxs[randomIdx]].setExpVal(makeRandomNumber());
|
allSquares[emptySquaresIdxs[randomIdx]].setExpVal(makeRandomNumber());
|
||||||
|
allSquares[emptySquaresIdxs[randomIdx]].setRndmTrue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function drawGrid() {
|
function drawGrid() {
|
||||||
allSquares.forEach(sq => {
|
allSquares.forEach(sq => {
|
||||||
sq.drawBg();
|
sq.drawBg();
|
||||||
|
// sq.drawRndmIndicator();
|
||||||
sq.drawNumber();
|
sq.drawNumber();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -497,7 +529,7 @@ function handlePopUpClicks(btn) {
|
||||||
function resetGame() {
|
function resetGame() {
|
||||||
g.clear();
|
g.clear();
|
||||||
scores.reset();
|
scores.reset();
|
||||||
allSquares.forEach(sq => {sq.setExpVal(0);sq.removeUndo();});
|
allSquares.forEach(sq => {sq.setExpVal(0);sq.removeUndo();sq.setRndmFalse();});
|
||||||
addRandomNumber();
|
addRandomNumber();
|
||||||
addRandomNumber();
|
addRandomNumber();
|
||||||
drawGrid();
|
drawGrid();
|
||||||
|
|
@ -614,6 +646,7 @@ function runGame(dir){
|
||||||
mover.nonEmptyCells(dir);
|
mover.nonEmptyCells(dir);
|
||||||
mover.mergeEqlCells(dir);
|
mover.mergeEqlCells(dir);
|
||||||
mover.nonEmptyCells(dir);
|
mover.nonEmptyCells(dir);
|
||||||
|
allSquares.forEach(sq => {sq.setRndmFalse();});
|
||||||
addRandomNumber();
|
addRandomNumber();
|
||||||
drawGrid();
|
drawGrid();
|
||||||
scores.check();
|
scores.check();
|
||||||
|
|
|
||||||
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
|
@ -1,7 +1,7 @@
|
||||||
{ "id": "game1024",
|
{ "id": "game1024",
|
||||||
"name": "1024 Game",
|
"name": "1024 Game",
|
||||||
"shortName" : "1024 Game",
|
"shortName" : "1024 Game",
|
||||||
"version": "0.04",
|
"version": "0.05",
|
||||||
"icon": "game1024.png",
|
"icon": "game1024.png",
|
||||||
"screenshots": [ {"url":"screenshot.png" } ],
|
"screenshots": [ {"url":"screenshot.png" } ],
|
||||||
"readme":"README.md",
|
"readme":"README.md",
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
|
@ -1 +1,2 @@
|
||||||
0.01: New App!
|
0.01: New App!
|
||||||
|
0.02: Make Bangle.js 2 compatible
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,86 @@
|
||||||
var storage = require('Storage');
|
const storage = require('Storage');
|
||||||
|
const Layout = require("Layout");
|
||||||
const settings = storage.readJSON('setting.json',1) || { HID: false };
|
const settings = storage.readJSON('setting.json',1) || { HID: false };
|
||||||
|
const BANGLEJS2 = process.env.HWVERSION == 2;
|
||||||
|
const sidebarWidth=18;
|
||||||
|
const buttonWidth = (Bangle.appRect.w-sidebarWidth)/2;
|
||||||
|
const buttonHeight = (Bangle.appRect.h-16)/2*0.85; // subtract text row and add a safety margin
|
||||||
|
|
||||||
var sendInProgress = false; // Only send one message at a time, do not flood
|
var sendInProgress = false; // Only send one message at a time, do not flood
|
||||||
|
var touchBtn2 = 0;
|
||||||
|
var touchBtn3 = 0;
|
||||||
|
var touchBtn4 = 0;
|
||||||
|
var touchBtn5 = 0;
|
||||||
|
|
||||||
|
function renderBtnArrows(l) {
|
||||||
|
const d = g.getWidth() - l.width;
|
||||||
|
|
||||||
|
function c(a) {
|
||||||
|
return {
|
||||||
|
width: 8,
|
||||||
|
height: a.length,
|
||||||
|
bpp: 1,
|
||||||
|
buffer: (new Uint8Array(a)).buffer
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
g.drawImage(c([0,8,12,14,255,14,12,8]),d,g.getHeight()/2);
|
||||||
|
if (!BANGLEJS2) {
|
||||||
|
g.drawImage(c([16,56,124,254,16,16,16,16]),d,40);
|
||||||
|
g.drawImage(c([16,16,16,16,254,124,56,16]),d,194);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const layoutChilden = [];
|
||||||
|
if (BANGLEJS2) { // add virtual buttons in display
|
||||||
|
layoutChilden.push({type:"h", c:[
|
||||||
|
{type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN2", id:"touchBtn2" },
|
||||||
|
{type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN3", id:"touchBtn3" },
|
||||||
|
]});
|
||||||
|
}
|
||||||
|
layoutChilden.push({type:"h", c:[
|
||||||
|
{type:"txt", font:"6x8:2", label:"Joystick" },
|
||||||
|
]});
|
||||||
|
if (BANGLEJS2) { // add virtual buttons in display
|
||||||
|
layoutChilden.push({type:"h", c:[
|
||||||
|
{type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN4", id:"touchBtn4" },
|
||||||
|
{type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN5", id:"touchBtn5" },
|
||||||
|
]});
|
||||||
|
}
|
||||||
|
|
||||||
|
const layout = new Layout(
|
||||||
|
{type:"h", c:[
|
||||||
|
{type:"v", width:Bangle.appRect.w-sidebarWidth, c: layoutChilden},
|
||||||
|
{type:"custom", width:18, height: Bangle.appRect.h, render:renderBtnArrows }
|
||||||
|
]}
|
||||||
|
);
|
||||||
|
|
||||||
|
function isInBox(box, x, y) {
|
||||||
|
return x >= box.x && x < box.x+box.w && y >= box.y && y < box.y+box.h;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BANGLEJS2) {
|
||||||
|
Bangle.on('drag', function(event) {
|
||||||
|
if (event.b == 0) { // release
|
||||||
|
touchBtn2 = touchBtn3 = touchBtn4 = touchBtn5 = 0;
|
||||||
|
} else if (isInBox(layout.touchBtn2, event.x, event.y)) {
|
||||||
|
touchBtn2 = 1;
|
||||||
|
touchBtn3 = touchBtn4 = touchBtn5 = 0;
|
||||||
|
} else if (isInBox(layout.touchBtn3, event.x, event.y)) {
|
||||||
|
touchBtn3 = 1;
|
||||||
|
touchBtn2 = touchBtn4 = touchBtn5 = 0;
|
||||||
|
} else if (isInBox(layout.touchBtn4, event.x, event.y)) {
|
||||||
|
touchBtn4 = 1;
|
||||||
|
touchBtn2 = touchBtn3 = touchBtn5 = 0;
|
||||||
|
} else if (isInBox(layout.touchBtn5, event.x, event.y)) {
|
||||||
|
touchBtn5 = 1;
|
||||||
|
touchBtn2 = touchBtn3 = touchBtn4 = 0;
|
||||||
|
} else {
|
||||||
|
// outside any buttons, release all
|
||||||
|
touchBtn2 = touchBtn3 = touchBtn4 = touchBtn5 = 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const sendHid = function (x, y, btn1, btn2, btn3, btn4, btn5, cb) {
|
const sendHid = function (x, y, btn1, btn2, btn3, btn4, btn5, cb) {
|
||||||
try {
|
try {
|
||||||
|
|
@ -20,31 +99,17 @@ const sendHid = function (x, y, btn1, btn2, btn3, btn4, btn5, cb) {
|
||||||
|
|
||||||
function drawApp() {
|
function drawApp() {
|
||||||
g.clear();
|
g.clear();
|
||||||
g.setFont("6x8",2);
|
Bangle.loadWidgets();
|
||||||
g.setFontAlign(0,0);
|
Bangle.drawWidgets();
|
||||||
g.drawString("Joystick", 120, 120);
|
layout.render();
|
||||||
const d = g.getWidth() - 18;
|
|
||||||
|
|
||||||
function c(a) {
|
|
||||||
return {
|
|
||||||
width: 8,
|
|
||||||
height: a.length,
|
|
||||||
bpp: 1,
|
|
||||||
buffer: (new Uint8Array(a)).buffer
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
g.drawImage(c([16,56,124,254,16,16,16,16]),d,40);
|
|
||||||
g.drawImage(c([16,16,16,16,254,124,56,16]),d,194);
|
|
||||||
g.drawImage(c([0,8,12,14,255,14,12,8]),d,116);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
const btn1 = BTN1.read();
|
const btn1 = BTN1 ? BTN1.read() : 0;
|
||||||
const btn2 = BTN2.read();
|
const btn2 = !BANGLEJS2 ? BTN2.read() : touchBtn2;
|
||||||
const btn3 = BTN3.read();
|
const btn3 = !BANGLEJS2 ? BTN3.read() : touchBtn3;
|
||||||
const btn4 = BTN4.read();
|
const btn4 = !BANGLEJS2 ? BTN4.read() : touchBtn4;
|
||||||
const btn5 = BTN5.read();
|
const btn5 = !BANGLEJS2 ? BTN5.read() : touchBtn5;
|
||||||
const acc = Bangle.getAccel();
|
const acc = Bangle.getAccel();
|
||||||
var x = acc.x*-127;
|
var x = acc.x*-127;
|
||||||
var y = acc.y*-127;
|
var y = acc.y*-127;
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,11 @@
|
||||||
"id": "hidjoystick",
|
"id": "hidjoystick",
|
||||||
"name": "Bluetooth Joystick",
|
"name": "Bluetooth Joystick",
|
||||||
"shortName": "Joystick",
|
"shortName": "Joystick",
|
||||||
"version": "0.01",
|
"version": "0.02",
|
||||||
"description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5.",
|
"description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5. On Bangle.js 2 buttons 2-5 are emulated with the touchscreen.",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"tags": "bluetooth",
|
"tags": "bluetooth",
|
||||||
"supports": ["BANGLEJS"],
|
"supports": ["BANGLEJS", "BANGLEJS2"],
|
||||||
"storage": [
|
"storage": [
|
||||||
{"name":"hidjoystick.app.js","url":"app.js"},
|
{"name":"hidjoystick.app.js","url":"app.js"},
|
||||||
{"name":"hidjoystick.img","url":"app-icon.js","evaluate":true}
|
{"name":"hidjoystick.img","url":"app-icon.js","evaluate":true}
|
||||||
|
|
|
||||||
|
|
@ -1 +1,2 @@
|
||||||
0.01: First release
|
0.01: First release
|
||||||
|
0.02: Make sure to reset turns
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
"name": "Classic Mind Game",
|
"name": "Classic Mind Game",
|
||||||
"shortName":"Master Mind",
|
"shortName":"Master Mind",
|
||||||
"icon": "mmind.png",
|
"icon": "mmind.png",
|
||||||
"version":"0.01",
|
"version":"0.02",
|
||||||
"description": "This is the classic game for masterminds",
|
"description": "This is the classic game for masterminds",
|
||||||
"screenshots": [{"url":"screenshot_mmind.png"}],
|
"screenshots": [{"url":"screenshot_mmind.png"}],
|
||||||
"type": "app",
|
"type": "app",
|
||||||
|
|
|
||||||
|
|
@ -172,6 +172,7 @@ Bangle.on('touch', function(zone,e) {
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
//new game
|
//new game
|
||||||
|
turn = 0;
|
||||||
play = [-1,-1,-1,-1];
|
play = [-1,-1,-1,-1];
|
||||||
game = [];
|
game = [];
|
||||||
endgame=false;
|
endgame=false;
|
||||||
|
|
@ -189,10 +190,3 @@ Bangle.on('touch', function(zone,e) {
|
||||||
game = [];
|
game = [];
|
||||||
get_secret();
|
get_secret();
|
||||||
draw();
|
draw();
|
||||||
//Bangle.loadWidgets();
|
|
||||||
//Bangle.drawWidgets();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,11 +29,11 @@ function calc_ess(val) {
|
||||||
if (nonmot) {
|
if (nonmot) {
|
||||||
slsnds+=1;
|
slsnds+=1;
|
||||||
if (slsnds >= sleepthresh) {
|
if (slsnds >= sleepthresh) {
|
||||||
return true; // awake
|
return true; // sleep
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
slsnds=0;
|
slsnds=0;
|
||||||
return false; // sleep
|
return false; // awake
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
0.01: Initial version
|
0.01: Initial version
|
||||||
0.02: Add battery level
|
0.02: Add battery level
|
||||||
0.03: Fix battery display when full
|
0.03: Fix battery display when full (incorporating code by Ronin0000)
|
||||||
0.04: Add support for settings
|
0.04: Add support for settings
|
||||||
|
0.05: Add ability to change background (3bit or 4bit)
|
||||||
|
0.06: Replace battery text with image
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,16 @@ Just a simple watch face for the Banglejs2.
|
||||||
|
|
||||||
It shows battery level in the upper left corner, date information in the upper right, and time information in the bottom.
|
It shows battery level in the upper left corner, date information in the upper right, and time information in the bottom.
|
||||||
|
|
||||||

|

|
||||||
|

|
||||||
|
|
||||||
## Settings
|
## Settings
|
||||||
|
|
||||||
**Analog Clock:**
|
**Analog Clock:** *Not yet implemented.*
|
||||||
|
|
||||||
**Human Readable Date:** When the setting is on, the date is shown in a more human-friendly format (e.g. "Oct 2"), otherwise the date is shown in a standard format (e.g. "02/10"). Default is off.
|
**Background:** When the setting is set as "3bit", a background with more accurate colors is chosen for the watchface. Otherwise, it uses a background following the 16-bit Mac Color Palette.
|
||||||
|
|
||||||
|
**Date Format:** When the setting is set as "Long", the date is shown in a more human-friendly format (e.g. "Oct 2"), otherwise the date is shown in a standard format (e.g. "02/10"). Default is off.
|
||||||
|
|
||||||
**Show Week Info:** When the setting is on, the weekday and week number are shown in the upper right box. When the setting is off, the full year is shown instead. Default is off.
|
**Show Week Info:** When the setting is on, the weekday and week number are shown in the upper right box. When the setting is off, the full year is shown instead. Default is off.
|
||||||
|
|
||||||
|
|
@ -20,4 +23,4 @@ It shows battery level in the upper left corner, date information in the upper r
|
||||||
|
|
||||||
Monogram Watch Face can be selected as the default clock or it can be run manually from the launcher. Its settings can be accessed and changed via the relevant menu.
|
Monogram Watch Face can be selected as the default clock or it can be run manually from the launcher. Its settings can be accessed and changed via the relevant menu.
|
||||||
|
|
||||||
Tapping on the "Alerts" area will replace the current time display with the time of the most immediate alert.
|
*Tapping on the "Alerts" area will replace the current time display with the time of the most immediate alert.* - *Feature not implemented yet.*
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,23 @@
|
||||||
const SETTINGSFILE = "smclock.json";
|
const SETTINGSFILE = "smclock.json";
|
||||||
const background = {
|
const image3bit = {
|
||||||
width: 176,
|
width : 176, height : 176, bpp : 3,
|
||||||
height: 176,
|
transparent : 1,
|
||||||
bpp: 3,
|
buffer : require("heatshrink").decompress(atob("/4A/AH4AC23btoCct/pkmSpICcIP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5Bp/4A/AH4AC/kAAH0/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5BpA="))
|
||||||
transparent: 1,
|
};
|
||||||
buffer: require("heatshrink").decompress(
|
const image4bit = {
|
||||||
atob(
|
width : 176, height : 176, bpp : 4,
|
||||||
"/4A/AH4ACUb8H9MkyVJAThB/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/INP/AH4A/AAX8Yz4Afn5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/INI="
|
transparent : 1,
|
||||||
)
|
buffer : require("heatshrink").decompress(atob("/4A/AH4Au1QAp1/2swApK/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K+//AH4A/AF8AAH4AUK/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/AA=="))
|
||||||
),
|
|
||||||
};
|
};
|
||||||
const monthName = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
|
const monthName = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
|
||||||
const weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
const weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
||||||
|
|
||||||
// dynamic variables
|
// dynamic variables
|
||||||
var batLevel = -1;
|
var batLevel = -1;
|
||||||
var batColor = [0, 0, 0];
|
var batColor = "";
|
||||||
|
|
||||||
// settings variables
|
// settings variables
|
||||||
|
var backgroundImage;
|
||||||
var dateFormat;
|
var dateFormat;
|
||||||
var drawInterval;
|
var drawInterval;
|
||||||
var pollInterval;
|
var pollInterval;
|
||||||
|
|
@ -31,6 +31,7 @@ function loadSettings() {
|
||||||
function def(value, def) {return value !== undefined ? value : def;}
|
function def(value, def) {return value !== undefined ? value : def;}
|
||||||
var settings = require("Storage").readJSON(SETTINGSFILE, true) || {};
|
var settings = require("Storage").readJSON(SETTINGSFILE, true) || {};
|
||||||
|
|
||||||
|
backgroundImage = def(settings.backgroundImage, "3bit");
|
||||||
dateFormat = def(settings.dateFormat, "Short");
|
dateFormat = def(settings.dateFormat, "Short");
|
||||||
drawInterval = def(settings.drawInterval, 10);
|
drawInterval = def(settings.drawInterval, 10);
|
||||||
pollInterval = def(settings.pollInterval, 60);
|
pollInterval = def(settings.pollInterval, 60);
|
||||||
|
|
@ -67,23 +68,29 @@ function getBatteryColor(level) {
|
||||||
level = batLevel;
|
level = batLevel;
|
||||||
}
|
}
|
||||||
if (level > 80) {
|
if (level > 80) {
|
||||||
color = [0, 0, 1];
|
color = "#00f";
|
||||||
} else if (level > 60) {
|
} else if (level > 60) {
|
||||||
color = [0, 1, 1];
|
color = "#0ff";
|
||||||
} else if (level > 40) {
|
} else if (level > 40) {
|
||||||
color = [0, 1, 0];
|
color = "#0f0";
|
||||||
} else if (level > 20) {
|
} else if (level > 20) {
|
||||||
color = [1, 1, 0];
|
color = "#f40";
|
||||||
} else {
|
} else {
|
||||||
color = [1, 0, 0];
|
color = "f00";
|
||||||
}
|
}
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
|
||||||
function draw() {
|
function draw() {
|
||||||
|
var background;
|
||||||
|
if (backgroundImage == "3bit") {
|
||||||
|
background = image3bit;
|
||||||
|
} else {
|
||||||
|
background = image4bit;
|
||||||
|
}
|
||||||
g.drawImage(background);
|
g.drawImage(background);
|
||||||
|
|
||||||
const color = getBatteryColor(batLevel);
|
batColor = getBatteryColor(batLevel);
|
||||||
var bat = "";
|
var bat = "";
|
||||||
const d = new Date();
|
const d = new Date();
|
||||||
const day = d.getDate();
|
const day = d.getDate();
|
||||||
|
|
@ -95,32 +102,38 @@ function draw() {
|
||||||
const m = d.getMinutes();
|
const m = d.getMinutes();
|
||||||
const time = d02(h) + ":" + d02(m);
|
const time = d02(h) + ":" + d02(m);
|
||||||
|
|
||||||
if (E.getBattery() < 100) {
|
|
||||||
bat = d02(E.getBattery()) + "%";
|
|
||||||
} else {
|
|
||||||
bat = E.getBattery() + "%";
|
|
||||||
}
|
|
||||||
|
|
||||||
g.reset();
|
g.reset();
|
||||||
|
|
||||||
// draw battery info
|
// draw battery info
|
||||||
g.setColor(1, 1, 1);
|
var x = 12;
|
||||||
|
var y = 16;
|
||||||
|
if (Bangle.isCharging()) {
|
||||||
|
g.setColor("#ff0").drawImage(atob("DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y);
|
||||||
|
} else {
|
||||||
|
g.clearRect(x,y,x+14,y+24);
|
||||||
|
g.setColor("#000").fillRect(x+2,y+2,x+12,y+22).clearRect(x+4,y+4,x+10,y+20).fillRect(x+5,y+1,x+9,y+2);
|
||||||
|
g.setColor(batColor).fillRect(x+4,y+20-(batLevel*16/100),x+10,y+20);
|
||||||
|
}
|
||||||
|
if (Bangle.isCharging()) {
|
||||||
|
g.setColor("#ff0");
|
||||||
|
} else {
|
||||||
|
g.setColor(batColor);
|
||||||
|
}
|
||||||
if (useVectorFont == true) {
|
if (useVectorFont == true) {
|
||||||
g.setFont("Vector", 16);
|
g.setFont("Vector", 16);
|
||||||
g.drawString("Bat:", 12, 22, false);
|
|
||||||
} else {
|
} else {
|
||||||
g.setFont("4x6", 2);
|
g.setFont("4x6", 3);
|
||||||
g.drawString("Bat:", 10, 22, false);
|
|
||||||
}
|
}
|
||||||
g.setColor(color[0], color[1], color[2]);
|
|
||||||
if (batLevel < 100) {
|
if (batLevel < 100) {
|
||||||
g.drawString(bat, 52, 22, false);
|
bat = d02(batLevel) + "%";
|
||||||
|
g.drawString(bat, 50, 22, false);
|
||||||
} else {
|
} else {
|
||||||
g.drawString(bat, 46, 22, false);
|
bat = "100%";
|
||||||
|
g.drawString(bat, 40, 22, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// draw date info
|
// draw date info
|
||||||
g.setColor(0, 0, 0);
|
g.setColor("#000");
|
||||||
if (useVectorFont == true) {
|
if (useVectorFont == true) {
|
||||||
g.setFont("Vector", 20);
|
g.setFont("Vector", 20);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -136,7 +149,7 @@ function draw() {
|
||||||
|
|
||||||
// draw week info
|
// draw week info
|
||||||
if (showWeekInfo == true) {
|
if (showWeekInfo == true) {
|
||||||
date2 = weekday[d.getDay()] + " " + d02(week)
|
date2 = weekday[d.getDay()] + " " + d02(week);
|
||||||
if (useVectorFont == true) {
|
if (useVectorFont == true) {
|
||||||
g.setFont("Vector", 18);
|
g.setFont("Vector", 18);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -155,7 +168,7 @@ function draw() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// draw time
|
// draw time
|
||||||
g.setColor(1, 1, 1);
|
g.setColor("#fff");
|
||||||
if (useVectorFont == true) {
|
if (useVectorFont == true) {
|
||||||
g.setFont("Vector", 60);
|
g.setFont("Vector", 60);
|
||||||
g.drawString(time, 10, 108, false);
|
g.drawString(time, 10, 108, false);
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,13 @@
|
||||||
"name": "Monogram Watch Face",
|
"name": "Monogram Watch Face",
|
||||||
"shortName": "MonoClock",
|
"shortName": "MonoClock",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"screenshots": [{ "url": "screenshot.png" }],
|
"screenshots": [{ "url": "screenshot0.png" }, {"url": "screenshot1.png" }],
|
||||||
"version": "0.04",
|
"version": "0.04",
|
||||||
"description": "A simple watchface based on my stylised monogram.",
|
"description": "A simple watchface based on my stylised monogram.",
|
||||||
"type": "clock",
|
"type": "clock",
|
||||||
"tags": "clock",
|
"tags": "clock",
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
"supports": ["BANGLEJS", "BANGLEJS2"],
|
"supports": ["BANGLEJS2"],
|
||||||
"allow_emulator": true,
|
"allow_emulator": true,
|
||||||
"storage": [
|
"storage": [
|
||||||
{ "name": "smclock.app.js", "url": "app.js" },
|
{ "name": "smclock.app.js", "url": "app.js" },
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
|
@ -52,6 +52,7 @@
|
||||||
writeSettings();
|
writeSettings();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"Background": stringInSettings("backgroundImage", ["3bit", "4bit"]),
|
||||||
Date: stringInSettings("dateFormat", ["Long", "Short"]),
|
Date: stringInSettings("dateFormat", ["Long", "Short"]),
|
||||||
"Draw Interval": {
|
"Draw Interval": {
|
||||||
value: settings.drawInterval,
|
value: settings.drawInterval,
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,3 @@
|
||||||
0.01: New App!
|
0.01: New App!
|
||||||
0.02: Rename "Activity" in "Motion" and display the true values for it
|
0.02: Rename "Activity" in "Motion" and display the true values for it
|
||||||
|
0.03: Add Banglejs 1 compatibility
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,28 @@
|
||||||
var locale = require("locale");
|
var locale = require("locale");
|
||||||
var fontColor = g.theme.dark ? "#0f0" : "#000";
|
var fontColor = g.theme.dark ? "#0f0" : "#000";
|
||||||
var paddingY = 2;
|
|
||||||
var font6x8At4Size = 32;
|
|
||||||
var font6x8At2Size = 18;
|
|
||||||
var heartRate = 0;
|
var heartRate = 0;
|
||||||
|
|
||||||
|
// handling the differents versions of the Banglejs smartwatch
|
||||||
|
if (process.env.HWVERSION == 1){
|
||||||
|
var paddingY = 3;
|
||||||
|
var font6x8At4Size = 48;
|
||||||
|
var font6x8At2Size = 27;
|
||||||
|
var font6x8FirstTextSize = 6;
|
||||||
|
var font6x8DefaultTextSize = 3;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
var paddingY = 2;
|
||||||
|
var font6x8At4Size = 32;
|
||||||
|
var font6x8At2Size = 18;
|
||||||
|
var font6x8FirstTextSize = 4;
|
||||||
|
var font6x8DefaultTextSize = 2;
|
||||||
|
}
|
||||||
|
|
||||||
function setFontSize(pos){
|
function setFontSize(pos){
|
||||||
if(pos == 1)
|
if(pos == 1)
|
||||||
g.setFont("6x8", 4);
|
g.setFont("6x8", font6x8FirstTextSize);
|
||||||
else
|
else
|
||||||
g.setFont("6x8", 2);
|
g.setFont("6x8", font6x8DefaultTextSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearField(pos){
|
function clearField(pos){
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,12 @@
|
||||||
"name": "Terminal Clock",
|
"name": "Terminal Clock",
|
||||||
"shortName":"Terminal Clock",
|
"shortName":"Terminal Clock",
|
||||||
"description": "A terminal cli like clock displaying multiple sensor data",
|
"description": "A terminal cli like clock displaying multiple sensor data",
|
||||||
"version":"0.02",
|
"version":"0.03",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"type": "clock",
|
"type": "clock",
|
||||||
"tags": "clock",
|
"tags": "clock",
|
||||||
"supports": ["BANGLEJS2"],
|
"supports": ["BANGLEJS", "BANGLEJS2"],
|
||||||
|
"allow_emulator": true,
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
"storage": [
|
"storage": [
|
||||||
{"name": "terminalclock.app.js","url": "app.js"},
|
{"name": "terminalclock.app.js","url": "app.js"},
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,3 @@
|
||||||
0.01: Initial creation of the touch timer app
|
0.01: Initial creation of the touch timer app
|
||||||
0.02: Add settings menu
|
0.02: Add settings menu
|
||||||
|
0.03: Add ability to repeat last timer
|
||||||
|
|
|
||||||
|
|
@ -141,6 +141,13 @@ var main = () => {
|
||||||
if (buzzCount >= settings.buzzCount) {
|
if (buzzCount >= settings.buzzCount) {
|
||||||
clearInterval(buzzIntervalId);
|
clearInterval(buzzIntervalId);
|
||||||
buzzIntervalId = undefined;
|
buzzIntervalId = undefined;
|
||||||
|
|
||||||
|
buttonStartPause.value = "REPEAT";
|
||||||
|
buttonStartPause.draw();
|
||||||
|
buttonStartPause.value = "START";
|
||||||
|
timerCountDown = undefined;
|
||||||
|
timerEdit.draw();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
Bangle.buzz(settings.buzzDuration * 1000, 1);
|
Bangle.buzz(settings.buzzDuration * 1000, 1);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
"id": "touchtimer",
|
"id": "touchtimer",
|
||||||
"name": "Touch Timer",
|
"name": "Touch Timer",
|
||||||
"shortName": "Touch Timer",
|
"shortName": "Touch Timer",
|
||||||
"version": "0.02",
|
"version": "0.03",
|
||||||
"description": "Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad.",
|
"description": "Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad.",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"tags": "tools",
|
"tags": "tools",
|
||||||
|
|
|
||||||