From 38fe3d6e6b2c8de4691cb1925444aecbededba1a Mon Sep 17 00:00:00 2001 From: Matej Glejtek Date: Mon, 11 Mar 2024 15:45:04 +0100 Subject: [PATCH] feat: keep map of basic messages with id type as key DT-2987 --- lib/models/message_container.dart | 63 ++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/lib/models/message_container.dart b/lib/models/message_container.dart index 3fae962..c76e0eb 100644 --- a/lib/models/message_container.dart +++ b/lib/models/message_container.dart @@ -2,6 +2,7 @@ import 'package:dart_opendroneid/dart_opendroneid.dart'; import 'package:flutter_opendroneid/extensions/compare_extension.dart'; import 'package:flutter_opendroneid/models/constants.dart'; import 'package:flutter_opendroneid/pigeon.dart' as pigeon; +import 'package:flutter_opendroneid/utils/conversions.dart'; /// The [MessageContainer] groups together messages of different types /// from one device. It contains one instance of each message. The container is @@ -12,7 +13,7 @@ class MessageContainer { final pigeon.MessageSource source; final int? lastMessageRssi; - final BasicIDMessage? basicIdMessage; + final Map? basicIdMessages; final LocationMessage? locationMessage; final OperatorIDMessage? operatorIdMessage; final SelfIDMessage? selfIdMessage; @@ -24,7 +25,7 @@ class MessageContainer { required this.lastUpdate, required this.source, this.lastMessageRssi, - this.basicIdMessage, + this.basicIdMessages, this.locationMessage, this.operatorIdMessage, this.selfIdMessage, @@ -37,7 +38,7 @@ class MessageContainer { int? lastMessageRssi, DateTime? lastUpdate, pigeon.MessageSource? source, - BasicIDMessage? basicIdMessage, + Map? basicIdMessage, LocationMessage? locationMessage, OperatorIDMessage? operatorIdMessage, SelfIDMessage? selfIdMessage, @@ -49,7 +50,7 @@ class MessageContainer { lastMessageRssi: lastMessageRssi ?? this.lastMessageRssi, lastUpdate: lastUpdate ?? DateTime.now(), source: source ?? this.source, - basicIdMessage: basicIdMessage ?? this.basicIdMessage, + basicIdMessages: basicIdMessage ?? this.basicIdMessages, locationMessage: locationMessage ?? this.locationMessage, operatorIdMessage: operatorIdMessage ?? this.operatorIdMessage, selfIdMessage: selfIdMessage ?? this.selfIdMessage, @@ -92,16 +93,12 @@ class MessageContainer { DateTime.fromMillisecondsSinceEpoch(receivedTimestamp), source: source, ), - BasicIDMessage => basicIdMessage != null && - basicIdMessage!.containsEqualData(message as BasicIDMessage) - ? null - : copyWith( - basicIdMessage: message as BasicIDMessage, - lastMessageRssi: rssi, - lastUpdate: - DateTime.fromMillisecondsSinceEpoch(receivedTimestamp), - source: source, - ), + BasicIDMessage => _updateBasicIDMessages( + message: message as BasicIDMessage, + receivedTimestamp: receivedTimestamp, + source: source, + rssi: rssi, + ), SelfIDMessage => selfIdMessage != null && selfIdMessage!.containsEqualData(message as SelfIDMessage) ? null @@ -178,4 +175,42 @@ class MessageContainer { locationMessage!.location!.longitude <= MAX_LON && locationMessage!.location!.latitude >= MIN_LAT && locationMessage!.location!.longitude >= MIN_LON; + + /// CHeck if container contains basic id message with given uas id + bool containsUasId(String uasId) => + basicIdMessages?.values + .any((element) => element.uasID.asString() == uasId) ?? + false; + + // preferably return mesage with SerialNumber UASID, which is the default type + BasicIDMessage? get preferredBasicIdMessage { + if (basicIdMessages == null || basicIdMessages!.isEmpty) return null; + + return basicIdMessages![IDType.serialNumber] ?? + basicIdMessages!.values.first; + } + + String? get serialNumberUasId => + basicIdMessages?[IDType.serialNumber]?.uasID.asString(); + + MessageContainer? _updateBasicIDMessages({ + required BasicIDMessage message, + required int receivedTimestamp, + required pigeon.MessageSource source, + int? rssi, + }) { + if (basicIdMessages != null && + basicIdMessages![message.uasID.type] != null && + basicIdMessages![message.uasID.type]!.containsEqualData(message)) + return null; + + final newEntry = {message.uasID.type: message}; + return copyWith( + basicIdMessage: basicIdMessages == null ? newEntry : basicIdMessages! + ..addAll(newEntry), + lastMessageRssi: rssi, + lastUpdate: DateTime.fromMillisecondsSinceEpoch(receivedTimestamp), + source: source, + ); + } }