summaryrefslogtreecommitdiff
path: root/LearnMapKit
diff options
context:
space:
mode:
Diffstat (limited to 'LearnMapKit')
-rw-r--r--LearnMapKit/ADSBDataQueue.swift122
-rw-r--r--LearnMapKit/ADSBFileRunner.swift (renamed from LearnMapKit/ADSBRunner.swift)119
-rw-r--r--LearnMapKit/ADSBNetRunner.swift111
-rw-r--r--LearnMapKit/FlighState.swift126
4 files changed, 330 insertions, 148 deletions
diff --git a/LearnMapKit/ADSBDataQueue.swift b/LearnMapKit/ADSBDataQueue.swift
new file mode 100644
index 0000000..ada0ab5
--- /dev/null
+++ b/LearnMapKit/ADSBDataQueue.swift
@@ -0,0 +1,122 @@
+//
+// ADSBDataQueue.swift
+// LearnMapKit
+//
+// Created by Jacky Jack on 05/08/2024.
+//
+
+import Foundation
+import Collections
+
+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
+}
+
+enum DataStreamType {
+ case EMPTY
+ case ADSB_ICAO
+ case ADSB_LOCATION
+ case ADSB_ALTITUDE
+}
+
+//get stream of decoded data, to tagged stream so all can be processed in sequence
+class ADSBDataQueue {
+ //var icaoQueue: Deque<ADSBICAOname> = []
+ var icaoArray: Array<ADSBICAOname> = []
+ var altQueue: Deque<ADSBAltitude> = []
+ var locQueue: Deque<ADSBLocation> = []
+ //var tagQueue: Deque<> = []
+ var tagArray: Array<DataStreamType> = []
+
+ func getNextTag() -> DataStreamType {
+ if tagArray.count < 0 {
+ return DataStreamType.EMPTY
+ }
+ return tagArray[tagArray.count-1]
+ }
+
+ func addIcaoName(_ address: Int, _ icaoname: String) {
+ tagArray.append(DataStreamType.ADSB_ICAO)
+ icaoArray.append(ADSBICAOname(address: address, ICAOname: icaoname))
+ }
+
+ func addAltitude(_ address: Int, _ altitude: Int) {
+ tagArray.append(DataStreamType.ADSB_ALTITUDE)
+ altQueue.append(ADSBAltitude(address: address, altitude: altitude))
+ }
+
+ func addLocation(_ address: Int, _ lat: Double, _ long: Double) {
+ tagArray.append(DataStreamType.ADSB_LOCATION)
+ locQueue.append(ADSBLocation(address: address, lat: lat, long: long))
+ }
+
+ func getIcaoName() -> ADSBICAOname {
+ if tagArray.count < 1 {
+ print("ADSB tag Queue is empty")
+ return ADSBICAOname(address:0,ICAOname: "TEmpty")
+ }
+ let tag = tagArray[tagArray.count-1]
+ if tag != DataStreamType.ADSB_ICAO {
+ print("ADSB Queue empty")
+ return ADSBICAOname(address:0,ICAOname: "QEmpty")
+ }
+ tagArray.removeLast()
+ var ret_icao_name = ADSBICAOname(address:0, ICAOname: "Default")
+ if let last_icao_name = icaoArray.popLast() {
+ ret_icao_name = last_icao_name
+ }
+ return ret_icao_name
+ }
+
+ func getAltitude() -> ADSBAltitude {
+ if tagArray.count < 1 {
+ print("ADSB tag Queue is empty")
+ return ADSBAltitude(address:0,altitude:0)
+ }
+ let tag = tagArray[tagArray.count-1]
+ if tag != DataStreamType.ADSB_ALTITUDE {
+ print("ADSB Queue empty")
+ return ADSBAltitude(address:0,altitude:0)
+ }
+ tagArray.removeLast()
+ return altQueue.popLast()!
+ }
+
+ func getLocation() -> ADSBLocation {
+ if tagArray.count < 1 {
+ print("ADSB tag Queue is empry")
+ return ADSBLocation(address:0,lat:0.0,long:0.0)
+ }
+ let tag = tagArray[tagArray.count-1]
+ if tag != DataStreamType.ADSB_LOCATION {
+ print("ADSB Queue empty")
+ return ADSBLocation(address:0,lat:0.0,long:0.0)
+ }
+ tagArray.removeLast()
+ return locQueue.popLast()!
+ }
+
+ func haveNum(_ num: Int) -> Bool {
+ if (tagArray.count > num) {
+ return true
+ }
+ return false
+ }
+
+ func getCount() -> Int {
+ return tagArray.count
+ }
+}
diff --git a/LearnMapKit/ADSBRunner.swift b/LearnMapKit/ADSBFileRunner.swift
index e05978c..d61b91b 100644
--- a/LearnMapKit/ADSBRunner.swift
+++ b/LearnMapKit/ADSBFileRunner.swift
@@ -8,121 +8,7 @@
import Foundation
import Collections
-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
-}
-
-enum DataStreamType {
- case EMPTY
- case ADSB_ICAO
- case ADSB_LOCATION
- case ADSB_ALTITUDE
-}
-
-//get stream of decoded data, to tagged stream so all can be processed in sequence
-class ADSBDataQueue {
- //var icaoQueue: Deque<ADSBICAOname> = []
- var icaoArray: Array<ADSBICAOname> = []
- var altQueue: Deque<ADSBAltitude> = []
- var locQueue: Deque<ADSBLocation> = []
- //var tagQueue: Deque<> = []
- var tagArray: Array<DataStreamType> = []
-
- func getNextTag() -> DataStreamType {
- if tagArray.count < 0 {
- return DataStreamType.EMPTY
- }
- return tagArray[tagArray.count-1]
- }
-
- func addIcaoName(_ address: Int, _ icaoname: String) {
- tagArray.append(DataStreamType.ADSB_ICAO)
- icaoArray.append(ADSBICAOname(address: address, ICAOname: icaoname))
- }
-
- func addAltitude(_ address: Int, _ altitude: Int) {
- tagArray.append(DataStreamType.ADSB_ALTITUDE)
- altQueue.append(ADSBAltitude(address: address, altitude: altitude))
- }
-
- func addLocation(_ address: Int, _ lat: Double, _ long: Double) {
- tagArray.append(DataStreamType.ADSB_LOCATION)
- locQueue.append(ADSBLocation(address: address, lat: lat, long: long))
- }
-
- func getIcaoName() -> ADSBICAOname {
- if tagArray.count < 1 {
- print("ADSB tag Queue is empty")
- return ADSBICAOname(address:0,ICAOname: "TEmpty")
- }
- let tag = tagArray[tagArray.count-1]
- if tag != DataStreamType.ADSB_ICAO {
- print("ADSB Queue empty")
- return ADSBICAOname(address:0,ICAOname: "QEmpty")
- }
- tagArray.removeLast()
- var ret_icao_name = ADSBICAOname(address:0, ICAOname: "Default")
- if let last_icao_name = icaoArray.popLast() {
- ret_icao_name = last_icao_name
- }
- return ret_icao_name
- }
-
- func getAltitude() -> ADSBAltitude {
- if tagArray.count < 1 {
- print("ADSB tag Queue is empry")
- return ADSBAltitude(address:0,altitude:0)
- }
- let tag = tagArray[tagArray.count-1]
- if tag != DataStreamType.ADSB_ALTITUDE {
- print("ADSB Queue empty")
- return ADSBAltitude(address:0,altitude:0)
- }
- tagArray.removeLast()
- return altQueue.popLast()!
- }
-
- func getLocation() -> ADSBLocation {
- if tagArray.count < 1 {
- print("ADSB tag Queue is empry")
- return ADSBLocation(address:0,lat:0.0,long:0.0)
- }
- let tag = tagArray[tagArray.count-1]
- if tag != DataStreamType.ADSB_LOCATION {
- print("ADSB Queue empty")
- return ADSBLocation(address:0,lat:0.0,long:0.0)
- }
- tagArray.removeLast()
- return locQueue.popLast()!
- }
-
- func haveNum(_ num: Int) -> Bool {
- if (tagArray.count > num) {
- return true
- }
- return false
- }
-
- func getCount() -> Int {
- return tagArray.count
- }
-}
-
class ADSBFileRunner {
-
var filename: URL
//track all airplanes
var tracker = AirPlaneTracker()
@@ -169,7 +55,7 @@ class ADSBFileRunner {
print("If there anything new in file")
}
- func decode() {
+ func decodeFromFile() {
for line in self.adsb_source.components(separatedBy: .newlines) {
var found=false
do {
@@ -201,7 +87,6 @@ class ADSBFileRunner {
adsb_tag_stream.addAltitude(d17.AddressAnnounced, tracker.getAltitude(d17.AddressAnnounced)!)
let location = tracker.getPosition(d17.AddressAnnounced)!
adsb_tag_stream.addLocation(d17.AddressAnnounced, location.0, location.1)
-
}
}
}
@@ -260,3 +145,5 @@ class ADSBFileRunner {
return self.adsb_tag_stream.getCount()
}
}
+
+
diff --git a/LearnMapKit/ADSBNetRunner.swift b/LearnMapKit/ADSBNetRunner.swift
new file mode 100644
index 0000000..7125615
--- /dev/null
+++ b/LearnMapKit/ADSBNetRunner.swift
@@ -0,0 +1,111 @@
+//
+// ADSBNetRunner.swift
+// LearnMapKit
+//
+// Created by Jacky Jack on 05/08/2024.
+//
+
+import Foundation
+
+class ADSBNetRunner {
+ var address = ""
+ var port = 0
+ var tracker = AirPlaneTracker()
+ var adsb_tag_stream = ADSBDataQueue()
+ var ADSBClient:NetADSBDecoder!
+ var timer: Timer?
+
+ init(address:String, port:Int) {
+ self.address = address
+ self.port = port
+ }
+
+ func start() {
+ var found: Bool = false
+ let adsb_net_decoder = NetADSBDecoder(host: self.address, port: self.port)
+ //var _adsb_tag_stream = ADSBDataQueue()
+ //var _tracker = AirPlaneTracker()
+ print("_start ADSBNetRunner")
+ timer = Timer.scheduledTimer(
+ withTimeInterval: 1,
+ repeats: true
+ ) { _ in
+ print("Timer drain queue")
+ print("\(adsb_net_decoder.msgarray.message_array.count)")
+ if adsb_net_decoder.msgarray.message_array.count > 0 {
+ print(adsb_net_decoder.msgarray.message_array.count)
+ for _ in 0..<adsb_net_decoder.msgarray.message_array.count-1 {
+ found = false
+ //print(adsb_net_decoder.msgarray.message_array.popLast()!,terminator: "")
+ if let msg = adsb_net_decoder.msgarray.message_array.popLast() {
+ //print("msg:[\(msg)]")
+ do {
+ if let tokenMatch = try matchADSBLong.prefixMatch(in: msg) {
+ //print("token output \(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 {
+ self.tracker.addDF17Indentification(d17.AddressAnnounced, indentification.ICAOName)
+ self.adsb_tag_stream.addIcaoName(d17.AddressAnnounced, self.tracker.getICAOname(d17.AddressAnnounced)!)
+ }
+ } else if (d17.TypeCode >= 9 && d17.TypeCode <= 18) {
+ if let airbornposition = d17.messageAirbornPositon {
+ self.tracker.addDF17AirBornPosition(
+ d17.AddressAnnounced,
+ airbornposition.Latitude,
+ airbornposition.Longitude,
+ airbornposition.Altitude,
+ airbornposition.CPRFormat == 0
+ )
+ if let position = self.tracker.getPosition(d17.AddressAnnounced) {
+ print("position: \(position)")
+ self.adsb_tag_stream.addAltitude(d17.AddressAnnounced, self.tracker.getAltitude(d17.AddressAnnounced)!)
+ let location = self.tracker.getPosition(d17.AddressAnnounced)!
+ self.adsb_tag_stream.addLocation(d17.AddressAnnounced, location.0, location.1)
+ }
+ }
+ }
+ }
+ }
+ };
+ } catch {
+ print("Error")
+ }
+
+ if (found == false) {
+ print("Unknown adsb data line [\(msg)]")
+ }
+ }
+ }
+ }
+
+ }
+
+ DispatchQueue.global(qos: .background).async {
+ do {
+ try adsb_net_decoder.start()
+ } catch let error {
+ print("Error: \(error.localizedDescription)")
+ adsb_net_decoder.stop()
+ }
+ }
+ }
+
+ func getDataOut() {
+
+ }
+
+ func stop() {
+
+ }
+
+ func getCount() -> Int {
+ return self.adsb_tag_stream.getCount()
+ }
+}
diff --git a/LearnMapKit/FlighState.swift b/LearnMapKit/FlighState.swift
index cfb34f1..446b491 100644
--- a/LearnMapKit/FlighState.swift
+++ b/LearnMapKit/FlighState.swift
@@ -8,6 +8,7 @@
import Foundation
import Collections
+
class FlightTracker {
var last_time_seen: Int = 0
var ICAOName_avaliable = false
@@ -27,60 +28,121 @@ class FlightState: ObservableObject {
@Published var flight:[Int:FlightTracker] = [:]
//configuration options
+ let sourceFile = false
let default_file_path = "/Users/jackyjack/Downloads/2024_05_27_raw_adsb.txt"
let process_per_second = 120
+ let sourceDump1090Server = true
+ let dump1090address = "192.168.4.201"
+ let dump1090port = 30002
+
init() {
var count = 0
//let ADSBtask = ADSBFileRunner(filename: "")
- let adsb_file = ADSBFileRunner(filename: self.default_file_path)
+ //let adsb_net = ADSBNetRunner(address: dump1090address, port: dump1090port)
- 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.decode()
- print("Stop decoding data")
+ if sourceFile {
+ 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 idx in 0..<data.getCount() {
+ let nextTag = data.getNextTag()
+ if nextTag == DataStreamType.ADSB_ALTITUDE {
+ let _ = data.getAltitude()
+#warning("Implement this")
+ } else if (nextTag == DataStreamType.ADSB_ICAO) {
+ let icao = data.getIcaoName()
+ print("Tag icao \(icao) count:\(data.icaoArray.count)")
+ self.addIcaoName(icao.address, icao.ICAOname)
+ } else if (nextTag == DataStreamType.ADSB_LOCATION) {
+ print("tag location")
+ let loc = data.getLocation()
+ self.addLocation(loc.address, loc.lat, loc.long)
+ }
+ }
+
+ } else {
+ print("Data stream is empty")
+ }
+ }
+ }
}
- //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 idx in 0..<data.getCount() {
- let nextTag = data.getNextTag()
+ if sourceDump1090Server {
+ //let ADSBClient = NetADSBDecoder(host: "192.168.4.201", port: 30002)
+ let ADSBClient = ADSBNetRunner(address: "192.168.4.201", port: 30002)
+ timer = Timer.scheduledTimer(
+ withTimeInterval: 1,
+ repeats: true
+ ) { _ in
+ //print("Timer drain queue")
+ //print("\(ADSBClient.msgarray.message_array.count)")
+ /*if ADSBClient.msgarray.message_array.count > 0 {
+ print(ADSBClient.msgarray.message_array.count)
+ for i in 0..<ADSBClient.msgarray.message_array.count {
+ print(ADSBClient.msgarray.message_array.popLast()!,terminator: "")
+ }
+ }*/
+ if ADSBClient.adsb_tag_stream.getCount() > 0 {
+ print("Process onse a second")
+ for idx in 0..<ADSBClient.adsb_tag_stream.getCount() {
+ let nextTag = ADSBClient.adsb_tag_stream.getNextTag()
if nextTag == DataStreamType.ADSB_ALTITUDE {
- let _ = data.getAltitude()
+ let _ = ADSBClient.adsb_tag_stream.getAltitude()
#warning("Implement this")
} else if (nextTag == DataStreamType.ADSB_ICAO) {
- let icao = data.getIcaoName()
- print("Tag icao \(icao) count:\(data.icaoArray.count)")
+ let icao = ADSBClient.adsb_tag_stream.getIcaoName()
+ print("Tag icao \(icao) count:\(ADSBClient.adsb_tag_stream.icaoArray.count)")
self.addIcaoName(icao.address, icao.ICAOname)
} else if (nextTag == DataStreamType.ADSB_LOCATION) {
print("tag location")
- let loc = data.getLocation()
+ let loc = ADSBClient.adsb_tag_stream.getLocation()
self.addLocation(loc.address, loc.lat, loc.long)
}
}
-
- } else {
- print("Data stream is empty")
}
}
+ /*
+ DispatchQueue.global(qos: .background).async {
+ do {
+ try ADSBClient.start()
+ } catch let error {
+ print("Error: \(error.localizedDescription)")
+ ADSBClient.stop()
+ }
+ }*/
+ do {
+ print("Start")
+ try ADSBClient.start()
+ } catch let error {
+ print("Error: \(error.localizedDescription)")
+ ADSBClient.stop()
+ }
+
}
}