mirror of
https://github.com/zjs81/meshcore-open.git
synced 2026-04-20 22:13:48 +00:00
Open-source Flutter client for MeshCore LoRa mesh networking devices. Features: - BLE device scanning and connection - Nordic UART Service (NUS) integration - Material 3 design with system theme support - Provider-based state management - Placeholder screens for chat, contacts, and settings 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
85 lines
2.3 KiB
Dart
85 lines
2.3 KiB
Dart
class PathRecord {
|
|
final int hopCount;
|
|
final int tripTimeMs;
|
|
final DateTime timestamp;
|
|
final bool wasFloodDiscovery;
|
|
final List<int> pathBytes;
|
|
final int successCount;
|
|
final int failureCount;
|
|
|
|
PathRecord({
|
|
required this.hopCount,
|
|
required this.tripTimeMs,
|
|
required this.timestamp,
|
|
required this.wasFloodDiscovery,
|
|
required this.pathBytes,
|
|
required this.successCount,
|
|
required this.failureCount,
|
|
});
|
|
|
|
String get displayText =>
|
|
'$hopCount ${hopCount == 1 ? 'hop' : 'hops'} - ${(tripTimeMs / 1000).toStringAsFixed(2)}s';
|
|
|
|
Map<String, dynamic> toJson() {
|
|
return {
|
|
'hop_count': hopCount,
|
|
'trip_time_ms': tripTimeMs,
|
|
'timestamp': timestamp.toIso8601String(),
|
|
'was_flood': wasFloodDiscovery,
|
|
'path_bytes': pathBytes,
|
|
'success_count': successCount,
|
|
'failure_count': failureCount,
|
|
};
|
|
}
|
|
|
|
factory PathRecord.fromJson(Map<String, dynamic> json) {
|
|
return PathRecord(
|
|
hopCount: json['hop_count'] as int,
|
|
tripTimeMs: json['trip_time_ms'] as int,
|
|
timestamp: DateTime.parse(json['timestamp'] as String),
|
|
wasFloodDiscovery: json['was_flood'] as bool,
|
|
pathBytes: (json['path_bytes'] as List?)?.map((b) => b as int).toList() ?? [],
|
|
successCount: json['success_count'] as int? ?? 0,
|
|
failureCount: json['failure_count'] as int? ?? 0,
|
|
);
|
|
}
|
|
}
|
|
|
|
class ContactPathHistory {
|
|
final String contactPubKeyHex;
|
|
final List<PathRecord> recentPaths;
|
|
|
|
ContactPathHistory({
|
|
required this.contactPubKeyHex,
|
|
required this.recentPaths,
|
|
});
|
|
|
|
PathRecord? get fastest {
|
|
if (recentPaths.isEmpty) return null;
|
|
return recentPaths.reduce((a, b) => a.tripTimeMs < b.tripTimeMs ? a : b);
|
|
}
|
|
|
|
PathRecord? get mostRecent {
|
|
if (recentPaths.isEmpty) return null;
|
|
return recentPaths.first;
|
|
}
|
|
|
|
Map<String, dynamic> toJson() {
|
|
return {
|
|
'recent_paths': recentPaths.map((p) => p.toJson()).toList(),
|
|
};
|
|
}
|
|
|
|
factory ContactPathHistory.fromJson(
|
|
String contactPubKeyHex, Map<String, dynamic> json) {
|
|
final pathsList = (json['recent_paths'] as List?)
|
|
?.map((p) => PathRecord.fromJson(p as Map<String, dynamic>))
|
|
.toList() ??
|
|
[];
|
|
|
|
return ContactPathHistory(
|
|
contactPubKeyHex: contactPubKeyHex,
|
|
recentPaths: pathsList,
|
|
);
|
|
}
|
|
}
|