1
0
Fork 0

Merge branch 'espruino:master' into master

master
pinq- 2023-04-10 21:31:17 +03:00 committed by GitHub
commit 0a4faec632
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 380 additions and 7 deletions

View File

@ -1 +1 @@
require("heatshrink").decompress(atob("j0ewkBiIAxHIQMJiBJEIxAaCAIQfHDgIUFDwwNCHYgVFiAVBHYgIDEghKCCIQGCFYoaDAYgORGIJ2DBwYIBHgQOPgAOIPIYOGAgQOFFgh7DHZQeDBwhoFQgh3JEAgOFFoqkHYRzgOfx4bCJ4gNGSIaJEABA7EAGA"))
require("heatshrink").decompress(atob("mEwwMB/4AFgYCB4H//kAAoMAn/w+IFBx8P8fjAoPH4/n4/gg/j8/Px4rB+Pz58ch/wnHzz0wv/+hl5zlhDoOGnOY44FB8cZyOP/1/+OJwcfAoP44OGn4FB/lh5giBAIMz7n/AoP/nf4Aocf/IFDz5YBAoWP+YFD54FFMgIFD84FD84FM/0AApKfDApiaCAAJBCApKyCWgRlBAAWfOIIACj/8Aoc//g/BJ4KTBn4FBBIUfAoIbCx4CBFoUHAQPgDIMhAoOEV4NwVgMOn/4/jdBn8fDILpBUIfwh5TBIAYABA="))

View File

@ -0,0 +1,3 @@
0.01: New face :)
0.02: code improvements
0.03: code improvments to queuedraw and draw

View File

@ -0,0 +1,18 @@
# Encouragement & Positivity Clock
Tap on the watch for a note of encouragement
## Features
Pretty backgrounds
<img width="181" alt="Screenshot 2023-03-28-2" src="https://user-images.githubusercontent.com/44651387/228306964-be0b1d46-aee7-4562-9953-4e461954d41b.png">
<img width="181" alt="Screenshot 2023-03-28-1" src="https://user-images.githubusercontent.com/44651387/228306967-768e0315-8652-4043-9c98-ebf0c72fd2a4.png">
## Requests
If you have any issues or would like to suggest an encouraging note, please tweet me!
## Creator
[Eleanor Tayam](http://twitter.com/elykittytee)

View File

@ -0,0 +1 @@
require("heatshrink").decompress(atob("mEwwMB/4AFgYCB4H//kAAoMAn/w+IFBx8P8fjAoPH4/n4/gg/j8/Px4rB+Pz58ch/wnHzz0wv/+hl5zlhDoOGnOY44FB8cZyOP/1/+OJwcfAoP44OGn4FB/lh5giBAIMz7n/AoP/nf4Aocf/IFDz5YBAoWP+YFD54FFMgIFD84FD84FM/0AApKfDApiaCAAJBCApKyCWgRlBAAWfOIIACj/8Aoc//g/BJ4KTBn4FBBIUfAoIbCx4CBFoUHAQPgDIMhAoOEV4NwVgMOn/4/jdBn8fDILpBUIfwh5TBIAYABA="))

73
apps/encourageclk/app.js Normal file

File diff suppressed because one or more lines are too long

BIN
apps/encourageclk/app.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1,17 @@
{
"id": "encourageclk",
"name": "Encouragement & Positivity Clock",
"shortName":"Encouragement Clock",
"version": "0.03",
"description": "Tap on the watch for a note of encouragement",
"icon": "app.png",
"type": "clock",
"tags": "clock",
"supports": ["BANGLEJS2"],
"allow_emulator": true,
"readme":"README.md",
"storage": [
{"name":"encourageclk.app.js","url":"app.js"},
{"name":"encourageclk.img","url":"app-icon.js","evaluate":true}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -46,7 +46,6 @@
var $name = document.getElementById('add_product_name')
var $form = document.getElementById('add_product_form')
var $button = document.getElementById('add_product_button')
var $quantity = document.getElementById('add_product_quantity')
var $list = document.getElementById('products')
var $reset = document.getElementById('reset')
@ -68,7 +67,8 @@
ok: false
})
renderProducts()
renderProducts();
window.scrollTo(0, document.body.scrollHeight);
$name.value = ''
$quantity.value = 1
})

