summaryrefslogtreecommitdiff
path: root/LearnMapKit/ADSBFileRunner.swift
blob: d61b91bf19dfdcafc72940ff2e426dba6628cf51 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
//
//  ADSBRunner.swift
//  LearnMapKit
//
//  Created by Jacky Jack on 28/06/2024.
//

import Foundation
import Collections

class ADSBFileRunner {
    var filename: URL
    //track all airplanes
    var tracker = AirPlaneTracker()
    var adsb_source: String = ""
    //should make it outside and use here?
    var adsb_tag_stream = ADSBDataQueue()
    private var decoded_status: Bool = false
    
    init(filename:String) {
        self.filename = URL(fileURLWithPath:filename)
    }
    
    init() {
        self.filename = URL(fileURLWithPath:"")
    }
    
    func setFileName(_ filename:String) {
        self.filename = URL(fileURLWithPath: filename)
    }
    
    func openFile() {
        if self.filename == URL(fileURLWithPath:"") {
            print("File name for ADSBRunner not specified")
            return
        }
        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) \(error)")
            exit(1)
        }
        print("If there anything new in file")
    }
    
    func decodeFromFile() {
        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)
                                    adsb_tag_stream.addIcaoName(d17.AddressAnnounced, tracker.getICAOname(d17.AddressAnnounced)!)
                                }
                            } 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)")
                                        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)
                                    }
                                }
                            }
                        }
                    }
                };
            } catch {
                print("Error")
            }
            
            if (found == false) {
                print("Unknown adsb data line \(line)")
            }
        }
        self.decoded_status = true
        //try to free the string after decoded
        //adsb_source = ""
        for i in 0..<adsb_tag_stream.icaoArray.count {
            print(adsb_tag_stream.icaoArray[i])
        }
        print("Queue done")
    }
    
    func jobDone() -> Bool {
        return self.decoded_status
    }
    
    func getPlainData(_ num_queries: Int) -> ADSBDataQueue {
        var ret = ADSBDataQueue()
        if adsb_tag_stream.haveNum(num_queries) {
            
            for _ in 0..<num_queries {
                let nextTag = adsb_tag_stream.getNextTag()
                if nextTag == DataStreamType.EMPTY {
                    return ret
                }
                if (nextTag == DataStreamType.ADSB_ALTITUDE) {
                    let alt = adsb_tag_stream.getAltitude()
                    ret.addAltitude(alt.address, alt.altitude)
                } else if (nextTag == DataStreamType.ADSB_ICAO) {
                    let icao = adsb_tag_stream.getIcaoName()
                    ret.addIcaoName(icao.address, icao.ICAOname)
                } else if (nextTag == DataStreamType.ADSB_LOCATION) {
                    let loc = adsb_tag_stream.getLocation()
                    ret.addLocation(loc.address, loc.lat, loc.long)
                }
            }
            return ret
        } else {
            print("Plain data query is empty")
        }
        return ret
    }
    
    func getCount() -> Int {
        return self.adsb_tag_stream.getCount()
    }
}