diff options
author | uvok | 2025-08-01 15:47:43 +0200 |
---|---|---|
committer | uvok | 2025-08-01 15:47:43 +0200 |
commit | b1526aec0849fdc710f98540d2928d4fe6ee3959 (patch) | |
tree | 22d36a364dbbeb0ad9c581a873d7097378d63e36 /lib/model/motive_selection | |
parent | 220eae3eb135eac5b03122d95d6fbc8c3bde2513 (diff) |
Add UB motive listing, and intergrate into View
Diffstat (limited to 'lib/model/motive_selection')
-rw-r--r-- | lib/model/motive_selection/universal_blue_motive_selection.dart | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/lib/model/motive_selection/universal_blue_motive_selection.dart b/lib/model/motive_selection/universal_blue_motive_selection.dart new file mode 100644 index 0000000..86429b6 --- /dev/null +++ b/lib/model/motive_selection/universal_blue_motive_selection.dart @@ -0,0 +1,76 @@ +// Copyright (C) 2025, uvok cheetah +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <https://www.gnu.org/licenses/>. + +import 'dart:convert'; + +import 'package:universal_ble/universal_ble.dart'; +import 'package:uvok_epaper_badge/model/badge_motive.dart'; +import 'package:uvok_epaper_badge/model/device/universal_ble_device.dart'; +import 'package:uvok_epaper_badge/model/motive_selection/badge_motive_selection.dart'; + +class UniversalBlueMotiveSelection implements BadgeMotiveSelection { + final UniversalBleDevice _device; + final String _badgeService = "ca260000-b4bb-46b2-bd06-b7b7a61ea990"; + final String _currentMotiveCharacteristic = + "ca260001-b4bb-46b2-bd06-b7b7a61ea990"; + final String _availableMotivesCharacteristic = + "ca260002-b4bb-46b2-bd06-b7b7a61ea990"; + + List<BadgeMotive> _cachedMotives = []; + + UniversalBlueMotiveSelection({required UniversalBleDevice device}) + : _device = device; + + @override + Future<BadgeMotive> getCurrentMotive() async { + if (_cachedMotives.isEmpty) { + return BadgeMotive(-1, "No motives"); + } + return BadgeMotive(-1, "Unspecified motive"); + } + + @override + Future<List<BadgeMotive>> getMotives() async { + bool gotMotives = false; + if (await _device.device.connectionState == BleConnectionState.connected) { + var c = await _device.device.getCharacteristic( + _availableMotivesCharacteristic, + service: _badgeService, + ); + var val = await c.read(); + var templates = ascii.decode(val); + _cachedMotives = templates + .split(";") + .where((s) => s.isNotEmpty) + .map((String s) { + List<String> parts = s.split("-"); + if (parts.length != 2) { + return BadgeMotive(-1, "Invalid value"); + } + return BadgeMotive(int.tryParse(parts[0]) ?? -1, parts[1]); + }) + .toList(growable: false); + gotMotives = true; + } + if (!gotMotives) { + _cachedMotives = [BadgeMotive(-1, "Failed fetching motives")]; + } + + return _cachedMotives; + } + + @override + Future<void> setCurrentMotive(BadgeMotive motive) async {} +} |