mirror of https://github.com/espruino/BangleApps
feat: inital working implementation for Sleep as Android
parent
3b36e66bcf
commit
68ed8739b3
|
@ -1,31 +1,52 @@
|
|||
(() => {
|
||||
eval(require("Storage").read("sleepasandroid.conf.js"));
|
||||
var interval = null;
|
||||
|
||||
/**
|
||||
* Sends a message to the gadgetbridge via Bluetooth.
|
||||
* @param {Object} message - The message to be sent.
|
||||
*/
|
||||
function gbSend(message) {
|
||||
// Helper function to send data to gadgetbridge
|
||||
Bluetooth.println("");
|
||||
Bluetooth.println(JSON.stringify(message));
|
||||
}
|
||||
|
||||
var config = new SleepAsAndroidConfig();
|
||||
|
||||
|
||||
function update_sleep_as_android() {
|
||||
// send data to gadgetbridge
|
||||
accel = Bangle.getAccel();
|
||||
health = Bangle.getHealthStatus();
|
||||
|
||||
update_data = {t: "sleep_as_android", "accel": {"x": accel.x, "y": accel.y, "z": accel.z}, "bpm": health.bpm};
|
||||
gbSend(update_data);
|
||||
accel_data = [];
|
||||
if (!config.getEnabled()) {
|
||||
clearInterval(interval);
|
||||
try {
|
||||
Bluetooth.println("");
|
||||
Bluetooth.println(JSON.stringify(message));
|
||||
} catch (error) {
|
||||
console.error("Failed to send message via Bluetooth:", error);
|
||||
}
|
||||
}
|
||||
|
||||
if (config.getEnabled()) {
|
||||
interval = setInterval(update_sleep_as_android, 1000);
|
||||
var max_acceleration = {x: 0, y: 0, z: 0, mag: 0};
|
||||
|
||||
/**
|
||||
* Updates the maximum acceleration if the current acceleration is greater.
|
||||
* @param {Object} accel - The current acceleration object with x, y, z, and mag properties.
|
||||
*/
|
||||
function updateAcceleration(accel) {
|
||||
var current_max_raw = accel.mag;
|
||||
var max_raw = max_acceleration.mag;
|
||||
|
||||
if (current_max_raw > max_raw) {
|
||||
max_acceleration = accel;
|
||||
}
|
||||
}
|
||||
|
||||
})();
|
||||
/**
|
||||
* Updates the Sleep as Android data and sends it to gadgetbridge.
|
||||
* Resets the maximum acceleration.
|
||||
* Acceleration values in g are converted to m/s^2, as expected by Sleep as Android.
|
||||
*/
|
||||
function sendSleepAsAndroidData() {
|
||||
var accel = Bangle.getAccel();
|
||||
var health = Bangle.getHealthStatus();
|
||||
|
||||
var update_data = {
|
||||
t: "sleep_as_android", accel: {
|
||||
x: accel.x * 9.80665, y: accel.y * 9.80665, z: accel.z * 9.80665
|
||||
}, bpm: health.bpm
|
||||
};
|
||||
gbSend(update_data);
|
||||
|
||||
max_acceleration = {x: 0, y: 0, z: 0, mag: 0};
|
||||
}
|
||||
|
||||
setInterval(sendSleepAsAndroidData, 10000); // Sleep as Android wants a 10-second maximum
|
||||
Bangle.on("accel", updateAcceleration); // Log all acceleration events
|
||||
|
||||
})();
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
(()=>{function a(A){try {Bluetooth.println('');Bluetooth.println(JSON.stringify(A))} catch (_) {console.error('Failed to send message via Bluetooth:',_)}}var b={x:0,y:0,z:0,mag:0};function c(B){var C=B.mag,_c=b.mag;C>_c&&(b=B)}function d(){var _a=Bangle.getAccel(),_b=Bangle.getHealthStatus();a({t:'sleep_as_android',accel:{x:_a.x*9.80665,y:_a.y*9.80665,z:_a.z*9.80665},bpm:_b.bpm});b={x:0,y:0,z:0,mag:0}}setInterval(d,10000);Bangle.on('accel',c)})();
|
|
@ -1,34 +0,0 @@
|
|||
class SleepAsAndroidConfig {
|
||||
//Simple class to store whether sleep as android is running
|
||||
constructor() {
|
||||
this.filename = "sleepasandroid.json";
|
||||
}
|
||||
|
||||
getEnabled() {
|
||||
//returns whether sleeptracking is enabled
|
||||
var content = require("Storage").readJSON(this.filename);
|
||||
if (content === undefined) {
|
||||
this.setEnabled(false);
|
||||
return this.getEnabled();
|
||||
}
|
||||
return content.enabled;
|
||||
}
|
||||
|
||||
setEnabled(enabled) {
|
||||
// set sleeptracking state
|
||||
require("Storage").writeJSON(this.filename, {"enabled": enabled});
|
||||
}
|
||||
}
|
||||
|
||||
function startTracking() {
|
||||
var config = new SleepAsAndroidConfig();
|
||||
config.setEnabled(true);
|
||||
}
|
||||
|
||||
function stopTracking() {
|
||||
var config = new SleepAsAndroidConfig();
|
||||
config.setEnabled(false);
|
||||
}
|
||||
|
||||
// (() => {eval(require("Storage").read("sleepasandroid.conf.js"));stopTracking();})();
|
||||
// (() => {eval(require("Storage").read("sleepasandroid.conf.js"));startTracking();})();
|
|
@ -1,16 +1,21 @@
|
|||
{
|
||||
"id": "sleepasandroid",
|
||||
"name": "Send data to sleep as android",
|
||||
"shortName": "BLE sleep as android",
|
||||
"name": "Sleep as Android data provider",
|
||||
"shortName": "BLE Sleep as Android",
|
||||
"version": "0.01",
|
||||
"description": "Send sensordata to sleep as android.\n",
|
||||
"description": "This app sends accelerometer and heart rate data from your Bangle.js to the Sleep as Android app via Bluetooth (Gadgetbridge required), enabling advanced sleep tracking features.",
|
||||
"icon": "bluetooth.png",
|
||||
"type": "bootloader",
|
||||
"tags": "hrm,health,ble,bluetooth",
|
||||
"supports": ["BANGLEJS","BANGLEJS2"],
|
||||
"supports": [
|
||||
"BANGLEJS",
|
||||
"BANGLEJS2"
|
||||
],
|
||||
"readme": "README.md",
|
||||
"storage": [
|
||||
{"name":"sleepasandroid.boot.js","url":"boot.js"},
|
||||
{"name":"sleepasandroid.conf.js","url":"config.js"}
|
||||
{
|
||||
"name": "sleepasandroid.boot.js",
|
||||
"url": "boot.min.js"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue