From eaaf2814ec1dbea28f40c7fd610647a130c19610 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 11 Feb 2022 10:05:09 +0000 Subject: [PATCH] Add Bangle.midnight event that can be used for housekeeping tasks --- ChangeLog | 1 + libs/banglejs/jswrap_bangle.c | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index f1a461416..0930d80e6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,6 +16,7 @@ Fix g.wrapString if string ends with a bitmap g.wrapString now splits long words if they are too long for a line Add Storage.getStats to get more fine-grained info about Storage + Add Bangle.midnight event that can be used for housekeeping tasks 2v12 : nRF52840: Flow control XOFF is now sent at only 3/8th full - delays in BLE mean we can sometimes fill our 1k input buffer otherwise __FILE__ is now set correctly for apps (fixes 2v11 regression) diff --git a/libs/banglejs/jswrap_bangle.c b/libs/banglejs/jswrap_bangle.c index 8fb21dd0a..e17f56916 100644 --- a/libs/banglejs/jswrap_bangle.c +++ b/libs/banglejs/jswrap_bangle.c @@ -392,7 +392,16 @@ Bangle.on('stroke',o=>{ } ``` */ +/*JSON{ + "type" : "event", + "class" : "Bangle", + "name" : "midnight", + "ifdef" : "BANGLEJS" +} +Emitted at midnight (at the point the `day` health info is reset to 0). +Can be used for housekeeping tasks that don't want to be run during the day. +*/ #define ACCEL_HISTORY_LEN 50 ///< Number of samples of accelerometer history @@ -799,6 +808,7 @@ typedef enum { JSBT_ACCEL_INTERVAL_POWERSAVE = 1<<27, ///< reschedule accelerometer poll handler to powersave speed JSBT_HRM_INSTANT_DATA = 1<<28, ///< Instant heart rate data JSBT_HEALTH = 1<<29, ///< New 'health' event + JSBT_MIDNIGHT = 1<<30, ///< Fired at midnight each day - for housekeeping tasks } JsBangleTasks; JsBangleTasks bangleTasks; @@ -1287,7 +1297,7 @@ void peripheralPollHandler() { } #endif - // Health tracking + // Health tracking + midnight event // Did we enter a new 10 minute interval? JsVarFloat msecs = jshGetMillisecondsFromTime(time); uint8_t healthIndex = (uint8_t)(msecs/HEALTH_INTERVAL); @@ -1297,10 +1307,12 @@ void peripheralPollHandler() { healthStateClear(&healthCurrent); healthCurrent.index = healthIndex; bangleTasks |= JSBT_HEALTH; + jshHadEvent(); // What if we've changed day? TimeInDay td = getTimeFromMilliSeconds(msecs, false/*forceGMT*/); uint8_t dayIndex = (uint8_t)td.daysSinceEpoch; if (dayIndex != healthDaily.index) { + bangleTasks |= JSBT_MIDNIGHT; healthStateClear(&healthDaily); healthDaily.index = dayIndex; } @@ -3521,6 +3533,10 @@ bool jswrap_banglejs_idle() { jsvUnLock(o); } } + if (bangleTasks & JSBT_MIDNIGHT) { + jsiQueueObjectCallbacks(bangle, JS_EVENT_PREFIX"midnight", NULL, 0); + } + JSBT_MIDNIGHT if (bangleTasks & JSBT_GESTURE_DATA) { if (jsiObjectHasCallbacks(bangle, JS_EVENT_PREFIX"gesture")) { JsVar *arr = jsvNewTypedArray(ARRAYBUFFERVIEW_INT8, accGestureRecordedCount*3);