// // FlighState.swift // LearnMapKit // // Created by Jacky Jack on 30/06/2024. // import Foundation import Collections import SwiftUI class FlightTracker: Identifiable { var last_time_seen: Int = 0 var ICAOaddress = 0 var ICAOName_avaliable = false //@Published var ICAOName = "" var ICAOName = "" var Position_avaliable = false @Published var long:Double = 0.0 //var long:Double = 0.0 @Published var lat:Double = 0.0 //var lat:Double = 0.0 var FromTo_avaliable = false var flightFrom:String = "" var flightTo:String = "" var id: String { String(ICAOaddress) } enum CodingKeys: String, CodingKey { case ICAOName case long case lat } func encode(to encoder: any Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(self.ICAOName, forKey: .ICAOName) try container.encode(self.long, forKey: .long) try container.encode(self.lat, forKey: .lat) } } class FlightState: ObservableObject { var timer: Timer? //default location currently for testing var fromFile: Bool = false var idx_flight:[Int:Int] = [:] @Published var flight:[FlightTracker] = [] //configuration options var sourceFile = false var default_file_path = "/Users/jackyjack/Downloads/2024_05_27_raw_adsb.txt" var process_per_second = 120 var sourceDump1090Server = true var dump1090address = "192.168.4.233" var dump1090port = 30002 init() { print("Init") var count = 0 //let ADSBtask = ADSBFileRunner(filename: "") //let adsb_net = ADSBNetRunner(address: dump1090address, port: dump1090port) //if sourceFile { // startSourceFile() //} //if sourceDump1090Server { // startDump1090() //} } init(filename: String) { fileMode(filepath: filename) startSourceFile() } init(hostname: String, port: Int) { networkMode(hostname: hostname, port: port) startDump1090() } func networkMode(hostname: String, port: Int) { print("network mode") self.dump1090address = hostname self.dump1090port = port self.sourceDump1090Server = true self.sourceFile = false } func networkMode(netconfig: Binding) { print("network mode") self.dump1090address = netconfig.servername.wrappedValue self.dump1090port = netconfig.serverport.wrappedValue self.sourceDump1090Server = true self.sourceFile = false } func fileMode(filepath: String) { print("file mode") self.default_file_path = filepath self.sourceFile = true self.sourceDump1090Server = false } func defaultMode() { print("default mode") self.sourceDump1090Server = true self.sourceFile = false } func defaultMode(hostname: String, port: Int) { print("default mode net") self.sourceDump1090Server = true self.dump1090address = hostname self.dump1090port = port self.sourceFile = false } func startSourceFile() { print("Start reading ADSB messages from \(self.default_file_path)") let adsb_file = ADSBFileRunner(filename: self.default_file_path) DispatchQueue.global(qos: .background).sync { print("Open file") adsb_file.openFile() adsb_file.readFile() } DispatchQueue.global(qos: .background).async { print("Start decoding data") adsb_file.decodeFromFile() print("Stop decoding data") } //once a second read some data from decoded queue timer = Timer.scheduledTimer( withTimeInterval: 1, repeats: true ) { _ in //get the 10 entries if there is if adsb_file.jobDone() { print("Decoding done let get some data \(adsb_file.getCount())") //if adsb_file if adsb_file.getCount() > self.process_per_second { let data = adsb_file.getPlainData(self.process_per_second) //print(data.getCount()) for _ in 0.. 0 { print(ADSBClient.msgarray.message_array.count) for i in 0.. 0 { //print("Process onse a second") for _ in 0..