From cc5272cd4be2ab55fa8411790082be408b586be9 Mon Sep 17 00:00:00 2001 From: Arturs Artamonovs Date: Tue, 2 Jul 2024 10:07:49 +0100 Subject: Make ADSBDecoder more modular. Integrate into LearnMapKit --- LearnMapKit/ADSBRunner.swift | 105 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 LearnMapKit/ADSBRunner.swift (limited to 'LearnMapKit/ADSBRunner.swift') diff --git a/LearnMapKit/ADSBRunner.swift b/LearnMapKit/ADSBRunner.swift new file mode 100644 index 0000000..0f09759 --- /dev/null +++ b/LearnMapKit/ADSBRunner.swift @@ -0,0 +1,105 @@ +// +// ADSBRunner.swift +// LearnMapKit +// +// Created by Jacky Jack on 28/06/2024. +// + +import Foundation + +struct ADSBLocation { + let address: Int + let lat: Double + let long: Double + //let alt: Int +} + +struct ADSBAltitude { + let address: Int + let altitude: Int +} + +struct ADSBICAOname { + let address: Int + let ICAOname: String +} + +class ADSBFileRunner { + + var filename: URL + //track all airplanes + var tracker = AirPlaneTracker() + var adsb_source: String = "" + + init(filename:String) { + self.filename = URL(fileURLWithPath:filename) + } + + func openFile() { + print("File location [\(filename.absoluteString)]") + + //check if file excists + if (checkIfFileExists(filename.path) == false) { + print("Supplied path \(filename.path) doesnt exists") + exit(1) + } + } + + func readFile() { + //load the file with adsb data + do { + adsb_source = try String(contentsOfFile: filename.path) + print("Loaded \(adsb_source.count) bytes") + } catch { + print("Couldn't load text from a file \(filename.path)") + exit(1) + } + print("If there anything new in file") + } + + func decode() { + for line in self.adsb_source.components(separatedBy: .newlines) { + var found=false + do { + if let tokenMatch = try matchADSBLong.prefixMatch(in: line) { + //print("\(String(tokenMatch.output))") + found = true + let str = String(tokenMatch.output) + let startIndex = str.index(str.startIndex, offsetBy: 1) + let endIndex = str.index(str.endIndex, offsetBy: -2) + let decoder = Decoder(String(str[startIndex...endIndex])) + if decoder.DataFormat == 17 { + if let d17 = decoder.getDataFormat17() { + if (d17.TypeCode == 4) { + if let indentification = d17.messageIdentification { + tracker.addDF17Indentification(d17.AddressAnnounced, indentification.ICAOName) + } + } else if (d17.TypeCode >= 9 && d17.TypeCode <= 18) { + if let airbornposition = d17.messageAirbornPositon { + tracker.addDF17AirBornPosition( + d17.AddressAnnounced, + airbornposition.Latitude, + airbornposition.Longitude, + airbornposition.Altitude, + airbornposition.CPRFormat == 0 + ) + if let position = tracker.getPosition(d17.AddressAnnounced) { + print("position: \(position)") + } + } + } + } + } + }; + } catch { + print("Error") + } + + if (found == false) { + print("Unknown adsb data line \(line)") + } + } + //try to free the string after decoded + //adsb_source = "" + } +} -- cgit v1.2.3