View File

@ -0,0 +1 @@
0.01: New App!

View File

@ -0,0 +1,17 @@
# Long Press, Buzz!
Buzz at boot after a long press to indicate the watch was reinitiated at your command.
To infinity and beyond, space ranger!
## Usage
Just install and it will run as boot code.
## Requests
Mention @[thyttan](https://github.com/thyttan) in an issue to the official [BangleApps repository](https://github.com/espruino/BangleApps/issues) for feature requests and bug reports.
## Creators
[thyttan](https://github.com/thyttan) and [Gordon Williams](https://github.com/gfwilliams).

BIN
apps/longpressbuzz/app.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1 @@
if (BTN.read()) Bangle.buzz(80,0.40);

View File

@ -0,0 +1,14 @@
{ "id": "longpressbuzz",
"name": "Long Press, Buzz!",
"shortName":"LPB",
"version":"0.01",
"description": "Buzz at boot after a long press to indicate the watch was reinitiated at your command.",
"icon": "app.png",
"type": "bootloader",
"tags": "system",
"supports" : ["BANGLEJS2"],
"readme": "README.md",
"storage": [
{"name":"longpressbuzz.0.boot.js","url":"boot.js"}
]
}

View File

@ -1,2 +1,4 @@
0.01: Inital release.
0.02: Rebasing on latest changes to showScroller_Q3 (https://github.com/espruino/Espruino/commit/2d3c34ef7c2b9fe2118e816aacd2e096adb99596).
0.03: Rebasing on latest changes to showScroller_Q3 (https://github.com/espruino/Espruino/commit/b6f8105b6348bb6f7cd03ac11efc1f3585c6ad79). Ensure that changing a menu item when half-scrolled off screen doesn't overwrite widgets.

View File

@ -95,7 +95,7 @@ var s = {
g.setClipRect(0,0,g.getWidth()-1,g.getHeight()-1);
}, drawItem : i => {
var y = idxToY(i);
g.reset().setClipRect(R.x,y,R.x2,y+options.h);
g.reset().setClipRect(R.x,Math.max(y,R.y),R.x2,Math.min(y+options.h,R.y2));
options.draw(i, {x:R.x,y:y,w:R.w,h:options.h});
g.setClipRect(0,0,g.getWidth()-1,g.getHeight()-1);
}};

View File

@ -1,7 +1,7 @@
{
"id": "swscroll",
"name": "Swipe menus",
"version": "0.02",
"version": "0.03",
"description": "Replace built in E.showScroller to act on swipe instead of drag. Navigate menus in discrete steps instead of a continuous motion.",
"readme": "README.md",
"icon": "app.png",

2
apps/tinycmc/ChangeLog Normal file
View File

@ -0,0 +1,2 @@
0.01: New App
0.02: Set API Key through Apploader

7
apps/tinycmc/README.md Normal file
View File

@ -0,0 +1,7 @@
# Tiny Coinmarketcap
A simple app using Gadgedtbridge internet access to fetch current crypto prices from Coinmarketcap.
I'm providing a "free-tier" API Key.
TO-DOs:
- [X] Add own API Key option
- [ ] Add settings for Currency conversion

1
apps/tinycmc/app-icon.js Normal file
View File

@ -0,0 +1 @@
require("heatshrink").decompress(atob("mEw4kA/4ACBIP/o8242462/k8/gtytlz1s+r2/gv/q9Zpv/m+02pj/AH4AqgMRBhURAAQWGqPxqPwA4UoloABkoLCAIQhIiMQgUo29mtfr6WIBogxDFwNBAIeKwd8x2Mud8lUhBolQLoYABrERjurs/S7F329rs+i+I+EC4JRFxl+lUmvmGAIWKkJhGJ4lI01y2+3s4BB1s7s+o+MVMAhPEll7kd+uYBCvgBB7khyIRCL4cZiMS7YuCAAxnBSAsBJoWKl0sLYYBFluBL4iPCiuNsRdEAIlr3GBR4iQBJoMs7pdEAIjDBkK/ESAUY665BABNn7AvFkWBlEsXYoBFMAMlkPwC4UYRwOru5ZDMY+iitBF4MoPAOBxsjXoktAYMoYYcowOBwEokAXBiq+BL4eywWH2WHA4VrYAMViECgEgYAOIxhXDlF8k0oM4eDxrABkReBkEIj/y1ZVCsRjB2UnL4tYimCO4UBoOdlhdCveDAYMuYId8kq/DGIOI/Hyw6MDAA9t7FI/HwJAUBqOBll7X5WK+PxqK/DgMRimNsS7HAINm3DuBd4hfB+ONxhZEAIl8lVBL4YXCjLwB7eyLxFn7AvHJ4PxlS7BLo2OvmBqJfHAANC02yLotrs+iiMYB4IWCL4QgByMsvlzXYlz7UhLoIBBC4cADwMViNS7drFQNnAYXSFwZeDAAJPCyPxlEsFgIuClouBBoPxRwZgEGAMYwWI81n9sikA9CFwwwCKIWRyOFlEtlANEoAWGMIYyDisVCBAAHKYRjBqOAC6AyECqQA/AH4AJA=="))

118
apps/tinycmc/app.js Normal file
View File

@ -0,0 +1,118 @@
let settings = require("Storage").readJSON("tinycmc.json", 1);
const apiKey = settings.apikey || null;
const cmcBase = 'https://pro-api.coinmarketcap.com/';
const version = ['v1', 'v2'];
const path = {
latest: '/cryptocurrency/listings/latest',
quote: '/cryptocurrency/quotes/latest'
};
let page = 0;
function displayLatest(offset) {
g.clear();
if (page === 0) {
E.showMessage('Getting Top 10');
} else {
E.showMessage(`Getting Top ${offset} to ${offset + 9}`);
}
const uri = offset ? `${cmcBase}${version[0]}${path.latest}?convert=EUR&limit=10&start=${offset}` : `${cmcBase}${version[0]}${path.latest}?convert=EUR&limit=10`;
Bangle.http(uri,
{
method: 'GET',
headers: {
"X-CMC_PRO_API_KEY": apiKey,
}
}).then(data=>{
const result = JSON.parse(data.resp).data;
let menu = {
"" : { title : "-- Select --" },
};
//FIXME: Menu can also take an array of items, this would be easier to compose using map
result.forEach(listing => {
menu[listing.name] = {
title: `${listing.cmc_rank}: ${listing.symbol} ${Number(listing.quote.EUR.percent_change_24h).toFixed(3)}`,
onchange: function() { E.showMenu(); displayQuote(listing.symbol);} };
});
menu.Next = function() {
E.showMenu();
g.clear();
page = page + 1;
displayLatest((page * 10) + 1);
}; // remove the menu
menu.Exit = function() {
E.showMenu();
g.clear();
Bangle.showClock();
}; // remove the menu
g.clear();
E.showMenu(menu);
setWatch(() => {
g.clear();
displayMenu();
}, BTN, {edge:"rising", debounce:50, repeat:true});
}).catch(error=>{
console.log('Error');
console.log(error);
E.showMessage(`${error}\nTo go back press BTN`);
setWatch(() => {
g.clear();
displayMenu();
}, BTN, {edge:"rising", debounce:50, repeat:true});
});
}
function displayQuote(symb) {
g.clear();
E.showMessage(`Getting latest for ${symb}`);
Bangle.http(`${cmcBase}${version[1]}${path.quote}?symbol=${symb}&convert=EUR`,
{
method: 'GET',
headers: {
"X-CMC_PRO_API_KEY": apiKey,
}
}).then(data=>{
g.clear();
const result = JSON.parse(data.resp).data[symb][0];
E.showMessage(`#${result.cmc_rank}: ${result.symbol}\n${Number(result.quote.EUR.price).toFixed(2)}\n%24h:
${result.quote.EUR.percent_change_24h}`);
setWatch(() => {
g.clear();
displayMenu();
}, BTN, {edge:"rising", debounce:50, repeat:true});
}).catch(error=>{
E.showMessage(`${error}\nTo go back press BTN`);
setWatch(() => {
g.clear();
displayMenu();
}, BTN, {edge:"rising", debounce:50, repeat:true});
});
}
function displayMenu() {
if (!apiKey) {
E.showMessage("Please provide a Coinmarketcap API Key");
} else {
// Actually display the menu
E.showMenu({
"" : { title : "-- Select --" }, // options
"Latest": function() { E.showMenu(); displayLatest(); },
"BTC" : function() { E.showMenu(); displayQuote('BTC'); },
"ETH" : function() { E.showMenu(); displayQuote('ETH'); },
"XMR" : function() { E.showMenu(); displayQuote('XMR'); },
"ADA" : function() { E.showMenu(); displayQuote('ADA'); },
"DOGE" : function() { E.showMenu(); displayQuote('DOGE'); },
"LTC" : function() { E.showMenu(); displayQuote('LTC'); },
"Exit" : function() {
E.showMenu();
g.clear();
Bangle.showClock();
}, // remove the menu
});
}
}
function main () {
displayMenu();
}
main ();

BIN
apps/tinycmc/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,63 @@
<html>
<head>
<link rel="stylesheet" href="../../css/spectre.min.css">
</head>
<body>
<h3>Set Coinmarketcap API key</h3>
<p><input id="apikey" onkeyup="checkInput()" style="width:90%; margin: 3px"></input><button id="upload" class="btn btn-primary">Save key</button></p>
<h4>Where to get your personal API key?</h4>
<p>Go to <a href="https://coinmarketcap.com/api/">https://coinmarketcap.com/api/</a> and sign up for a free account.<br>
After registration you can login and obtain your personal API key.</p>
<script src="../../core/lib/interface.js"></script>
<script>
function checkInput() {
if(document.getElementById("apikey").value==="") {
document.getElementById('upload').disabled = true;
} else {
document.getElementById('upload').disabled = false;
}
}
checkInput();
var settings = {};
function onInit(){
console.log("Loading settings from BangleJs...");
try {
Util.readStorage("tinycmc.json", data=>{
if(data.length > 0){
settings = JSON.parse(data);
console.log("Got settings", settings);
document.getElementById("apikey").value = settings.apikey;
console.log("Loaded apikey from BangleJs.");
checkInput();
}
});
} catch(ex) {
console.log("(Warning) Could not load apikey from BangleJs.");
console.log(ex);
}
}
document.getElementById("upload").addEventListener("click", function() {
try {
settings.apikey = document.getElementById("apikey").value;
Util.showModal("Saving...");
Util.writeStorage("tinycmc.json", JSON.stringify(settings), ()=>{
Util.hideModal();
});
console.log("Sent settings!");
} catch(ex) {
console.log("(Warning) Could not write settings to BangleJs.");
console.log(ex);
}
});
</script>
</body>
</html>

View File

@ -0,0 +1,30 @@
{
"id": "tinycmc",
"name": "Tiny CMC",
"shortName":"tinycmc",
"icon": "icon.png",
"version": "0.02",
"description": "TinyCMC is a bangle.js Coinmarketcap API client",
"type": "app",
"tags": "tools",
"supports": [
"BANGLEJS2"
],
"allow_emulator": false,
"interface": "interface.html",
"readme": "README.md",
"data": [
{"name":"tinycmc.json"}
],
"storage": [
{
"name": "tinycmc.app.js",
"url": "app.js"
},
{
"name": "tinycmc.img",
"url": "app-icon.js",
"evaluate": true
}
]
}

View File

@ -1 +1,2 @@
0.01: New widget
0.02: Make color depend on level

View File

@ -1,7 +1,7 @@
{
"id": "widbatv",
"name": "Battery Level Widget (Vertical)",
"version": "0.01",
"version": "0.02",
"description": "Slim, vertical battery widget that only takes up 14px",
"icon": "widget.png",
"type": "widget",

View File

@ -14,6 +14,10 @@ WIDGETS["batv"]={area:"tr",width:14,draw:function() {
} else {
g.clearRect(x,y,x+14,y+24);
g.setColor(g.theme.fg).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("#0f0").fillRect(x+4,y+20-(E.getBattery()*16/100),x+10,y+20);
var battery = E.getBattery();
if (battery < 20) {g.setColor("#f00");}
else if (battery < 40) {g.setColor(g.theme.dark ? "#ff0" : "#f80");}
else {g.setColor("#0f0");}
g.fillRect(x+4,y+20-(E.getBattery()*16/100),x+10,y+20);
}
}};