forked from FOSS/BangleApps
Merge branch 'master' of github.com:nxdefiant/BangleApps
commit
5d5d2fb7f0
|
@ -12,3 +12,4 @@
|
|||
0.11: Setting to use "Today" and "Yesterday" instead of dates
|
||||
Added dynamic, short and range fields to clkinfo
|
||||
0.12: Added color field and updating clkinfo periodically (running events)
|
||||
0.13: Show day of the week in date
|
||||
|
|
|
@ -34,8 +34,9 @@ function getDate(timestamp) {
|
|||
return new Date(timestamp*1000);
|
||||
}
|
||||
function formatDay(date) {
|
||||
let formattedDate = Locale.dow(date,1) + " " + Locale.date(date).replace(/\d\d\d\d/,"");
|
||||
if (!settings.useToday) {
|
||||
return Locale.date(date);
|
||||
return formattedDate;
|
||||
}
|
||||
const dateformatted = date.toISOString().split('T')[0]; // yyyy-mm-dd
|
||||
const today = new Date(Date.now()).toISOString().split('T')[0]; // yyyy-mm-dd
|
||||
|
@ -46,7 +47,7 @@ function formatDay(date) {
|
|||
if (dateformatted == tomorrow) {
|
||||
return /*LANG*/"Tomorrow ";
|
||||
}
|
||||
return Locale.date(date);
|
||||
return formattedDate;
|
||||
}
|
||||
}
|
||||
function formatDateLong(date, includeDay, allDay) {
|
||||
|
@ -58,7 +59,7 @@ function formatDateLong(date, includeDay, allDay) {
|
|||
return shortTime;
|
||||
}
|
||||
function formatDateShort(date, allDay) {
|
||||
return formatDay(date).replace(/\d\d\d\d/,"")+(allDay?"":Locale.time(date,1)+Locale.meridian(date));
|
||||
return formatDay(date)+(allDay?"":Locale.time(date,1)+Locale.meridian(date));
|
||||
}
|
||||
|
||||
var lines = [];
|
||||
|
@ -75,25 +76,29 @@ function showEvent(ev) {
|
|||
if (titleCnt) lines.push(""); // add blank line after title
|
||||
if(start.getDay() == end.getDay() && start.getMonth() == end.getMonth())
|
||||
includeDay = false;
|
||||
if(includeDay || ev.allDay) {
|
||||
if(includeDay && ev.allDay) {
|
||||
//single day all day (average to avoid getting previous day)
|
||||
lines = lines.concat(
|
||||
/*LANG*/"Start:",
|
||||
g.wrapString(formatDateLong(new Date((start+end)/2), includeDay, ev.allDay), g.getWidth()-10));
|
||||
} else if(includeDay || ev.allDay) {
|
||||
lines = lines.concat(
|
||||
/*LANG*/"Start"+":",
|
||||
g.wrapString(formatDateLong(start, includeDay, ev.allDay), g.getWidth()-10),
|
||||
/*LANG*/"End:",
|
||||
/*LANG*/"End"+":",
|
||||
g.wrapString(formatDateLong(end, includeDay, ev.allDay), g.getWidth()-10));
|
||||
} else {
|
||||
lines = lines.concat(
|
||||
g.wrapString(Locale.date(start), g.getWidth()-10),
|
||||
g.wrapString(formatDateShort(start,true), g.getWidth()-10),
|
||||
g.wrapString(/*LANG*/"Start"+": "+formatDateLong(start, includeDay, ev.allDay), g.getWidth()-10),
|
||||
g.wrapString(/*LANG*/"End"+": "+formatDateLong(end, includeDay, ev.allDay), g.getWidth()-10));
|
||||
}
|
||||
if(ev.location)
|
||||
lines = lines.concat(/*LANG*/"Location"+": ", g.wrapString(ev.location, g.getWidth()-10));
|
||||
if(ev.description)
|
||||
lines = lines.concat("",/*LANG*/"Location"+": ", g.wrapString(ev.location, g.getWidth()-10));
|
||||
if(ev.description && ev.description.trim())
|
||||
lines = lines.concat("",g.wrapString(ev.description, g.getWidth()-10));
|
||||
if(ev.calName)
|
||||
lines = lines.concat(/*LANG*/"Calendar"+": ", g.wrapString(ev.calName, g.getWidth()-10));
|
||||
lines = lines.concat(["",/*LANG*/"< Back"]);
|
||||
lines = lines.concat("",/*LANG*/"Calendar"+": ", g.wrapString(ev.calName, g.getWidth()-10));
|
||||
lines = lines.concat("",/*LANG*/"< Back");
|
||||
E.showScroller({
|
||||
h : g.getFontHeight(), // height of each menu item in pixels
|
||||
c : lines.length, // number of menu items
|
||||
|
@ -120,7 +125,7 @@ function showList() {
|
|||
CALENDAR = CALENDAR.filter(ev=>ev.timestamp + ev.durationInSeconds > now/1000);
|
||||
}
|
||||
if(CALENDAR.length == 0) {
|
||||
E.showMessage("No events");
|
||||
E.showMessage(/*LANG*/"No events");
|
||||
return;
|
||||
}
|
||||
E.showScroller({
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"id": "agenda",
|
||||
"name": "Agenda",
|
||||
"version": "0.12",
|
||||
"version": "0.13",
|
||||
"description": "Simple agenda",
|
||||
"icon": "agenda.png",
|
||||
"screenshots": [{"url":"screenshot_agenda_overview.png"}, {"url":"screenshot_agenda_event1.png"}, {"url":"screenshot_agenda_event2.png"}],
|
||||
|
|
|
@ -2,3 +2,4 @@
|
|||
0.02: Update to work with Bangle.js 2
|
||||
0.03: Select GNSS systems to use for Bangle.js 2
|
||||
0.04: Now turns GPS off after upload
|
||||
0.05: Fix regression in 0.04 that caused AGPS data not to get loaded
|
||||
|
|
|
@ -158,7 +158,7 @@
|
|||
var chunk = bin.substr(i,chunkSize);
|
||||
js += `\x10Serial1.write(atob("${btoa(chunk)}"))\n`;
|
||||
}
|
||||
js = "\x10setTimeout(() => Bangle.setGPSPower(0,'agps'), 1000);\n"; // turn GPS off after a delay
|
||||
js += "\x10setTimeout(() => Bangle.setGPSPower(0,'agps'), 1000);\n"; // turn GPS off after a delay
|
||||
return js;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"id": "assistedgps",
|
||||
"name": "Assisted GPS Updater (AGPS)",
|
||||
"version": "0.04",
|
||||
"version": "0.05",
|
||||
"description": "Downloads assisted GPS (AGPS) data to Bangle.js for faster GPS startup and more accurate fixes. **No app will be installed**, this just uploads new data to the GPS chip.",
|
||||
"sortorder": -1,
|
||||
"icon": "app.png",
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
0.01: New App!
|
|
@ -0,0 +1,28 @@
|
|||
# LEGO Remote control
|
||||
|
||||
This app allows you to control LEGO models from Bangle.js
|
||||
|
||||
Right now the only supported control device is the Mould King M-0006
|
||||
Bluetooth remote for LEGO Power Functions: http://www.espruino.com/LEGO+Power+Functions+Clone
|
||||
|
||||
LEGO Power Functions does not have an official Bluetooth remote controller. Hopefully
|
||||
in the future this app will be able to support other types of remote (see below).
|
||||
|
||||
## Usage
|
||||
|
||||
Run the app, and ensure you're not connected to your watch via Bluetooth
|
||||
(a warning will pop up if so).
|
||||
|
||||
Now press the arrow keys on the screen to control the robot.
|
||||
|
||||
It is expected that the robot is controlled by two motors, one on the left
|
||||
side (connected to the `A` output) and one on the right (connected to the `B` output).
|
||||
|
||||
## Future additions
|
||||
|
||||
In the future it would be great to add:
|
||||
|
||||
* Recording a series of movements and playing them back
|
||||
* Support for official LEGO bluetooth remotes (via [Pybricks](https://pybricks.com/))
|
||||
* Support for different robot styles and configurations
|
||||
* Using the Bangle's compass (or even GPS) to allow better robot control.
|
|
@ -0,0 +1 @@
|
|||
require("heatshrink").decompress(atob("mEw4X/8H5A4NH/4ABJf4A/AFMC1Uq1QABhWqBYYJDAAegBYWqxWogWohQBCBYWpqsVqoABytVBYUC0u5rf5rf1q/xtQLBhWW/t//2/AYVKBYWX/u//z3B3//rRGCr/1/+H/v9/1/BYn2/lT+v6/oXDlF/4//9/78/5F4epv/X//f7/3+v9I4Wp38b/9v7//+4LD0P/HgN/7f/EgMoBYOlJ4IACDAP1O4QLH6ibCBYI7Br/+qf/iwLC1NIquhq2lquprWAWQVVoNVgtU0NVlQLCZQ7XDbgLWJEgOCdgLZBdwgA/AH4AaA"))
|
|
@ -0,0 +1,70 @@
|
|||
var lego = require("mouldking");
|
||||
lego.start();
|
||||
E.on('kill', () => {
|
||||
// return to normal Bluetooth advertising
|
||||
NRF.setAdvertising({},{showName:true});
|
||||
});
|
||||
// You must leave one second after 'start' to allow the remote to be paired
|
||||
|
||||
var arrowIcon = atob("IiiBAAAAwAAAAPwAAAB/gAAAP/AAAB/+AAAP/8AAB//4AAP//wAA///gAH///AA///8AH///4A////wH////gf////D////8f////5/////n////+f////4AP/8AAA//wAAD//AAAP/8AAA//wAAD//AAAH/8AAAf/wAAB//AAAH/8AAAf/gAAB/+AAAH/4AAAf/gAAB/+AAAH/4AAAP/gAAA/+AAAD/wAAAD8AA");
|
||||
var controlState = "";
|
||||
|
||||
Bangle.loadWidgets();
|
||||
Bangle.drawWidgets();
|
||||
var R = Bangle.appRect;
|
||||
// we'll divide up into 3x3
|
||||
function getBoxCoords(x,y) {
|
||||
return {
|
||||
x : R.x + R.w*x/3,
|
||||
y : R.y + R.h*y/3
|
||||
};
|
||||
}
|
||||
|
||||
function draw() {
|
||||
g.reset().clearRect(R);
|
||||
var c, ninety = Math.PI/2;
|
||||
var colOn = "#f00", colOff = g.theme.fg;
|
||||
c = getBoxCoords(1.5, 0.5);
|
||||
g.setColor(controlState=="up"?colOn:colOff).drawImage(arrowIcon,c.x,c.y,{rotate:0});
|
||||
c = getBoxCoords(2.5, 1.5);
|
||||
g.setColor(controlState=="right"?colOn:colOff).drawImage(arrowIcon,c.x,c.y,{rotate:ninety});
|
||||
c = getBoxCoords(0.5, 1.5);
|
||||
g.setColor(controlState=="left"?colOn:colOff).drawImage(arrowIcon,c.x,c.y,{rotate:-ninety});
|
||||
c = getBoxCoords(1.5, 1.5);
|
||||
g.setColor(controlState=="down"?colOn:colOff).drawImage(arrowIcon,c.x,c.y,{rotate:ninety*2});
|
||||
if (NRF.getSecurityStatus().connected) {
|
||||
c = getBoxCoords(1.5, 2.5);
|
||||
g.setFontAlign(0,0).setFont("6x8").drawString("WARNING:\nBluetooth Connected\nYou must disconnect\nbefore LEGO will work",c.x,c.y);
|
||||
}
|
||||
}
|
||||
draw();
|
||||
NRF.on('connect', draw);
|
||||
NRF.on('disconnect', draw);
|
||||
|
||||
function setControlState(s) {
|
||||
controlState = s;
|
||||
var c = {};
|
||||
var speed = 3;
|
||||
if (s=="up") c={a:-speed,b:-speed};
|
||||
if (s=="down") c={a:speed,b:speed};
|
||||
if (s=="left") c={a:speed,b:-speed};
|
||||
if (s=="right") c={a:-speed,b:speed};
|
||||
draw();
|
||||
lego.set(c);
|
||||
}
|
||||
|
||||
Bangle.on('drag',e => {
|
||||
var x = Math.floor(E.clip((e.x - R.x) * 3 / R.w,0,2.99));
|
||||
var y = Math.floor(E.clip((e.y - R.y) * 3 / R.h,0,2.99));
|
||||
if (!e.b) {
|
||||
setControlState("");
|
||||
return;
|
||||
}
|
||||
if (y==0) { // top row
|
||||
if (x==1) setControlState("up");
|
||||
} else if (y==1) {
|
||||
if (x==0) setControlState("left");
|
||||
if (x==1) setControlState("down");
|
||||
if (x==2) setControlState("right");
|
||||
}
|
||||
});
|
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,14 @@
|
|||
{ "id": "legoremote",
|
||||
"name": "LEGO Remote control",
|
||||
"shortName":"LEGO Remote",
|
||||
"version":"0.01",
|
||||
"description": "Use your Bangle.js to control LEGO models. See the README for compatibility",
|
||||
"icon": "app.png",
|
||||
"tags": "toy,lego,bluetooth",
|
||||
"supports" : ["BANGLEJS2"],
|
||||
"readme": "README.md",
|
||||
"storage": [
|
||||
{"name":"legoremote.app.js","url":"app.js"},
|
||||
{"name":"legoremote.img","url":"app-icon.js","evaluate":true}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
0.01: New App!
|
||||
0.02: Get weather from weather.json
|
|
@ -4,7 +4,7 @@ Based on the Pebble watchface Weather Land.
|
|||
|
||||
Mountain Pass Clock changes depending on time (day/night) and weather conditions.
|
||||
|
||||
This clock requires Gadgetbridge and an app that Gadgetbridge can use to get the current weather from OpenWeatherMap (e.g. Weather Notification). To set up Gadgetbridge and weather, see https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Weather.
|
||||
This clock requires Gadgetbridge and an app that Gadgetbridge can use to get the current weather from OpenWeatherMap (e.g. Weather Notification), or a Bangle app that will update weather.json such as OWM Weather. To set up Gadgetbridge and weather, see https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Weather.
|
||||
|
||||
The scene will change according to the following OpenWeatherMap conditions: clear, cloudy, overcast, lightning, drizzle, rain, fog and snow. Each weather condition has night/day scenes.
|
||||
|
||||
|
|
|
@ -323,11 +323,28 @@ function setWeather() {
|
|||
draw(a);
|
||||
}
|
||||
|
||||
function readWeather() {
|
||||
var weatherJson = require("Storage").readJSON('weather.json', 1);
|
||||
// save updated weather data if available and it has been an hour since last updated
|
||||
if (weatherJson !== undefined && (data.time === undefined || (data.time + 3600000) < weatherJson.weather.time)) {
|
||||
data = {
|
||||
time: weatherJson.weather.time,
|
||||
temp: weatherJson.weather.temp,
|
||||
code: weatherJson.weather.code
|
||||
};
|
||||
require("Storage").writeJSON('mtnclock.json', data);
|
||||
}
|
||||
}
|
||||
|
||||
const _GB = global.GB;
|
||||
global.GB = (event) => {
|
||||
if (event.t==="weather") {
|
||||
data = event;
|
||||
require("Storage").write('mtnclock.json', event);
|
||||
data = {
|
||||
temp: event.temp,
|
||||
code: event.code,
|
||||
time: Date.now()
|
||||
};
|
||||
require("Storage").writeJSON('mtnclock.json', data);
|
||||
setWeather();
|
||||
}
|
||||
if (_GB) setTimeout(_GB, 0, event);
|
||||
|
@ -340,11 +357,13 @@ function queueDraw() {
|
|||
if (drawTimeout) clearTimeout(drawTimeout);
|
||||
drawTimeout = setTimeout(function() {
|
||||
drawTimeout = undefined;
|
||||
readWeather();
|
||||
setWeather();
|
||||
queueDraw();
|
||||
}, 60000 - (Date.now() % 60000));
|
||||
}
|
||||
|
||||
queueDraw();
|
||||
readWeather();
|
||||
setWeather();
|
||||
Bangle.setUI("clock");
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"id": "mtnclock",
|
||||
"name": "Mountain Pass Clock",
|
||||
"shortName": "Mtn Clock",
|
||||
"version": "0.01",
|
||||
"version": "0.02",
|
||||
"description": "A clock that changes scenery based on time and weather.",
|
||||
"readme":"README.md",
|
||||
"icon": "app.png",
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
0.01: New App!
|
||||
0.02: Fix fast loading on swipe to clock
|
||||
0.03: Adds a setting for going back to clock on a timeout
|
||||
0.04: Fix timeouts closing fast loaded apps
|
|
@ -111,6 +111,7 @@ let layout = new Layout({
|
|||
remove: ()=>{
|
||||
Bangle.removeListener("swipe", onSwipe);
|
||||
Bangle.removeListener("touch", updateTimeout);
|
||||
if (timeout) clearTimeout(timeout);
|
||||
delete Graphics.prototype.setFont8x12;
|
||||
}
|
||||
});
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"id": "qcenter",
|
||||
"name": "Quick Center",
|
||||
"shortName": "QCenter",
|
||||
"version": "0.03",
|
||||
"version": "0.04",
|
||||
"description": "An app for quickly launching your favourite apps, inspired by the control centres of other watches.",
|
||||
"icon": "app.png",
|
||||
"tags": "",
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
0.01: 3/Feb/2023 Added 'Temperature Graph' app to depository.
|
||||
|
||||
0.02: 4/Feb/2023 Rewrote the widget handling after discovering there's a 'widget_utils' module to properly hide and show them.
|
||||
0.03: 4/Feb/2023 Fixed number error in timesData array.
|
||||
|
|
|
@ -1,395 +1,394 @@
|
|||
// Temperature Graph
|
||||
// BangleJS Script
|
||||
|
||||
Bangle.setBarometerPower(true,"tempgraph");
|
||||
Bangle.loadWidgets();
|
||||
var wids=WIDGETS;
|
||||
var widsOn=true;
|
||||
var rm=null;
|
||||
var gt=null;
|
||||
var dg=null;
|
||||
var Layout=require("Layout");
|
||||
var C=true;
|
||||
var temp,tempMode,readErrCnt,watchButton2;
|
||||
|
||||
var graph=require("Storage").readJSON("tempgraph.json",true);
|
||||
if(graph==undefined) {
|
||||
graph=[];
|
||||
}
|
||||
|
||||
var timesData=[
|
||||
// dur=duration, u=time units, d=divisions on graph, s=seconds per unit.
|
||||
{dur:10,u:"Mins",d:5,s:60},
|
||||
{dur:20,u:"Mins",d:4,s:60},
|
||||
{dur:30,u:"Mins",d:3,s:60},
|
||||
{dur:40,u:"Mins",d:4,s:60},
|
||||
{dur:1,u:"Hr",d:4,s:3600},
|
||||
{dur:2,u:"Hrs",d:4,s:3600},
|
||||
{dur:3,u:"Hrs",d:3,s:3600},
|
||||
{dur:4,u:"Hrs",d:4,s:3600},
|
||||
{dur:6,u:"Hrs",d:6,s:3600},
|
||||
{dur:8,u:"Hrs",d:4,s:3600},
|
||||
{dur:12,u:"Hrs",d:6,s:3600},
|
||||
{dur:16,u:"Hrs",d:4,s:3600},
|
||||
{dur:20,u:"Hrs",d:5,s:3600},
|
||||
{dur:1,u:"Day",d:4,s:3600},
|
||||
{dur:2,u:"Days",d:4,s:86400},
|
||||
{dur:3,u:"Days",d:3,s:86400},
|
||||
{dur:4,u:"Days",d:4,s:86400},
|
||||
{dur:5,u:"Days",d:5,s:86400},
|
||||
{dur:6,u:"Days",d:6,s:86400},
|
||||
{dur:7,u:"Days",d:7,s:86400}
|
||||
];
|
||||
var times=[];
|
||||
for(n=0;n<timesData.length;n++){
|
||||
times.push(timesData[n].dur+" "+timesData[n].u);
|
||||
}
|
||||
var durInd=0;
|
||||
var duration=times[durInd];
|
||||
|
||||
function drawWids(){
|
||||
g.clear();
|
||||
if(widsOn){
|
||||
WIDGETS=wids;
|
||||
Bangle.drawWidgets();
|
||||
} else {
|
||||
WIDGETS={};
|
||||
}
|
||||
}
|
||||
|
||||
function openMenu(){
|
||||
drawWids();
|
||||
E.showMenu(menu);
|
||||
}
|
||||
|
||||
function redoMenu(){
|
||||
clearInterval(rm);
|
||||
E.showMenu();
|
||||
openMenu();
|
||||
}
|
||||
|
||||
function refreshMenu(){
|
||||
rm = setInterval(redoMenu,100);
|
||||
}
|
||||
function getF(c){
|
||||
// Get Fahrenheit temperature from Celsius.
|
||||
return c*1.8+32;
|
||||
}
|
||||
|
||||
function getT(){
|
||||
Bangle.getPressure().then(p=>{
|
||||
temp=p.temperature;
|
||||
if(tempMode=="drawGraph"&&graph.length>0&&Math.abs(graph[graph.length-1].temp-temp)>10&&readErrCnt<2){
|
||||
// A large change in temperature may be a reading error. ie. A 0C or less reading after
|
||||
// a 20C reading. So if this happens, the reading is repeated up to 2 times to hopefully
|
||||
// skip such errors.
|
||||
readErrCnt++;
|
||||
print("readErrCnt "+readErrCnt);
|
||||
return;
|
||||
}
|
||||
clearInterval(gt);
|
||||
readErrCnt=0;
|
||||
switch (tempMode){
|
||||
case "showTemp":
|
||||
showT();
|
||||
break;
|
||||
case "drawGraph":
|
||||
var date=new Date();
|
||||
var dateStr=require("locale").date(date).trim();
|
||||
var hrs=date.getHours();
|
||||
var mins=date.getMinutes();
|
||||
var secs=date.getSeconds();
|
||||
graph.push({
|
||||
temp:temp,
|
||||
date:dateStr,
|
||||
hrs:hrs,
|
||||
mins:mins,
|
||||
secs:secs
|
||||
});
|
||||
if(graph.length==1){
|
||||
graph[0].dur=durInd;
|
||||
}
|
||||
require("Storage").writeJSON("tempgraph.json", graph);
|
||||
if(graph.length==150){
|
||||
clearInterval(dg);
|
||||
}
|
||||
drawG();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function getTemp(){
|
||||
readErrCnt=0;
|
||||
gt = setInterval(getT,800);
|
||||
}
|
||||
|
||||
function setButton(){
|
||||
var watchButton=setWatch(function(){
|
||||
clearInterval(gt);
|
||||
clearInterval(dg);
|
||||
clearWatch(watchButton);
|
||||
Bangle.removeListener("touch",screenTouch);
|
||||
openMenu();
|
||||
},BTN);
|
||||
Bangle.on('touch',screenTouch);
|
||||
}
|
||||
|
||||
function setButton2(){
|
||||
watchButton2=setWatch(function(){
|
||||
clearWatch(watchButton2);
|
||||
openMenu();
|
||||
},BTN);
|
||||
}
|
||||
|
||||
function zPad(n){
|
||||
return n.toString().padStart(2,0);
|
||||
}
|
||||
|
||||
function screenTouch(n,ev){
|
||||
if(ev.y>23&&ev.y<152){
|
||||
C=C==false;
|
||||
drawG(false);
|
||||
}
|
||||
}
|
||||
|
||||
function drawG(){
|
||||
function cf(t){
|
||||
if(C){
|
||||
return t;
|
||||
}
|
||||
return getF(t);
|
||||
}
|
||||
drawWids();
|
||||
var top=1;
|
||||
var bar=21;
|
||||
var barBot=175-22;
|
||||
if(widsOn){
|
||||
top=25;
|
||||
bar=bar+24;
|
||||
barBot=barBot-24;
|
||||
}
|
||||
var low=graph[0].temp;
|
||||
var hi=low;
|
||||
for(n=0;n<graph.length;n++){
|
||||
var t=graph[n].temp;
|
||||
if(low>t){
|
||||
low=t;
|
||||
}
|
||||
if(hi<t){
|
||||
hi=t;
|
||||
}
|
||||
}
|
||||
var tempHi=Math.ceil((cf(hi)+2)/10)*10;
|
||||
var tempLow=Math.floor((cf(low)-2)/10)*10;
|
||||
var div=2;
|
||||
if(tempHi-tempLow>10){
|
||||
div=5;
|
||||
}
|
||||
if(C){
|
||||
g.setColor(1,0,0);
|
||||
}else{
|
||||
g.setColor(0,0,1);
|
||||
}
|
||||
var step=(barBot-bar)/((tempHi-tempLow)/div);
|
||||
for(n=0;n<graph.length;n++){
|
||||
var pos=tempLow-cf(graph[n].temp);
|
||||
g.drawLine(n+3,pos*(step/div)+barBot,n+3,barBot+3);
|
||||
}
|
||||
g.fillRect(161,barBot+5,174,barBot+20);
|
||||
g.setColor(1,1,1);
|
||||
g.setFont("6x8:2");
|
||||
if(C){
|
||||
g.drawString("C",163,barBot+5);
|
||||
}else{
|
||||
g.drawString("F",163,barBot+5);
|
||||
}
|
||||
g.setColor(0,0,0);
|
||||
g.setFont6x15();
|
||||
g.drawString("Temperature Graph - "+times[graph[0].dur],1,top);
|
||||
g.drawRect(2,bar-4,153,barBot+4);
|
||||
g.setFont("6x8:1");
|
||||
var num=tempHi;
|
||||
for(n=bar;n<=barBot;n=n+step){
|
||||
g.drawLine(3,n,152,n);
|
||||
g.drawString(num.toString().padStart(3," "),155,n-4);
|
||||
num=num-div;
|
||||
}
|
||||
step=151/timesData[graph[0].dur].d;
|
||||
for(n=step+2;n<152;n=n+step){
|
||||
g.drawLine(n,bar-4,n,barBot+4);
|
||||
}
|
||||
grSt=graph[0];
|
||||
g.drawString("Start: "+grSt.date+" "+grSt.hrs+":"+zPad(grSt.mins),1,barBot+6);
|
||||
var lastT=graph[graph.length-1].temp;
|
||||
g.drawString("Last Reading:",1,barBot+14);
|
||||
g.setColor(1,0,0);
|
||||
g.drawString(lastT.toFixed(1)+"C",85,barBot+14);
|
||||
g.setColor(0,0,1);
|
||||
g.drawString(getF(lastT).toFixed(1)+"F",121,barBot+14);
|
||||
process.memory(true);
|
||||
}
|
||||
|
||||
function drawGraph(){
|
||||
setButton();
|
||||
tempMode="drawGraph";
|
||||
durInd=times.indexOf(duration);
|
||||
graph=[];
|
||||
getTemp();
|
||||
dg=setInterval(getTemp,1000*timesData[durInd].dur*timesData[durInd].s/150);
|
||||
}
|
||||
|
||||
function showGraph(){
|
||||
setButton();
|
||||
drawG();
|
||||
}
|
||||
|
||||
function noBluetooth(){
|
||||
if(NRF.getSecurityStatus().connected){
|
||||
return false;
|
||||
}else{
|
||||
message("Error! Your\nBangle Watch\ncurrently has\nno Bluetooth\nconnection.");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function saveGraph(){
|
||||
if(noBluetooth()){
|
||||
return;
|
||||
}
|
||||
drawG();
|
||||
g.flip();
|
||||
g.dump();
|
||||
message("Graph has\nbeen sent\nto Web IDE\nfor saving.\n");
|
||||
}
|
||||
|
||||
function saveData(){
|
||||
if(noBluetooth()){
|
||||
return;
|
||||
}
|
||||
drawG();
|
||||
g.flip();
|
||||
print("Temperature Graph - "+times[graph[0].dur]+"\n");
|
||||
print("\"Date\",\"Time\",\"Celsius\",\"Fahrenheit\"");
|
||||
for(n=0;n<graph.length;n++){
|
||||
var gr=graph[n];
|
||||
print("\""+gr.date+"\",\""+gr.hrs+":"+zPad(gr.mins)+":"+zPad(gr.secs)+"\","+gr.temp+","+getF(gr.temp));
|
||||
}
|
||||
message("Data has\nbeen sent\nto Web IDE\nfor saving.\n");
|
||||
}
|
||||
|
||||
function message(mes){
|
||||
setButton2();
|
||||
var messageLO=new Layout({
|
||||
type:"v",c:[
|
||||
{type:"txt",font:"6x8:2",width:171,label:mes,id:"label"},
|
||||
{type:"btn",font:"6x8:2",pad:3,label:"OK",cb:l=>exit()},
|
||||
],lazy:true
|
||||
});
|
||||
drawWids();
|
||||
messageLO.render();
|
||||
}
|
||||
|
||||
function showT(){
|
||||
tempLO.lab1.label=tempLO.lab3.label;
|
||||
tempLO.lab2.label=tempLO.lab4.label;
|
||||
tempLO.lab3.label=tempLO.lab5.label;
|
||||
tempLO.lab4.label=tempLO.lab6.label;
|
||||
tempLO.lab5.label=temp.toFixed(2)+"C";
|
||||
tempLO.lab6.label=getF(temp).toFixed(2)+"F";
|
||||
tempLO.render();
|
||||
}
|
||||
|
||||
function exit(){
|
||||
clearWatch(watchButton2);
|
||||
openMenu();
|
||||
}
|
||||
|
||||
function showTemp(){
|
||||
tempMode="showTemp";
|
||||
setButton2();
|
||||
tempLO=new Layout({
|
||||
type:"v",c:[
|
||||
{type:"h",c:[
|
||||
{type:"txt",pad:5,col:"#f77",font:"6x8:2",label:" ",id:"lab1"},
|
||||
{type:"txt",pad:5,col:"#77f",font:"6x8:2",label:" ",id:"lab2"}
|
||||
]},
|
||||
{type:"h",c:[
|
||||
{type:"txt",pad:5,col:"#f77",font:"6x8:2",label:" ",id:"lab3"},
|
||||
{type:"txt",pad:5,col:"#77f",font:"6x8:2",label:" ",id:"lab4"}
|
||||
]},
|
||||
{type:"h",c:[
|
||||
{type:"txt",pad:5,col:"#f00",font:"6x8:2",label:" ",id:"lab5"},
|
||||
{type:"txt",pad:5,col:"#00f",font:"6x8:2",label:" ",id:"lab6"}
|
||||
]},
|
||||
{type:"h",c:[
|
||||
{type:"btn",pad:2,font:"6x8:2",label:"Temp",cb:l=>getTemp()},
|
||||
{type:"btn",pad:2,font:"6x8:2",label:"Exit",cb:l=>exit()}
|
||||
]}
|
||||
]
|
||||
},{lazy:true});
|
||||
tempLO.render();
|
||||
getTemp();
|
||||
}
|
||||
|
||||
var menu={
|
||||
"":{
|
||||
"title":" Temp. Graph"
|
||||
},
|
||||
|
||||
"Widgets":{
|
||||
value:widsOn,
|
||||
format:vis=>vis?"Hide":"Show",
|
||||
onchange:vis=>{
|
||||
widsOn=vis;
|
||||
refreshMenu();
|
||||
}
|
||||
},
|
||||
|
||||
"Duration":{
|
||||
value:times.indexOf(duration),
|
||||
min:0,max:times.length-1,step:1,wrap:true,
|
||||
format:tim=>times[tim],
|
||||
onchange:(dur)=>{
|
||||
duration=times[dur];
|
||||
}
|
||||
},
|
||||
|
||||
"Draw Graph":function(){
|
||||
E.showMenu();
|
||||
drawGraph();
|
||||
},
|
||||
|
||||
"Show Graph" : function(){
|
||||
E.showMenu();
|
||||
if(graph.length>0){
|
||||
showGraph();
|
||||
}else{
|
||||
message("No graph to\nshow as no\ngraph has been\ndrawn yet.");
|
||||
}
|
||||
},
|
||||
|
||||
"Save Graph" : function(){
|
||||
E.showMenu();
|
||||
if(graph.length>0){
|
||||
saveGraph();
|
||||
}else{
|
||||
message("No graph to\nsave as no\ngraph has been\ndrawn yet.");
|
||||
}
|
||||
},
|
||||
|
||||
"Save Data" : function(){
|
||||
E.showMenu();
|
||||
if(graph.length>0){
|
||||
saveData();
|
||||
}else{
|
||||
message("No data to\nsave as no\ngraph has been\ndrawn yet.");
|
||||
}
|
||||
},
|
||||
|
||||
"Show Temp":function(){
|
||||
E.showMenu();
|
||||
showTemp();
|
||||
}
|
||||
};
|
||||
|
||||
openMenu();
|
||||
// Temperature Graph
|
||||
// BangleJS Script
|
||||
|
||||
Bangle.setBarometerPower(true,"tempgraph");
|
||||
Bangle.loadWidgets();
|
||||
var widsOn=true;
|
||||
var rm=null;
|
||||
var gt=null;
|
||||
var dg=null;
|
||||
var Layout=require("Layout");
|
||||
var C=true;
|
||||
var temp,tempMode,readErrCnt,watchButton2;
|
||||
|
||||
var graph=require("Storage").readJSON("tempgraph.json",true);
|
||||
if(graph==undefined) {
|
||||
graph=[];
|
||||
}
|
||||
|
||||
var timesData=[
|
||||
// dur=duration, u=time units, d=divisions on graph, s=seconds per unit.
|
||||
{dur:10,u:"Mins",d:5,s:60},
|
||||
{dur:20,u:"Mins",d:4,s:60},
|
||||
{dur:30,u:"Mins",d:3,s:60},
|
||||
{dur:40,u:"Mins",d:4,s:60},
|
||||
{dur:1,u:"Hr",d:4,s:3600},
|
||||
{dur:2,u:"Hrs",d:4,s:3600},
|
||||
{dur:3,u:"Hrs",d:3,s:3600},
|
||||
{dur:4,u:"Hrs",d:4,s:3600},
|
||||
{dur:6,u:"Hrs",d:6,s:3600},
|
||||
{dur:8,u:"Hrs",d:4,s:3600},
|
||||
{dur:12,u:"Hrs",d:6,s:3600},
|
||||
{dur:16,u:"Hrs",d:4,s:3600},
|
||||
{dur:20,u:"Hrs",d:5,s:3600},
|
||||
{dur:1,u:"Day",d:4,s:86400},
|
||||
{dur:2,u:"Days",d:4,s:86400},
|
||||
{dur:3,u:"Days",d:3,s:86400},
|
||||
{dur:4,u:"Days",d:4,s:86400},
|
||||
{dur:5,u:"Days",d:5,s:86400},
|
||||
{dur:6,u:"Days",d:6,s:86400},
|
||||
{dur:7,u:"Days",d:7,s:86400}
|
||||
];
|
||||
var times=[];
|
||||
for(n=0;n<timesData.length;n++){
|
||||
times.push(timesData[n].dur+" "+timesData[n].u);
|
||||
}
|
||||
var durInd=0;
|
||||
var duration=times[durInd];
|
||||
|
||||
function drawWids(){
|
||||
g.clear();
|
||||
if(widsOn){
|
||||
Bangle.drawWidgets();
|
||||
require("widget_utils").show();
|
||||
} else {
|
||||
require("widget_utils").hide();
|
||||
}
|
||||
}
|
||||
|
||||
function openMenu(){
|
||||
drawWids();
|
||||
E.showMenu(menu);
|
||||
}
|
||||
|
||||
function redoMenu(){
|
||||
clearInterval(rm);
|
||||
E.showMenu();
|
||||
openMenu();
|
||||
}
|
||||
|
||||
function refreshMenu(){
|
||||
rm = setInterval(redoMenu,100);
|
||||
}
|
||||
function getF(c){
|
||||
// Get Fahrenheit temperature from Celsius.
|
||||
return c*1.8+32;
|
||||
}
|
||||
|
||||
function getT(){
|
||||
Bangle.getPressure().then(p=>{
|
||||
temp=p.temperature;
|
||||
if(tempMode=="drawGraph"&&graph.length>0&&Math.abs(graph[graph.length-1].temp-temp)>10&&readErrCnt<2){
|
||||
// A large change in temperature may be a reading error. ie. A 0C or less reading after
|
||||
// a 20C reading. So if this happens, the reading is repeated up to 2 times to hopefully
|
||||
// skip such errors.
|
||||
readErrCnt++;
|
||||
print("readErrCnt "+readErrCnt);
|
||||
return;
|
||||
}
|
||||
clearInterval(gt);
|
||||
readErrCnt=0;
|
||||
switch (tempMode){
|
||||
case "showTemp":
|
||||
showT();
|
||||
break;
|
||||
case "drawGraph":
|
||||
var date=new Date();
|
||||
var dateStr=require("locale").date(date).trim();
|
||||
var hrs=date.getHours();
|
||||
var mins=date.getMinutes();
|
||||
var secs=date.getSeconds();
|
||||
graph.push({
|
||||
temp:temp,
|
||||
date:dateStr,
|
||||
hrs:hrs,
|
||||
mins:mins,
|
||||
secs:secs
|
||||
});
|
||||
if(graph.length==1){
|
||||
graph[0].dur=durInd;
|
||||
}
|
||||
require("Storage").writeJSON("tempgraph.json", graph);
|
||||
if(graph.length==150){
|
||||
clearInterval(dg);
|
||||
}
|
||||
drawG();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function getTemp(){
|
||||
readErrCnt=0;
|
||||
gt = setInterval(getT,800);
|
||||
}
|
||||
|
||||
function setButton(){
|
||||
var watchButton=setWatch(function(){
|
||||
clearInterval(gt);
|
||||
clearInterval(dg);
|
||||
clearWatch(watchButton);
|
||||
Bangle.removeListener("touch",screenTouch);
|
||||
openMenu();
|
||||
},BTN);
|
||||
Bangle.on('touch',screenTouch);
|
||||
}
|
||||
|
||||
function setButton2(){
|
||||
watchButton2=setWatch(function(){
|
||||
clearWatch(watchButton2);
|
||||
openMenu();
|
||||
},BTN);
|
||||
}
|
||||
|
||||
function zPad(n){
|
||||
return n.toString().padStart(2,0);
|
||||
}
|
||||
|
||||
function screenTouch(n,ev){
|
||||
if(ev.y>23&&ev.y<152){
|
||||
C=C==false;
|
||||
drawG(false);
|
||||
}
|
||||
}
|
||||
|
||||
function drawG(){
|
||||
function cf(t){
|
||||
if(C){
|
||||
return t;
|
||||
}
|
||||
return getF(t);
|
||||
}
|
||||
drawWids();
|
||||
var top=1;
|
||||
var bar=21;
|
||||
var barBot=175-22;
|
||||
if(widsOn){
|
||||
top=25;
|
||||
bar=bar+24;
|
||||
barBot=barBot-24;
|
||||
}
|
||||
var low=graph[0].temp;
|
||||
var hi=low;
|
||||
for(n=0;n<graph.length;n++){
|
||||
var t=graph[n].temp;
|
||||
if(low>t){
|
||||
low=t;
|
||||
}
|
||||
if(hi<t){
|
||||
hi=t;
|
||||
}
|
||||
}
|
||||
var tempHi=Math.ceil((cf(hi)+2)/10)*10;
|
||||
var tempLow=Math.floor((cf(low)-2)/10)*10;
|
||||
var div=2;
|
||||
if(tempHi-tempLow>10){
|
||||
div=5;
|
||||
}
|
||||
if(C){
|
||||
g.setColor(1,0,0);
|
||||
}else{
|
||||
g.setColor(0,0,1);
|
||||
}
|
||||
var step=(barBot-bar)/((tempHi-tempLow)/div);
|
||||
for(n=0;n<graph.length;n++){
|
||||
var pos=tempLow-cf(graph[n].temp);
|
||||
g.drawLine(n+3,pos*(step/div)+barBot,n+3,barBot+3);
|
||||
}
|
||||
g.fillRect(161,barBot+5,174,barBot+20);
|
||||
g.setColor(1,1,1);
|
||||
g.setFont("6x8:2");
|
||||
if(C){
|
||||
g.drawString("C",163,barBot+5);
|
||||
}else{
|
||||
g.drawString("F",163,barBot+5);
|
||||
}
|
||||
g.setColor(0,0,0);
|
||||
g.setFont6x15();
|
||||
g.drawString("Temperature Graph - "+times[graph[0].dur],1,top);
|
||||
g.drawRect(2,bar-4,153,barBot+4);
|
||||
g.setFont("6x8:1");
|
||||
var num=tempHi;
|
||||
for(n=bar;n<=barBot;n=n+step){
|
||||
g.drawLine(3,n,152,n);
|
||||
g.drawString(num.toString().padStart(3," "),155,n-4);
|
||||
num=num-div;
|
||||
}
|
||||
step=151/timesData[graph[0].dur].d;
|
||||
for(n=step+2;n<152;n=n+step){
|
||||
g.drawLine(n,bar-4,n,barBot+4);
|
||||
}
|
||||
grSt=graph[0];
|
||||
g.drawString("Start: "+grSt.date+" "+grSt.hrs+":"+zPad(grSt.mins),1,barBot+6);
|
||||
var lastT=graph[graph.length-1].temp;
|
||||
g.drawString("Last Reading:",1,barBot+14);
|
||||
g.setColor(1,0,0);
|
||||
g.drawString(lastT.toFixed(1)+"C",85,barBot+14);
|
||||
g.setColor(0,0,1);
|
||||
g.drawString(getF(lastT).toFixed(1)+"F",121,barBot+14);
|
||||
process.memory(true);
|
||||
}
|
||||
|
||||
function drawGraph(){
|
||||
setButton();
|
||||
tempMode="drawGraph";
|
||||
durInd=times.indexOf(duration);
|
||||
graph=[];
|
||||
getTemp();
|
||||
dg=setInterval(getTemp,1000*timesData[durInd].dur*timesData[durInd].s/150);
|
||||
}
|
||||
|
||||
function showGraph(){
|
||||
setButton();
|
||||
drawG();
|
||||
}
|
||||
|
||||
function noBluetooth(){
|
||||
if(NRF.getSecurityStatus().connected){
|
||||
return false;
|
||||
}else{
|
||||
message("Error! Your\nBangle Watch\ncurrently has\nno Bluetooth\nconnection.");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function saveGraph(){
|
||||
if(noBluetooth()){
|
||||
return;
|
||||
}
|
||||
drawG();
|
||||
g.flip();
|
||||
g.dump();
|
||||
message("Graph has\nbeen sent\nto Web IDE\nfor saving.\n");
|
||||
}
|
||||
|
||||
function saveData(){
|
||||
if(noBluetooth()){
|
||||
return;
|
||||
}
|
||||
drawG();
|
||||
g.flip();
|
||||
print("Temperature Graph - "+times[graph[0].dur]+"\n");
|
||||
print("\"Date\",\"Time\",\"Celsius\",\"Fahrenheit\"");
|
||||
for(n=0;n<graph.length;n++){
|
||||
var gr=graph[n];
|
||||
print("\""+gr.date+"\",\""+gr.hrs+":"+zPad(gr.mins)+":"+zPad(gr.secs)+"\","+gr.temp+","+getF(gr.temp));
|
||||
}
|
||||
message("Data has\nbeen sent\nto Web IDE\nfor saving.\n");
|
||||
}
|
||||
|
||||
function message(mes){
|
||||
setButton2();
|
||||
var messageLO=new Layout({
|
||||
type:"v",c:[
|
||||
{type:"txt",font:"6x8:2",width:171,label:mes,id:"label"},
|
||||
{type:"btn",font:"6x8:2",pad:3,label:"OK",cb:l=>exit()},
|
||||
],lazy:true
|
||||
});
|
||||
drawWids();
|
||||
messageLO.render();
|
||||
}
|
||||
|
||||
function showT(){
|
||||
tempLO.lab1.label=tempLO.lab3.label;
|
||||
tempLO.lab2.label=tempLO.lab4.label;
|
||||
tempLO.lab3.label=tempLO.lab5.label;
|
||||
tempLO.lab4.label=tempLO.lab6.label;
|
||||
tempLO.lab5.label=temp.toFixed(2)+"C";
|
||||
tempLO.lab6.label=getF(temp).toFixed(2)+"F";
|
||||
tempLO.render();
|
||||
}
|
||||
|
||||
function exit(){
|
||||
clearWatch(watchButton2);
|
||||
openMenu();
|
||||
}
|
||||
|
||||
function showTemp(){
|
||||
tempMode="showTemp";
|
||||
setButton2();
|
||||
tempLO=new Layout({
|
||||
type:"v",c:[
|
||||
{type:"h",c:[
|
||||
{type:"txt",pad:5,col:"#f77",font:"6x8:2",label:" ",id:"lab1"},
|
||||
{type:"txt",pad:5,col:"#77f",font:"6x8:2",label:" ",id:"lab2"}
|
||||
]},
|
||||
{type:"h",c:[
|
||||
{type:"txt",pad:5,col:"#f77",font:"6x8:2",label:" ",id:"lab3"},
|
||||
{type:"txt",pad:5,col:"#77f",font:"6x8:2",label:" ",id:"lab4"}
|
||||
]},
|
||||
{type:"h",c:[
|
||||
{type:"txt",pad:5,col:"#f00",font:"6x8:2",label:" ",id:"lab5"},
|
||||
{type:"txt",pad:5,col:"#00f",font:"6x8:2",label:" ",id:"lab6"}
|
||||
]},
|
||||
{type:"h",c:[
|
||||
{type:"btn",pad:2,font:"6x8:2",label:"Temp",cb:l=>getTemp()},
|
||||
{type:"btn",pad:2,font:"6x8:2",label:"Exit",cb:l=>exit()}
|
||||
]}
|
||||
]
|
||||
},{lazy:true});
|
||||
tempLO.render();
|
||||
getTemp();
|
||||
}
|
||||
|
||||
var menu={
|
||||
"":{
|
||||
"title":" Temp. Graph"
|
||||
},
|
||||
|
||||
"Widgets":{
|
||||
value:widsOn,
|
||||
format:vis=>vis?"Hide":"Show",
|
||||
onchange:vis=>{
|
||||
widsOn=vis;
|
||||
refreshMenu();
|
||||
}
|
||||
},
|
||||
|
||||
"Duration":{
|
||||
value:times.indexOf(duration),
|
||||
min:0,max:times.length-1,step:1,wrap:true,
|
||||
format:tim=>times[tim],
|
||||
onchange:(dur)=>{
|
||||
duration=times[dur];
|
||||
}
|
||||
},
|
||||
|
||||
"Draw Graph":function(){
|
||||
E.showMenu();
|
||||
drawGraph();
|
||||
},
|
||||
|
||||
"Show Graph" : function(){
|
||||
E.showMenu();
|
||||
if(graph.length>0){
|
||||
showGraph();
|
||||
}else{
|
||||
message("No graph to\nshow as no\ngraph has been\ndrawn yet.");
|
||||
}
|
||||
},
|
||||
|
||||
"Save Graph" : function(){
|
||||
E.showMenu();
|
||||
if(graph.length>0){
|
||||
saveGraph();
|
||||
}else{
|
||||
message("No graph to\nsave as no\ngraph has been\ndrawn yet.");
|
||||
}
|
||||
},
|
||||
|
||||
"Save Data" : function(){
|
||||
E.showMenu();
|
||||
if(graph.length>0){
|
||||
saveData();
|
||||
}else{
|
||||
message("No data to\nsave as no\ngraph has been\ndrawn yet.");
|
||||
}
|
||||
},
|
||||
|
||||
"Show Temp":function(){
|
||||
E.showMenu();
|
||||
showTemp();
|
||||
}
|
||||
};
|
||||
|
||||
openMenu();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{ "id": "tempgraph",
|
||||
"name": "Temperature Graph",
|
||||
"shortName":"Temp Graph",
|
||||
"version":"0.01",
|
||||
"version":"0.03",
|
||||
"description": "An app for recording the temperature for time periods ranging from 10 minutes to 7 days.",
|
||||
"icon": "app.png",
|
||||
"type": "app",
|
||||
|
|
|
@ -6,3 +6,4 @@
|
|||
0.07: Move CHARGING variable to more readable string
|
||||
0.08: Ensure battery updates every 60s even if LCD was on at boot and stays on
|
||||
0.09: Misc speed/memory tweaks
|
||||
0.10: Color changes due to the battery level
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"id": "widbat",
|
||||
"name": "Battery Level Widget",
|
||||
"version": "0.09",
|
||||
"version": "0.10",
|
||||
"description": "Show the current battery level and charging status in the top right of the clock",
|
||||
"icon": "widget.png",
|
||||
"type": "widget",
|
||||
|
|
|
@ -31,7 +31,11 @@
|
|||
x+=16;
|
||||
}
|
||||
g.setColor(g.theme.fg).fillRect(x,y+2,x+s-4,y+21).clearRect(x+2,y+4,x+s-6,y+19).fillRect(x+s-3,y+10,x+s,y+14);
|
||||
g.setColor("#0f0").fillRect(x+4,y+6,x+4+E.getBattery()*(s-12)/100,y+17);
|
||||
var battery = E.getBattery();
|
||||
if(battery < 20) {g.setColor("#f00");}
|
||||
else if (battery < 50) {g.setColor("#ff0");}
|
||||
else {g.setColor("#0f0");}
|
||||
g.fillRect(x+4,y+6,x+4+battery*(s-12)/100,y+17);
|
||||
}};
|
||||
setWidth();
|
||||
})()
|
||||
|
|
|
@ -200,7 +200,15 @@
|
|||
"Green": "Verde",
|
||||
"Blue": "Blu",
|
||||
"Black": "Nero",
|
||||
"Show Week Number": "Mostra numero settimana"
|
||||
"Show Week Number": "Mostra numero settimana",
|
||||
"Calendar": "Calendario",
|
||||
"Start": "Inizio",
|
||||
"End": "Fine",
|
||||
"Location": "Posizione",
|
||||
"No location": "Nessuna posizione",
|
||||
"No events": "Nessun evento",
|
||||
"Today": "Oggi",
|
||||
"Tomorrow": "Domani"
|
||||
},
|
||||
"//2": "App-specific overrides",
|
||||
"alarm": {
|
||||
|
|
Loading…
Reference in New Issue