]> git.mxchange.org Git - flightgear.git/blob - scripts/perl/dafif/dafift2nav.pl
Fixed [hopefully] the magvar decoding. The last four digits are quite
[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 $freq;
51   if ($channel < 67) {
52     $freq = 108 + (($channel - 17)/10.0);
53   } else {
54     $freq = 112 + (($channel - 67)/10.0);
55   }
56   if ($type == 9) {
57     $freq += 0.05;
58   }
59   return $freq;
60 }
61
62 # Make a range based on navaid type and purpose
63 sub make_range {
64   my ($type, $usage) = (@_);
65   if ($type == 1 || $type == 2 || $type ==4) { # VOR
66     if ($usage == 'H' || $usage == 'B') {
67       return 200;
68     } elsif ($usage == 'T') {
69       return 20;
70     } else {
71       return 50;
72     }
73   } elsif ($type == 3 || $type == 7) {        # DME
74     if ($usage == 'T') {
75       return 50;
76     } else {
77       return 200;
78     }
79   } else {                      # NDB
80     if ($usage == 'T') {
81       return 50;
82     } else {
83       return 200;
84     }
85   }
86 }
87
88 sub write_navaid {
89   my ($type, $lat, $lon, $elev, $freq, $range, $dme, $id, $magvar, $name)
90     = (@_);
91       
92   printf("%s %10.6f %11.6f %6d %7.2f %4d %s %-4s %s %s %s\n",
93          $TYPES[$type], $lat, $lon, $elev, $freq, $range, $dme, $id,
94          $magvar, $name, $TYPE_NAMES[$type]);
95 }
96
97 sub make_dmagvar {
98     my($coord) = shift;
99     my( $value );
100     my( $dir, $deg, $date ) = $coord =~ m/^([EW])(\d\d\d\d)(\d\d\d\d)/;
101     $value = $deg / 10.0;
102     if ( $dir eq "W" ) {
103         $value = -$value;
104     }
105
106     return $value;
107 }
108
109
110 <>;                             # skip header line
111
112 print "// FlightGear navaid data, generated from DAFIFT NAV.TXT\n";
113
114 while (<>)
115 {
116   chop;
117   my @F = split(/\t/);
118
119   my $type = $F[1];
120   if ($TYPES[$type] eq '') {
121     warn("Bad type for " . $F[0] . "(" . $F[5] . ")\n");
122     next;
123   }
124   my $lat = $F[18];
125   my $lon = $F[20];
126   my $elev = $F[23];
127   my $freq = $F[8]/1000;
128   if ($type == 3 || $type == 9) {
129     $freq = make_freq($type, 0 + $F[10]);
130   }
131   my $range = 0 + $F[14];
132   if ($range == 0) {
133     $range = make_range($type, $F[9]);
134   }
135   my $id = $F[0];
136   my $magvar = $F[21];
137   if ($magvar eq '') {
138     $magvar = 'XXX';
139   } else {
140     my $tmp = make_dmagvar( $magvar );
141     # print "$magvar $tmp\n";
142     if ( $tmp <= 0 ) {
143         $magvar = sprintf("%02.0fW", -$tmp );
144     } else {
145         $magvar = sprintf("%02.0fE", $tmp );
146     }
147   }
148   my $name = $F[5];
149
150   if ($type == 7) {             # NDB/DME
151     write_navaid(9, $lat, $lon, $elev, make_freq(9, $F[10]), $range,
152                  'Y', $id, $magvar, $name);
153     $type = 5;
154   }
155   write_navaid($type, $lat, $lon, $elev, $freq, $range,
156                $HAS_DME[$F[1]], $id, $magvar, $name);
157
158
159 }
160
161 print "[End]\n";
162
163 # end of dafif2fix.pl