Initial solution

This commit is contained in:
Philip Abbey
2024-03-20 23:33:13 +00:00
parent eebf5c9dcd
commit cacd9f856f
6 changed files with 74 additions and 30 deletions

View File

@ -31,7 +31,8 @@ class HomeAssistantApp extends Application.AppBase {
private var mMenuStatus as Lang.String or Null;
private var mHaMenu as HomeAssistantView or Null;
private var mQuitTimer as QuitTimer or Null;
private var mTimer as Timer.Timer or Null;
private var mGlanceTimer as Timer.Timer or Null;
private var mUpdateTimer as Timer.Timer or Null;
// Array initialised by onReturnFetchMenuConfig()
private var mItemsToUpdate as Lang.Array<HomeAssistantToggleMenuItem or HomeAssistantTemplateMenuItem> or Null;
private var mNextItemToUpdate as Lang.Number = 0; // Index into the above array
@ -87,11 +88,11 @@ class HomeAssistantApp extends Application.AppBase {
// Return the initial view of your application here
function getInitialView() as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>? {
mIsApp = true;
mQuitTimer = new QuitTimer();
// RezStrings.update();
mApiStatus = WatchUi.loadResource($.Rez.Strings.Checking) as Lang.String;
mMenuStatus = WatchUi.loadResource($.Rez.Strings.Checking) as Lang.String;
mIsApp = true;
mQuitTimer = new QuitTimer();
mUpdateTimer = new Timer.Timer();
mApiStatus = WatchUi.loadResource($.Rez.Strings.Checking) as Lang.String;
mMenuStatus = WatchUi.loadResource($.Rez.Strings.Checking) as Lang.String;
Settings.update();
if (Settings.getApiKey().length() == 0) {
@ -393,15 +394,24 @@ class HomeAssistantApp extends Application.AppBase {
WatchUi.pushView(mHaMenu, new HomeAssistantViewDelegate(true), WatchUi.SLIDE_IMMEDIATE);
}
function updateNextMenuItem() as Void {
var delay = Settings.getPollDelay();
if (delay >= 50) { // Minimum 50 ms delay for Timers
mUpdateTimer.start(method(:updateNextMenuItemInt), delay, false);
} else {
updateNextMenuItemInt();
}
}
// We need to spread out the API calls so as not to overload the results queue and cause Communications.BLE_QUEUE_FULL
// (-101) error. This function is called by a timer every Globals.menuItemUpdateInterval ms.
function updateNextMenuItem() as Void {
function updateNextMenuItemInt() as Void {
var itu = mItemsToUpdate as Lang.Array<HomeAssistantToggleMenuItem>;
if (itu != null) {
itu[mNextItemToUpdate].getState();
mNextItemToUpdate = (mNextItemToUpdate + 1) % itu.size();
// } else {
// System.println("HomeAssistantApp updateNextMenuItem(): No menu items to update");
// System.println("HomeAssistantApp updateNextMenuItemInt(): No menu items to update");
}
}
@ -415,13 +425,14 @@ class HomeAssistantApp extends Application.AppBase {
mMenuStatus = WatchUi.loadResource($.Rez.Strings.Checking) as Lang.String;
updateStatus();
Settings.update();
mTimer = new Timer.Timer();
mTimer.start(method(:updateStatus), Globals.scApiBackoff, true);
mGlanceTimer = new Timer.Timer();
mGlanceTimer.start(method(:updateStatus), Globals.scApiBackoff, true);
return [new HomeAssistantGlanceView(self)];
}
// Required for the Glance update timer.
function updateStatus() as Void {
mGlanceTimer = null;
fetchMenuConfig();
fetchApiStatus();
}

View File

@ -36,6 +36,7 @@ class Settings {
private static var mClearCache as Lang.Boolean = false;
private static var mVibrate as Lang.Boolean = false;
private static var mAppTimeout as Lang.Number = 0; // seconds
private static var mPollDelay as Lang.Number = 0; // milliseconds
private static var mConfirmTimeout as Lang.Number = 3; // seconds
private static var mMenuAlignment as Lang.Number = WatchUi.MenuItem.MENU_ITEM_LABEL_ALIGN_LEFT;
private static var mIsBatteryLevelEnabled as Lang.Boolean = false;
@ -56,11 +57,18 @@ class Settings {
mClearCache = Properties.getValue("clear_cache");
mVibrate = Properties.getValue("enable_vibration");
mAppTimeout = Properties.getValue("app_timeout");
mPollDelay = Properties.getValue("poll_delay");
mConfirmTimeout = Properties.getValue("confirm_timeout");
mMenuAlignment = Properties.getValue("menu_alignment");
mIsBatteryLevelEnabled = Properties.getValue("enable_battery_level");
mBatteryRefreshRate = Properties.getValue("battery_level_refresh_rate");
// There's a minimum of 50 ms on Timer.Timers, so reset to 0 if too small.
if (mPollDelay < 50) { // milliseconds
mPollDelay = 0;
Properties.setValue("poll_delay", mPollDelay);
}
if (System has :ServiceDelegate) {
mHasService = true;
}
@ -138,6 +146,10 @@ class Settings {
return mAppTimeout * 1000; // Convert to milliseconds
}
static function getPollDelay() as Lang.Number {
return mPollDelay;
}
static function getConfirmTimeout() as Lang.Number {
return mConfirmTimeout * 1000; // Convert to milliseconds
}
@ -153,4 +165,5 @@ class Settings {
Background.deleteTemporalEvent();
}
}
}