Skip to content

Commit 1dc0e57

Browse files
committed
feat: Add DeviceOfflineView to handle offline state for devices
- Introduced a new DeviceOfflineView widget to display a message when the device is offline. - Updated lyfi_view.dart to use DeviceOfflineView based on device online status. - Refactored manual_editor_view.dart, sun_editor_view.dart, settings_screen.dart, and other files to replace lyfi_driver with lyfi_coap_driver. - Implemented BorneoCoapClient to manage CoAP requests and handle offline detection. - Enhanced BorneoLyfiCoapDriver to support new device capabilities and status checks. - Updated driver metadata to reflect changes in driver implementation. - Improved error handling and logging for device operations.
1 parent 4abbbe5 commit 1dc0e57

27 files changed

Lines changed: 423 additions & 153 deletions

client/lib/devices/borneo/lyfi/view_models/acclimation_view_model.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:borneo_app/devices/borneo/lyfi/view_models/base_lyfi_device_view_model.dart';
22
import 'package:borneo_common/io/net/rssi.dart';
33
import 'package:borneo_kernel/drivers/borneo/lyfi/models.dart';
4+
import 'package:cancellation_token/cancellation_token.dart';
45

56
class AcclimationViewModel extends BaseLyfiDeviceViewModel {
67
late final AcclimationSettings _origSettings;
@@ -93,7 +94,7 @@ class AcclimationViewModel extends BaseLyfiDeviceViewModel {
9394
}
9495

9596
@override
96-
Future<void> refreshStatus() async {}
97+
Future<void> refreshStatus({CancellationToken? cancelToken}) async {}
9798

9899
@override
99100
RssiLevel? get rssiLevel => null;
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import 'package:borneo_app/devices/borneo/view_models/base_borneo_device_view_model.dart';
22
import 'package:borneo_kernel/drivers/borneo/lyfi/api.dart';
3-
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_driver.dart';
3+
import 'package:borneo_kernel/drivers/borneo/lyfi/models.dart';
44

55
abstract class BaseLyfiDeviceViewModel extends BaseBorneoDeviceViewModel {
66
ILyfiDeviceApi get lyfiDeviceApi => super.boundDevice!.driver as ILyfiDeviceApi;
7+
LyfiDeviceInfo get lyfiDeviceInfo => lyfiDeviceApi.getLyfiInfo(super.boundDevice!.device);
78

89
BaseLyfiDeviceViewModel({required super.deviceID, required super.deviceManager, required super.globalEventBus});
910
}

client/lib/devices/borneo/lyfi/view_models/easy_setup_view_model.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:borneo_kernel/drivers/borneo/lyfi/models.dart';
22
import 'package:flutter/foundation.dart';
33

4-
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_driver.dart';
4+
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_coap_driver.dart';
55

66
import 'editor/schedule_editor_view_model.dart';
77

client/lib/devices/borneo/lyfi/view_models/editor/base_editor_view_model.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'package:borneo_app/devices/borneo/lyfi/view_models/editor/ieditor.dart';
33
import 'package:borneo_app/devices/borneo/lyfi/view_models/lyfi_view_model.dart';
44
import 'package:borneo_common/async/async_rate_limiter.dart';
55
import 'package:borneo_kernel/drivers/borneo/lyfi/api.dart';
6-
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_driver.dart';
6+
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_coap_driver.dart';
77
import 'package:borneo_kernel/drivers/borneo/lyfi/models.dart';
88
import 'package:flutter/material.dart';
99

client/lib/devices/borneo/lyfi/view_models/editor/ieditor.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_driver.dart';
1+
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_coap_driver.dart';
22
import 'package:borneo_kernel/drivers/borneo/lyfi/models.dart';
33
import 'package:flutter/foundation.dart';
44

client/lib/devices/borneo/lyfi/view_models/editor/manual_editor_view_model.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'package:borneo_app/devices/borneo/lyfi/view_models/editor/base_editor_view_model.dart';
2-
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_driver.dart';
2+
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_coap_driver.dart';
33
import 'package:borneo_kernel/drivers/borneo/lyfi/models.dart';
44

55
class ManualEditorViewModel extends BaseEditorViewModel {

client/lib/devices/borneo/lyfi/view_models/editor/schedule_editor_view_model.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'package:borneo_app/devices/borneo/lyfi/view_models/editor/base_editor_view_model.dart';
22
import 'package:borneo_kernel/drivers/borneo/lyfi/api.dart';
3-
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_driver.dart';
3+
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_coap_driver.dart';
44
import 'package:borneo_kernel/drivers/borneo/lyfi/models.dart';
55
import 'package:flutter/foundation.dart';
66
import 'package:flutter/material.dart';

client/lib/devices/borneo/lyfi/view_models/editor/sun_editor_view_model.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'package:borneo_app/devices/borneo/lyfi/view_models/editor/base_editor_view_model.dart';
22
import 'package:borneo_kernel/drivers/borneo/lyfi/api.dart';
3-
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_driver.dart';
3+
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_coap_driver.dart';
44
import 'package:borneo_kernel/drivers/borneo/lyfi/models.dart';
55

66
class SunEditorViewModel extends BaseEditorViewModel {

client/lib/devices/borneo/lyfi/view_models/lyfi_view_model.dart

Lines changed: 69 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import 'package:borneo_app/devices/borneo/lyfi/view_models/editor/sun_editor_vie
44
import 'package:borneo_app/devices/borneo/view_models/base_borneo_device_view_model.dart';
55
import 'package:borneo_app/services/i_app_notification_service.dart';
66
import 'package:borneo_kernel/drivers/borneo/lyfi/api.dart';
7-
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_driver.dart';
7+
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_coap_driver.dart';
88
import 'package:borneo_kernel/drivers/borneo/lyfi/models.dart';
9+
import 'package:cancellation_token/cancellation_token.dart';
910
import 'package:flutter/foundation.dart';
1011
import 'package:intl/intl.dart';
1112

@@ -37,8 +38,8 @@ class LyfiViewModel extends BaseBorneoDeviceViewModel {
3738
LedState? _ledState;
3839
LedState? get ledState => _ledState;
3940

40-
bool get canMeasureCurrent => isOnline && isOn && borneoDeviceStatus?.powerCurrent != null;
41-
bool get canMeasureVoltage => isOnline && isOn && borneoDeviceStatus?.powerVoltage != null;
41+
bool get canMeasureCurrent => super.isOnline && isOn && borneoDeviceStatus?.powerCurrent != null;
42+
bool get canMeasureVoltage => super.isOnline && isOn && borneoDeviceStatus?.powerVoltage != null;
4243
bool get canMeasurePower => canMeasureCurrent && canMeasureVoltage;
4344
double get currentWatts => (borneoDeviceStatus?.powerCurrent ?? 0) * (borneoDeviceStatus?.powerVoltage ?? 0);
4445

@@ -50,16 +51,17 @@ class LyfiViewModel extends BaseBorneoDeviceViewModel {
5051

5152
bool get canLockOrUnlock => !isBusy && isOn;
5253
bool get canUnlock =>
53-
!isBusy && isOnline && isOn && isLocked && (_ledState == LedState.normal || _ledState == LedState.temporary);
54+
!isBusy &&
55+
super.isOnline &&
56+
isOn &&
57+
isLocked &&
58+
(_ledState == LedState.normal || _ledState == LedState.temporary);
5459
bool get canTimedOn => !isBusy && (!isOn || _mode == LedRunningMode.scheduled);
5560

5661
IEditor? currentEditor;
5762
final List<ScheduledInstant> scheduledInstants = [];
5863
final List<ScheduledInstant> sunInstants = [];
5964

60-
// Borneo device general status and info
61-
GeneralBorneoDeviceInfo get borneoDeviceInfo => _deviceApi.getGeneralDeviceInfo(super.boundDevice!.device);
62-
6365
LyfiDeviceStatus? _lyfiDeviceStatus;
6466
LyfiDeviceStatus? get lyfiDeviceStatus => _lyfiDeviceStatus;
6567

@@ -130,7 +132,7 @@ class LyfiViewModel extends BaseBorneoDeviceViewModel {
130132
@override
131133
void dispose() {
132134
//
133-
if (!_isLocked && isOnline) {
135+
if (!_isLocked && super.isOnline) {
134136
try {
135137
_deviceApi.switchState(boundDevice!.device, LedState.normal).then((_) {
136138
_isLocked = true;
@@ -143,8 +145,63 @@ class LyfiViewModel extends BaseBorneoDeviceViewModel {
143145
}
144146

145147
@override
146-
Future<void> refreshStatus() async {
147-
if (!isOnline) {
148+
Future<void> onDeviceBound() async {
149+
super.onDeviceBound();
150+
151+
for (int i = 0; i < lyfiDeviceInfo.channels.length; i++) {
152+
_channels.add(ValueNotifier(0));
153+
}
154+
155+
_temporaryDuration = await _deviceApi.getTemporaryDuration(boundDevice!.device); // TODO add cancallabne
156+
157+
await refreshStatus();
158+
159+
switch (mode) {
160+
case LedRunningMode.scheduled:
161+
if (scheduledInstants.isEmpty) {
162+
scheduledInstants.addAll(await _deviceApi.getSchedule(boundDevice!.device));
163+
}
164+
break;
165+
166+
case LedRunningMode.sun:
167+
if (sunInstants.isEmpty) {
168+
sunInstants.addAll(await _deviceApi.getSunSchedule(boundDevice!.device));
169+
}
170+
break;
171+
172+
default:
173+
break;
174+
}
175+
176+
// Update schedule
177+
if (!_isLocked) {
178+
_toggleEditor(_mode);
179+
}
180+
181+
await refreshStatus();
182+
}
183+
184+
@override
185+
void onDeviceRemoved() {
186+
super.onDeviceRemoved();
187+
188+
_isOn = false;
189+
_mode = LedRunningMode.manual;
190+
_ledState = LedState.normal;
191+
192+
_overallBrightness = 0.0;
193+
_fanPowerRatio = 0.0;
194+
195+
_isLocked = true;
196+
if (currentEditor != null) {
197+
currentEditor!.dispose();
198+
currentEditor = null;
199+
}
200+
}
201+
202+
@override
203+
Future<void> refreshStatus({CancellationToken? cancelToken}) async {
204+
if (!super.isOnline) {
148205
return;
149206
}
150207
await super.refreshStatus();
@@ -161,7 +218,7 @@ class LyfiViewModel extends BaseBorneoDeviceViewModel {
161218
}
162219

163220
Future<void> _fetchDeviceStatus() async {
164-
if (!isOnline) {
221+
if (!super.isOnline) {
165222
return;
166223
}
167224

@@ -308,7 +365,7 @@ class LyfiViewModel extends BaseBorneoDeviceViewModel {
308365
notification: notification,
309366
address: deviceEntity.address,
310367
borneoStatus: borneoDeviceStatus!,
311-
borneoInfo: borneoDeviceInfo,
368+
borneoInfo: super.borneoDeviceInfo!,
312369
ledInfo: lyfiDeviceInfo,
313370
ledStatus: lyfiDeviceStatus!,
314371
powerBehavior: await _deviceApi.getPowerBehavior(boundDevice!.device),

client/lib/devices/borneo/lyfi/view_models/settings_view_model.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'package:cancellation_token/cancellation_token.dart';
88
import 'package:geolocator/geolocator.dart';
99

1010
import 'package:borneo_kernel/drivers/borneo/borneo_device_api.dart';
11-
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_driver.dart';
11+
import 'package:borneo_kernel/drivers/borneo/lyfi/lyfi_coap_driver.dart';
1212
import 'package:latlong2/latlong.dart';
1313

1414
class SettingsViewModel extends BaseLyfiDeviceViewModel {

0 commit comments

Comments
 (0)