summaryrefslogtreecommitdiff
path: root/ADSBDecoder/main.swift
blob: a324a0f7763dc128ffd039ce581e651f427f7366 (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
//
//  main.swift
//  ADSBDecoder
//
//  Created by Jacky Jack on 28/05/2024.
//

import Foundation
import ArgumentParser
import RegexBuilder

//return true if file excists
func checkIfFileExists(_ fname: String) -> Bool {
    let fm = FileManager.default
    if fm.fileExists(atPath: fname) {
        return true
    }
    return false
}

//get current run directory
func getCurrentDirPath() -> String {
    return Process().currentDirectoryPath
}

struct CommandLineArgs: ParsableCommand {
    @Option(name: .shortAndLong) var inputfile: String
    @Flag(name: .shortAndLong) var debug:Bool = false
    @Flag(name: .shortAndLong) var version:Bool = false
    @Flag(name: .shortAndLong) var show_stats:Bool = false
}

let args = CommandLineArgs.parseOrExit()

let fileUrl = URL(fileURLWithPath:args.inputfile)
print("File location [\(fileUrl.absoluteString)]")

//check if file excists
if (checkIfFileExists(fileUrl.path) == false) {
    print("Supplied path \(fileUrl.path) doesnt exists")
    exit(1)
}

//load the file with adsb data
var adsb_source = ""
do {
    adsb_source = try String(contentsOfFile: fileUrl.path)
    print("Loaded \(adsb_source.count) bytes")
} catch {
    print("Couldn't load text from a file \(fileUrl.path)")
    exit(1)
}



let matchADSBLong = Regex {
    Anchor.startOfLine
    "*"
    
        Repeat(
            CharacterClass(
                ("a"..."f"),
                ("0"..."9")
            )
            ,count:28)
    
    ";"
}

let matchADSBShort = Regex {
    Anchor.startOfLine
    "*"
    Repeat(
        CharacterClass(
            ("a"..."f"),
            ("0"..."9")
        )
        ,count:14)
    ";"
}

//gather stats
var q_df = QueryDF()
var q_dftc = QueryDF17TC()

//parse line by line
var cnt=0
for line in adsb_source.components(separatedBy: .newlines) {
    var found=false
    //print("\(cnt) \(line)")
    //cnt += 1
    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() {
                //print(d17)
                q_dftc.addTC(d17.TypeCode)
            }
        } else {
            
        }
        q_df.addDF(decoder.DataFormat)
    };
    
    if let tokenMatch = try matchADSBShort.prefixMatch(in: line) {
        print("\(tokenMatch.output)")
        found = true
    };
    
    if (found == false) {
        print("Unknown adsb data line \(line)")
    }
    
    
}


if args.show_stats {
    print("----STAT----")
    //q_df.showStat()
    print(q_df)
    print(q_dftc)
}