android 0.13: Added Bangle.http function (see Readme file for more info)
parent
95693e3a16
commit
85dad61386
|
|
@ -10,3 +10,4 @@
|
||||||
0.09: Alarm vibration, repeat, and auto-snooze now handled by sched
|
0.09: Alarm vibration, repeat, and auto-snooze now handled by sched
|
||||||
0.10: Fix SMS bug
|
0.10: Fix SMS bug
|
||||||
0.12: Use default Bangle formatter for booleans
|
0.12: Use default Bangle formatter for booleans
|
||||||
|
0.13: Added Bangle.http function (see Readme file for more info)
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,25 @@ Responses are sent back to Gadgetbridge simply as one line of JSON.
|
||||||
|
|
||||||
More info on message formats on http://www.espruino.com/Gadgetbridge
|
More info on message formats on http://www.espruino.com/Gadgetbridge
|
||||||
|
|
||||||
|
## Functions provided
|
||||||
|
|
||||||
|
The boot code also provides some useful functions:
|
||||||
|
|
||||||
|
* `Bangle.messageResponse = function(msg,response)` - send a yes/no response to a message. `msg` is a message object, and `response` is a boolean.
|
||||||
|
* `Bangle.musicControl = function(cmd)` - control music, cmd = `play/pause/next/previous/volumeup/volumedown`
|
||||||
|
* `Bangle.http = function(url,options)` - make an HTTPS request to a URL and return a promise with the data. Requires the [internet enabled `Bangle.js Gadgetbridge` app](http://www.espruino.com/Gadgetbridge#http-requests). `options` can contain:
|
||||||
|
* `id` - a custom (string) ID
|
||||||
|
* `timeout` - a timeout for the request in milliseconds (default 30000ms)
|
||||||
|
* `xpath` an xPath query to run on the request (but right now the URL requested must be XML - HTML is rarely XML compliant)
|
||||||
|
|
||||||
|
eg:
|
||||||
|
|
||||||
|
```
|
||||||
|
Bangle.http("https://pur3.co.uk/hello.txt").then(data=>{
|
||||||
|
console.log("Got ",data);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
Bangle.js can only hold one connection open at a time, so it's hard to see
|
Bangle.js can only hold one connection open at a time, so it's hard to see
|
||||||
|
|
|
||||||
|
|
@ -118,11 +118,50 @@
|
||||||
var cal = require("Storage").readJSON("android.calendar.json",true);
|
var cal = require("Storage").readJSON("android.calendar.json",true);
|
||||||
if (!cal || !Array.isArray(cal)) cal = [];
|
if (!cal || !Array.isArray(cal)) cal = [];
|
||||||
gbSend({t:"force_calendar_sync", ids: cal.map(e=>e.id)});
|
gbSend({t:"force_calendar_sync", ids: cal.map(e=>e.id)});
|
||||||
|
},
|
||||||
|
"http":function() {
|
||||||
|
//get the promise and call the promise resolve
|
||||||
|
if (Bangle.httpRequest === undefined) return;
|
||||||
|
var objID=Bangle.httpRequest[event.id];
|
||||||
|
if (objID === undefined) return; //already timedout or wrong id
|
||||||
|
delete Bangle.httpRequest[event.id];
|
||||||
|
clearInterval(objID.t); //t = timeout variable
|
||||||
|
if(event.err!==undefined) //if is error
|
||||||
|
objID.j(event.err); //r = reJect function
|
||||||
|
else
|
||||||
|
objID.r(event); //r = resolve function
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var h = HANDLERS[event.t];
|
var h = HANDLERS[event.t];
|
||||||
if (h) h(); else console.log("GB Unknown",event);
|
if (h) h(); else console.log("GB Unknown",event);
|
||||||
};
|
};
|
||||||
|
// HTTP request handling - see the readme
|
||||||
|
// options = {id,timeout,xpath}
|
||||||
|
Bangle.http = (url,options)=>{
|
||||||
|
options = options||{};
|
||||||
|
if (Bangle.httpRequest === undefined)
|
||||||
|
Bangle.httpRequest={};
|
||||||
|
if (options.id === undefined) {
|
||||||
|
// try and create a unique ID
|
||||||
|
do {
|
||||||
|
options.id = Math.random().toString().substr(2);
|
||||||
|
} while( Bangle.httpRequest[options.id]!==undefined);
|
||||||
|
}
|
||||||
|
//send the request
|
||||||
|
var req = {t: "http", url:url, id:options.id};
|
||||||
|
if (options.xpath) req.xpath = options.xpath;
|
||||||
|
gbSend(req);
|
||||||
|
//create the promise
|
||||||
|
var promise = new Promise(function(resolve,reject) {
|
||||||
|
//save the resolve function in the dictionary and create a timeout (30 seconds default)
|
||||||
|
Bangle.httpRequest[options.id]={r:resolve,j:reject,t:setTimeout(()=>{
|
||||||
|
//if after "timeoutMillisec" it still hasn't answered -> reject
|
||||||
|
delete Bangle.httpRequest[options.id];
|
||||||
|
reject("Timeout");
|
||||||
|
},options.timeout||30000)};
|
||||||
|
});
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
|
||||||
// Battery monitor
|
// Battery monitor
|
||||||
function sendBattery() { gbSend({ t: "status", bat: E.getBattery(), chg: Bangle.isCharging()?1:0 }); }
|
function sendBattery() { gbSend({ t: "status", bat: E.getBattery(), chg: Bangle.isCharging()?1:0 }); }
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
"id": "android",
|
"id": "android",
|
||||||
"name": "Android Integration",
|
"name": "Android Integration",
|
||||||
"shortName": "Android",
|
"shortName": "Android",
|
||||||
"version": "0.12",
|
"version": "0.13",
|
||||||
"description": "Display notifications/music/etc sent from the Gadgetbridge app on Android. This replaces the old 'Gadgetbridge' Bangle.js widget.",
|
"description": "Display notifications/music/etc sent from the Gadgetbridge app on Android. This replaces the old 'Gadgetbridge' Bangle.js widget.",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"tags": "tool,system,messages,notifications,gadgetbridge",
|
"tags": "tool,system,messages,notifications,gadgetbridge",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue