summaryrefslogtreecommitdiff
path: root/ADSBDecoder/AirplaneTracker.swift
diff options
context:
space:
mode:
authorArturs Artamonovs <arturs.artamonovs@protonmail.com>2024-06-26 08:29:38 +0100
committerArturs Artamonovs <arturs.artamonovs@protonmail.com>2024-06-26 08:29:38 +0100
commit58d9d561df35f88884b2959d2cf322f1ee69e3cd (patch)
treed90eb046a4e508bc64adcce558079048e364dd96 /ADSBDecoder/AirplaneTracker.swift
parentde4f742388002e5b8307903369727300dd3e6049 (diff)
downloadADSBDecoder-58d9d561df35f88884b2959d2cf322f1ee69e3cd.tar.gz
ADSBDecoder-58d9d561df35f88884b2959d2cf322f1ee69e3cd.zip
Decoding lat/lon seems to work
Diffstat (limited to 'ADSBDecoder/AirplaneTracker.swift')
-rw-r--r--ADSBDecoder/AirplaneTracker.swift110
1 files changed, 110 insertions, 0 deletions
diff --git a/ADSBDecoder/AirplaneTracker.swift b/ADSBDecoder/AirplaneTracker.swift
new file mode 100644
index 0000000..0ac8bfc
--- /dev/null
+++ b/ADSBDecoder/AirplaneTracker.swift
@@ -0,0 +1,110 @@
+//
+// AirplaneTracker.swift
+// ADSBDecoder
+//
+// Created by Jacky Jack on 20/06/2024.
+//
+
+import Foundation
+
+struct Airplane {
+ var addressReady:Bool = false
+ var Address:Int
+ var ICAOready:Bool = false
+ var ICAOname:String = ""
+ var locationReady:Bool = false
+ var lat:Double = 0.0
+ var long:Double = 0.0
+ var altitudeReady:Bool = false
+ var altitude:Int = 0
+ var altitudeCount:Int = 0
+ var positionDecoder:PositionDecoder = PositionDecoder()
+}
+
+class AirPlaneTracker {
+
+ var airplanes:[Int:Airplane] = [:]
+
+ init () {
+
+ }
+
+ func addDF17Indentification(_ address: Int, _ ICAOname: String) {
+ if (airplanes[address] == nil) {
+ airplanes[address] = Airplane(addressReady: true, Address: address,ICAOready: true, ICAOname: ICAOname)
+
+ } else {
+ if (airplanes[address]?.ICAOname == "") {
+ airplanes[address]?.ICAOname = ICAOname
+ airplanes[address]?.ICAOready = true
+ }
+ }
+ }
+
+ func addDF17AirBornPosition(_ address: Int, _ cpr_lat: Int, _ cpr_long: Int, _ alt: Int, _ even: Bool) {
+
+ if airplanes[address] == nil {
+ return
+ }
+
+ //deal with altitude
+ //if airplanes[address] != nil {
+ if (airplanes[address]?.altitudeReady != true) {
+ airplanes[address]?.altitudeReady = true
+ airplanes[address]?.altitude = alt
+ airplanes[address]?.altitudeCount += 1
+ } else {
+ airplanes[address]?.altitude = alt
+ airplanes[address]?.altitudeCount += 1
+ }
+ //}
+ //do the airborn position
+ if (even) {
+ airplanes[address]?.positionDecoder.addEvenPosition(UInt32(cpr_lat), UInt32(cpr_long), mstime())
+ } else {
+
+ airplanes[address]?.positionDecoder.addOddPosition(UInt32(cpr_lat), UInt32(cpr_long), mstime())
+ }
+
+ }
+
+
+ func getPosition(_ address: Int) -> (Double,Double)? {
+ if (airplanes[address] == nil) {
+ return nil
+ }
+
+ if let airplane = airplanes[address] {
+ if (airplane.positionDecoder.calcPosition()) {
+ return airplane.positionDecoder.getPosition()
+ }
+ }
+
+ return nil
+ }
+
+ func getAltitude() {
+
+ print("not implemented")
+ }
+
+ func printAllICAOnames() {
+ let extra = true
+ var once=false
+ for (address,plane) in airplanes {
+ if plane.ICAOready {
+ print(String("\(plane.ICAOname) "), terminator: "")
+ }
+ if (extra) {
+ print("Alitude \(plane.altitudeCount) Positions \(plane.positionDecoder.queue.count)")
+ }
+ //if (!once) {
+ // for i in plane.positionDecoder.queue {
+ // print("\(i.cpr_lat) \(i.cpr_long) \(i.even)")
+ // }
+ // once = true
+ //}
+ }
+ }
+
+}