From b1526aec0849fdc710f98540d2928d4fe6ee3959 Mon Sep 17 00:00:00 2001 From: uvok Date: Fri, 1 Aug 2025 15:47:43 +0200 Subject: Add UB motive listing, and intergrate into View --- .../universal_blue_motive_selection.dart | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 lib/model/motive_selection/universal_blue_motive_selection.dart (limited to 'lib/model/motive_selection') 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 . + +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 _cachedMotives = []; + + UniversalBlueMotiveSelection({required UniversalBleDevice device}) + : _device = device; + + @override + Future getCurrentMotive() async { + if (_cachedMotives.isEmpty) { + return BadgeMotive(-1, "No motives"); + } + return BadgeMotive(-1, "Unspecified motive"); + } + + @override + Future> 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 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 setCurrentMotive(BadgeMotive motive) async {} +} -- cgit v1.2.3