summaryrefslogtreecommitdiff
path: root/LearnMapKit/DataSources/ADSBDataSource.swift
diff options
context:
space:
mode:
authorArturs Artamonovs <arturs.artamonovs@protonmail.com>2025-11-17 00:44:09 +0000
committerArturs Artamonovs <arturs.artamonovs@protonmail.com>2025-11-17 00:44:09 +0000
commite26830439dfdb97c1d685bf5cda05a5d2df9f21f (patch)
tree85a16662d47787d0975c05a22727ad4301d0fb5b /LearnMapKit/DataSources/ADSBDataSource.swift
parent2b599499dc26f0f93537d1bea4733eae68333a1c (diff)
downloadADSBDecoder-e26830439dfdb97c1d685bf5cda05a5d2df9f21f.tar.gz
ADSBDecoder-e26830439dfdb97c1d685bf5cda05a5d2df9f21f.zip
refactor experiment
Diffstat (limited to 'LearnMapKit/DataSources/ADSBDataSource.swift')
-rw-r--r--LearnMapKit/DataSources/ADSBDataSource.swift92
1 files changed, 92 insertions, 0 deletions
diff --git a/LearnMapKit/DataSources/ADSBDataSource.swift b/LearnMapKit/DataSources/ADSBDataSource.swift
new file mode 100644
index 0000000..b30e344
--- /dev/null
+++ b/LearnMapKit/DataSources/ADSBDataSource.swift
@@ -0,0 +1,92 @@
+//
+// ADSBDataSource.swift
+// LearnMapKit
+//
+// Created for MVVM refactoring
+//
+
+import Foundation
+import Combine
+
+// MARK: - Data Source Protocol
+protocol ADSBDataSource: AnyObject {
+ var dataStream: AnyPublisher<ADSBDataEvent, Never> { get }
+ var connectionState: AnyPublisher<DataSourceState, Never> { get }
+ var configuration: DataSourceConfiguration { get }
+
+ func configure(with config: DataSourceConfiguration) async
+ func start() async throws
+ func stop() async
+ func reconnect() async throws
+}
+
+// MARK: - Data Events
+enum ADSBDataEvent {
+ case aircraftIdentification(address: Int, icaoName: String)
+ case aircraftPosition(address: Int, latitude: Double, longitude: Double)
+ case aircraftAltitude(address: Int, altitude: Int)
+ case rawMessage(String)
+ case error(Error)
+}
+
+// MARK: - Data Source State
+enum DataSourceState: Equatable {
+ case idle
+ case configuring
+ case connecting
+ case connected
+ case disconnected
+ case error(String)
+
+ static func == (lhs: DataSourceState, rhs: DataSourceState) -> Bool {
+ switch (lhs, rhs) {
+ case (.idle, .idle), (.configuring, .configuring),
+ (.connecting, .connecting), (.connected, .connected),
+ (.disconnected, .disconnected):
+ return true
+ case let (.error(lhsError), .error(rhsError)):
+ return lhsError == rhsError
+ default:
+ return false
+ }
+ }
+}
+
+// MARK: - Configuration
+protocol DataSourceConfiguration {
+ var sourceType: DataSourceType { get }
+}
+
+enum DataSourceType {
+ case file(path: String)
+ case network(host: String, port: Int)
+ case test(mockData: [String])
+}
+
+struct FileDataSourceConfiguration: DataSourceConfiguration {
+ let sourceType: DataSourceType
+ let filePath: String
+ let processRate: Int // messages per second
+
+ init(filePath: String, processRate: Int = 120) {
+ self.filePath = filePath
+ self.processRate = processRate
+ self.sourceType = .file(path: filePath)
+ }
+}
+
+struct NetworkDataSourceConfiguration: DataSourceConfiguration {
+ let sourceType: DataSourceType
+ let hostname: String
+ let port: Int
+ let reconnectAttempts: Int
+ let timeoutInterval: TimeInterval
+
+ init(hostname: String, port: Int, reconnectAttempts: Int = 3, timeoutInterval: TimeInterval = 10.0) {
+ self.hostname = hostname
+ self.port = port
+ self.reconnectAttempts = reconnectAttempts
+ self.timeoutInterval = timeoutInterval
+ self.sourceType = .network(host: hostname, port: port)
+ }
+} \ No newline at end of file