import 'package:drift/drift.dart'; import '../../transport/connection_type.dart'; import 'app_database.dart'; /// Zugriff auf die Einzeilen-Einstellungstabelle (Doku 7.5): welches /// Drohnenprofil zuletzt aktiv war und welche Mission zuletzt bearbeitet /// wurde, um beide nach einem Neustart wiederherzustellen. class AppSettingsRepository { AppSettingsRepository(this._db); final AppDatabase _db; static const _rowId = 0; Future< ({ int? activeDroneProfileId, int? currentMissionId, String? connectionDeviceAddress, bool connectionAutoConnect, ConnectionType connectionType, String? connectionWifiHost, int connectionWifiPort, })> load() async { final row = await (_db.select(_db.appSettingsTable) ..where((s) => s.id.equals(_rowId))) .getSingleOrNull(); return ( activeDroneProfileId: row?.activeDroneProfileId, currentMissionId: row?.currentMissionId, connectionDeviceAddress: row?.connectionDeviceAddress, connectionAutoConnect: row?.connectionAutoConnect ?? true, connectionType: ConnectionType.values.firstWhere( (t) => t.name == row?.connectionType, orElse: () => ConnectionType.wifi, ), connectionWifiHost: row?.connectionWifiHost, connectionWifiPort: row?.connectionWifiPort ?? kDefaultWifiPort, ); } Future setActiveDroneProfileId(int? id) async { await _upsert(AppSettingsTableCompanion( id: const Value(_rowId), activeDroneProfileId: Value(id), )); } Future setCurrentMissionId(int? id) async { await _upsert(AppSettingsTableCompanion( id: const Value(_rowId), currentMissionId: Value(id), )); } /// Gemerkte Bluetooth-MAC-Adresse (Doku Kommunikationsschicht 3.2a), oder /// null um die Erinnerung zu loeschen (z.B. nach "Geraet entkoppeln"). Future loadConnectionDeviceAddress() async => (await load()).connectionDeviceAddress; Future setConnectionDeviceAddress(String? address) async { await _upsert(AppSettingsTableCompanion( id: const Value(_rowId), connectionDeviceAddress: Value(address), )); } /// "Beim Wechsel in Fly automatisch verbinden" (Doku 7), Standard an. Future setConnectionAutoConnect(bool value) async { await _upsert(AppSettingsTableCompanion( id: const Value(_rowId), connectionAutoConnect: Value(value), )); } /// Gewaehlte Verbindungsart (Doku Kommunikationsschicht 7). Future setConnectionType(ConnectionType type) async { await _upsert(AppSettingsTableCompanion( id: const Value(_rowId), connectionType: Value(type.name), )); } /// Vom Nutzer eingetragene Ziel-IP der WLAN-Bruecke (Doku 3), oder null um /// die Vorgabe zu loeschen und nur noch aus dem Verkehr zu lernen. Future loadConnectionWifiHost() async => (await load()).connectionWifiHost; Future setConnectionWifiHost(String? host) async { await _upsert(AppSettingsTableCompanion( id: const Value(_rowId), connectionWifiHost: Value(host), )); } Future loadConnectionWifiPort() async => (await load()).connectionWifiPort; Future setConnectionWifiPort(int port) async { await _upsert(AppSettingsTableCompanion( id: const Value(_rowId), connectionWifiPort: Value(port), )); } Future _upsert(AppSettingsTableCompanion companion) async { await _db.into(_db.appSettingsTable).insertOnConflictUpdate(companion); } }