]> git.mxchange.org Git - flightgear.git/blob - scripts/perl/dafif/dafift2nav.pl
Many ILS approaches do not have a listed GS elevation in the FAA or in the
[flightgear.git] / scripts / perl / dafif / dafift2nav.pl
1 #!/usr/bin/perl
2 ########################################################################
3 # Convert DAFIFT NAV.TXT to FlightGear format.
4 ########################################################################
5
6 use strict;
7
8 my @TYPES = (
9              '',                # Unknown
10              'V',               # VOR
11              'V',               # VORTAC
12              'D',               # TACAN
13              'V',               # VOR/DME
14              'N',               # NDB
15              '',
16              'N',               # NDB/DME
17              '',
18              'D'                # DME
19             );
20
21 my @TYPE_NAMES = (
22                   '',
23                   'VOR',
24                   'VORTAC',
25                   'TACAN',
26                   'VOR/DME',
27                   'NDB',
28                   '',
29                   'NDB/DME',
30                   '',
31                   'DME'
32                  );
33
34 my @HAS_DME = (
35                'N',             # Unknown
36                'N',             # VOR
37                'Y',             # VORTAC
38                'Y',             # TACAN
39                'Y',             # VOR/DME
40                'N',             # NDB
41                'N',
42                'Y',             # NDB/DME (not used, though)
43                'N',
44                'Y'              # DME
45               );
46
47 # Make a frequency from a DME channel
48 sub make_freq {
49   my ($type, $channel) = (@_);
50   my $offset = 0;
51   $offset = 0.05 if ($channel =~ /Y$/);
52   if ($channel < 67) {
53     return 108 + (($channel - 17)/10.0) + $offset;
54   } else {
55     return 112 + (($channel - 67)/10.0) + $offset;
56   }
57 }
58
59 # Make a range based on navaid type and purpose
60 sub make_range {
61   my ($type, $usage) = (@_);
62   if ($type == 1 || $type == 2 || $type ==4) { # VOR
63     if ($usage == 'H' || $usage == 'B') {
64       return 200;
65     } elsif ($usage == 'T') {
66       return 20;
67     } else {
68       return 50;
69     }
70   } elsif ($type == 3 || $type == 7) {        # DME
71     if ($usage == 'T') {
72       return 50;
73     } else {
74       return 200;
75     }
76   } else {                      # NDB
77     if ($usage == 'T') {
78       return 50;
79     } else {
80       return 200;
81     }
82   }
83 }
84
85 sub write_navaid {
86   my ($type, $lat, $lon, $elev, $freq, $range, $dme, $id, $magvar, $name)
87     = (@_);
88       
89   printf("%s %10.6f %11.6f %6d %7.2f %4d %s %-4s %s %s %s\n",
90          $TYPES[$type], $lat, $lon, $elev, $freq, $range, $dme, $id,
91          $magvar, $name, $TYPE_NAMES[$type]);
92 }
93
94 sub make_dmagvar {
95     my($coord) = shift;
96     my( $value );
97     my( $dir, $deg, $date ) = $coord =~ m/^([EW])(\d\d\d\d)(\d\d\d\d)/;
98     $value = $deg / 10.0;
99     if ( $dir eq "W" ) {
100         $value = -$value;
101     }
102
103     return $value;
104 }
105
106
107 <>;                             # skip header line
108
109 print "// FlightGear navaid data, generated from DAFIFT NAV.TXT\n";
110
111 while (<>)
112 {
113   chop;
114   my @F = split(/\t/);
115
116   my $type = $F[1];
117   if ($TYPES[$type] eq '') {
118     warn("Bad type for " . $F[0] . "(" . $F[5] . ")\n");
119     next;
120   }
121   my $lat = $F[18];
122   my $lon = $F[20];
123   my $elev = $F[23];
124   my $freq = $F[8]/1000;
125   if ($type == 3 || $type == 9) {
126     $freq = make_freq($type, $F[10]);
127   }
128   my $range = 0 + $F[14];
129   if ($range == 0) {
130     $range = make_range($type, $F[9]);
131   }
132   my $id = $F[0];
133   my $magvar = $F[21];
134   if ($magvar eq '') {
135     $magvar = 'XXX';
136   } else {
137     my $tmp = make_dmagvar( $magvar );
138     # print "$magvar $tmp\n";
139     if ( $tmp <= 0 ) {
140         $magvar = sprintf("%02.0fW", -$tmp );
141     } else {
142         $magvar = sprintf("%02.0fE", $tmp );
143     }
144   }
145   my $name = $F[5];
146
147   if ($type == 7) {             # NDB/DME
148     write_navaid(9, $lat, $lon, $elev, make_freq(9, $F[10]), $range,
149                  'Y', $id, $magvar, $name);
150     $type = 5;
151   }
152   write_navaid($type, $lat, $lon, $elev, $freq, $range,
153                $HAS_DME[$F[1]], $id, $magvar, $name);
154
155
156 }
157
158 print "[End]\n";
159
160 # end of dafif2fix.pl