Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
365 rain-er 1
#!/usr/bin/perl
2
#!/usr/bin/perl -d:ptkdb
3
 
4
###############################################################################
5
#
6
# logging.pl -  CSV, KLM, GPS Logging
7
#
8
# Copyright (C) 2009  Rainer Walther  (rainerwalther-mail@web.de)
9
#
10
# Creative Commons Lizenz mit den Zusaetzen (by, nc, sa)
11
#
12
# Es ist Ihnen gestattet: 
13
#     * das Werk vervielfältigen, verbreiten und öffentlich zugänglich machen
14
#     * Abwandlungen bzw. Bearbeitungen des Inhaltes anfertigen
15
# 
16
# Zu den folgenden Bedingungen:
17
#     * Namensnennung.
18
#       Sie müssen den Namen des Autors/Rechteinhabers in der von ihm festgelegten Weise nennen.
19
#     * Keine kommerzielle Nutzung.
20
#       Dieses Werk darf nicht für kommerzielle Zwecke verwendet werden.
21
#     * Weitergabe unter gleichen Bedingungen.
22
#       Wenn Sie den lizenzierten Inhalt bearbeiten oder in anderer Weise umgestalten,
23
#       verändern oder als Grundlage für einen anderen Inhalt verwenden,
24
#       dürfen Sie den neu entstandenen Inhalt nur unter Verwendung von Lizenzbedingungen
25
#       weitergeben, die mit denen dieses Lizenzvertrages identisch oder vergleichbar sind.
26
# 
27
# Im Falle einer Verbreitung müssen Sie anderen die Lizenzbedingungen, unter welche dieses
28
# Werk fällt, mitteilen. Am Einfachsten ist es, einen Link auf diese Seite einzubinden.
29
# 
30
# Jede der vorgenannten Bedingungen kann aufgehoben werden, sofern Sie die Einwilligung
31
# des Rechteinhabers dazu erhalten.
32
# 
33
# Diese Lizenz lässt die Urheberpersönlichkeitsrechte unberührt.
34
# 
35
# Weitere Details zur Lizenzbestimmung gibt es hier:
36
#   Kurzform: http://creativecommons.org/licenses/by-nc-sa/3.0/de/
37
#   Komplett: http://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode
38
#
39
###############################################################################
40
#
41
# 2009-02-23 0.0.1 rw created
42
# 2009-04-01 0.1.0 rw RC1
43
#
44
###############################################################################
45
 
46
$Version{'logging.pl'} = "0.1.0 - 2009-04-01";
47
 
48
#
49
# Parameter
50
#
51
 
52
my $LoopTime = 1000000;      # in us
53
 
54
# Packages
55
use threads;
56
use threads::shared;
57
use Time::HiRes qw(usleep);
58
 
59
require "mkcomm.pl";     # MK communication
60
require "geserver.pl";   # Google Earth Server
61
require "translate.pl";  # Übersetzungstable
62
 
63
#
64
# Signal handler
65
#
66
 
67
$SIG{'INT'}  = 'LogSigHandler';
68
$SIG{'KILL'} = 'LogSigHandler';
69
 
70
sub SigHandler()
71
    {
72
    if ( defined threads->self() )
73
        {
74
        threads->exit();
75
        }
76
    exit;
77
    }
78
 
79
 
80
my $LogCsvIsOpen = 0;
81
my $LogKmlIsOpen = 0;
82
my $LogGpxIsOpen = 0;
83
my $GeServerIsRunning = 0;
84
 
85
#
86
# CSV
87
#
88
 
89
# Open CSV logfile
90
sub LogCsvOpen()
91
    {
92
    if ( ! $LogCsvIsOpen )
93
        {      
94
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
95
        my $Filename = sprintf ("mk-%04d%02d%02d-%02d%02d%02d.csv", $year+1900, $mon+1, $mday, $hour, $min, $sec);
96
        open LOGCSV, ">$Cfg->{'logging'}->{'CsvLogDir'}/$Filename";
97
 
98
        $LogCsvIsOpen = 1;
99
 
100
        # print labes at first line
101
 
102
        # NC OSD
103
        my $Sep = "";
104
        foreach $Label (sort keys %MkOsd)
105
            {
106
            if ( $Translate{$Label} ne "" )
107
                {
108
                $Label = $Translate{$Label};
109
                }
110
            print LOGCSV "$Sep" . "$Label";
111
            $Sep = ",";
112
            }
113
 
114
        # NC Debug
115
        foreach $Label (sort keys %MkNcDebug)
116
            {
117
            if ( $Translate{$Label} ne "" )
118
                {
119
                $Label = $Translate{$Label};
120
                }
121
            print LOGCSV "$Sep" . "$Label";
122
            }
123
        print LOGCSV "\n";
124
        }
125
 
126
    return 0;
127
    }
128
 
129
 
130
# Close CSV
131
sub LogCsvClose()
132
    {
133
    if ( $LogCsvIsOpen )
134
        {
135
        close LOGCSV;
136
        $LogCsvIsOpen = 0;
137
        }
138
 
139
    return 0;
140
    }  
141
 
142
# Log CSV
143
sub LogCsv()
144
    {
145
    lock %MkOsd;      # until end of Block
146
    lock %MkNcDebug;  # until end of Block
147
 
148
    if ( $MkOsd{'_Timestamp'} >= time-2 )
149
        {
150
        # active connection to MK
151
        &LogCsvOpen();
152
 
153
        # NC OSD
154
        my $Sep = "";
155
        foreach $Label (sort keys %MkOsd)
156
            {
157
            print LOGCSV "$Sep" . "$MkOsd{$Label}";
158
            $Sep = ",";
159
            }
160
 
161
        # NC Debug
162
        foreach $Label (sort keys %MkNcDebug)
163
            {
164
            print LOGCSV "$Sep" . "$MkNcDebug{$Label}";
165
            }
166
        print LOGCSV "\n";
167
        }
168
    else
169
        {
170
        # connection to MK lost, close Logfile
171
        &LogCsvClose();
172
        }
173
 
174
    return 0;
175
    }
176
 
177
 
178
#
179
# GPX
180
# http://www.topografix.com/gpx_manual.asp
181
#
182
 
183
# Open GPX logfile
184
sub LogGpxOpen()
185
    {
186
    if ( ! $LogGpxIsOpen )
187
        {
188
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
189
        my $TimeStamp = sprintf ("%04d%02d%02d-%02d%02d%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
190
        my $Filename = "mk-" . $TimeStamp . ".gpx";
191
        open LOGGPX, ">$Cfg->{'logging'}->{'GpxLogDir'}/$Filename";
192
        $LogGpxIsOpen = 1;
193
 
194
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
195
        my $UtcTimeStamp = sprintf ("%04d-%02d-%02dT%02d:%02d:%02dZ", $year+1900, $mon+1, $mday, $hour, $min, $sec);
196
 
197
        # print GPX-Header
198
        print LOGGPX <<EOF;
199
<?xml version="1.0" encoding="UTF-8"?>
200
<gpx
201
  version="1.0"
202
  creator="MK Mission Cockpit"
203
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
204
  xmlns="http://www.topografix.com/GPX/1/0"
205
  xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
206
  <time>${UtcTimeStamp}</time>
207
  <trk>
208
    <name>Mikrokopter GPS logging</name>
209
        <desc>Flight ${TimeStamp}</desc>
210
    <trkseg>
211
EOF
212
        }
213
 
214
    return 0;
215
    }  
216
 
217
 
218
# Close GPX
219
sub LogGpxClose()
220
    {
221
    if ( $LogGpxIsOpen )
222
        {
223
        # print GPX-Trailer
224
        print LOGGPX <<EOF;
225
    </trkseg>
226
  </trk>
227
</gpx>
228
EOF
229
        close LOGGPX;
230
        $LogGpxIsOpen = 0;
231
        }
232
 
233
    return 0;
234
    }  
235
 
236
 
237
# Log GPX
238
sub LogGpx()
239
    {
240
    lock %MkOsd;   # until end of Block
241
 
242
    if ( $MkOsd{'_Timestamp'} >= time-2  and
243
         $MkOsd{'MKFlags'} & 0x02  and  $MkOsd{'CurPos_Stat'} == 1 )
244
        {
245
        # active connection to MK, MK is flying, valid GPS
246
        &LogGpxOpen();
247
 
248
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
249
        my $UtcTimeStamp = sprintf ("%04d-%02d-%02dT%02d:%02d:%02dZ", $year+1900, $mon+1, $mday, $hour, $min, $sec);
250
 
251
        my $Speed = $MkOsd{'GroundSpeed'} / 100;  # m/s
252
        printf LOGGPX <<EOF;
253
      <trkpt lat="$MkOsd{'CurPos_Lat'}" lon="$MkOsd{'CurPos_Lon'}">
254
        <ele>$MkOsd{'CurPos_Alt'}</ele>
255
        <time>${UtcTimeStamp}</time>
256
        <sat>$MkOsd{'SatsInUse'}</sat>
257
        <course>$MkOsd{'CompassHeading'}</course>
258
        <speed>$Speed</speed>
259
        <extensions>
260
          <Target-Lat>$MkOsd{'TargetPos_Lat'}</Target-Lat>
261
          <Target-Lon>$MkOsd{'TargetPos_Lon'}</Target-Lon>
262
          <Target-Alt>$MkOsd{'TargetPos_Alt'}</Target-Alt>
263
          <Target-Bearing>$MkOsd{'TargetPosDev_Bearing'}</Target-Bearing>
264
          <Target-Dist>$MkOsd{'TargetPosDev_Dist'}</Target-Dist>
265
          <Waypoint>$MkOsd{'WaypointIndex'} / $MkOsd{'WaypointNumber'}</Waypoint>
266
          <Altimeter>$MkOsd{'Altimeter'}</Altimeter>
267
          <Variometer>$MkOsd{'Variometer'}</Variometer>
268
          <UBat>$MkOsd{'UBat'}</UBat>
269
          <AngleNick>$MkOsd{'AngleNick'}</AngleNick>
270
          <AngleRoll>$MkOsd{'AngleRoll'}</AngleRoll>
271
          <MKFlags>$MkOsd{'MKFlags'}</MKFlags>
272
          <NCFlags>$MkOsd{'NCFlags'}</NCFlags>
273
        </extensions>
274
      </trkpt>         
275
EOF
276
        }
277
    else
278
        {
279
        &LogGpxClose();
280
        }
281
    }
282
 
283
#
284
# KML
285
# http://code.google.com/intl/de-DE/apis/kml/documentation/kml_tut.html
286
#
287
 
288
# Open KML logfile
289
sub LogKmlOpen()
290
    {
291
    if ( ! $LogKmlIsOpen )
292
        {      
293
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
294
        my $TimeStamp = sprintf ("%04d%02d%02d-%02d%02d%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
295
        my $Filename = "mk-" . $TimeStamp . ".kml";
296
        open LOGKML, ">$Cfg->{'logging'}->{'KmlLogDir'}/$Filename";
297
        $LogKmlIsOpen = 1;
298
 
299
        # print KML-Header
300
        print LOGKML <<EOF;
301
<?xml version="1.0" encoding="UTF-8"?>
302
<kml xmlns="http://earth.google.com/kml/2.2">
303
  <Document>
304
    <name>Mikrokopter GPS logging</name>
305
    <Style id="MK_gps-style">
306
      <LineStyle>
307
        <color>ff0000ff</color>
308
        <width>2</width>
309
      </LineStyle>
310
    </Style>
311
    <Placemark>
312
      <name>Flight ${TimeStamp}</name>
313
      <styleUrl>MK_gps-style</styleUrl>
314
      <LineString>
315
        <tessellate>1</tessellate>
316
        <altitudeMode>relativeToGround</altitudeMode>
317
        <coordinates>
318
EOF
319
        }
320
 
321
    return 0;
322
    }  
323
 
324
 
325
# Close KML
326
sub LogKmlClose()
327
    {
328
    if ( $LogKmlIsOpen )
329
        {
330
        # print KML-Trailer
331
        print LOGKML <<EOF;
332
        </coordinates>
333
      </LineString>
334
    </Placemark>
335
  </Document>
336
</kml>
337
EOF
338
        close LOGKML;
339
        $LogKmlIsOpen = 0;
340
        }
341
 
342
    return 0;
343
    }  
344
 
345
 
346
# Log KML
347
sub LogKml()
348
    {
349
    lock %MkOsd;   # until end of Block
350
 
351
    if ( $MkOsd{'_Timestamp'} >= time-2  and
352
         $MkOsd{'MKFlags'} & 0x02  and  $MkOsd{'CurPos_Stat'} == 1 )
353
        {
354
        # active connection to MK, MK is flying, valid GPS
355
        &LogKmlOpen();
356
 
357
        my $AltRel = $MkOsd{'CurPos_Alt'} - $MkOsd{'HomePos_Alt'};
358
        if ( $AltRel < 0 ) { $AltRel = 0; }
359
        printf LOGKML "          %f, %f, %f\n", $MkOsd{'CurPos_Lon'}, $MkOsd{'CurPos_Lat'}, $AltRel;
360
        }
361
    else
362
        {
363
        &LogKmlClose();
364
        }
365
    }
366
 
367
 
368
# Send Coords to GoogleEarth server
369
sub Send2GeServer()
370
    {
371
    lock %MkOsd;   # until end of Block
372
 
373
    if ( $MkOsd{'_Timestamp'} >= time-2  and
374
         $MkOsd{'MKFlags'} & 0x02  and  $MkOsd{'CurPos_Stat'} == 1 )
375
        {
376
        # active connection to MK, MK is flying, valid GPS
377
 
378
        my $AltRel = $MkOsd{'CurPos_Alt'} - $MkOsd{'HomePos_Alt'};
379
        if ( $AltRel < 0 ) { $AltRel = 0; }
380
 
381
        push @GeCoords, sprintf "%f, %f, %f", $MkOsd{'CurPos_Lon'}, $MkOsd{'CurPos_Lat'}, $AltRel;
382
        }
383
    }
384
 
385
 
386
sub MkLogLoop()
387
    {
388
    while (1)
389
        {
390
        &LogCsv();
391
        &LogKml();
392
        &LogGpx();
393
 
394
        &Send2GeServer();  # Google Earth
395
 
396
        # kurz schlafen legen
397
        usleep $LoopTime;
398
        }
399
    }
400
 
401
#
402
# Hauptprgramm
403
#       
404
 
405
if ( $0 =~ /logging.pl$/i )
406
    {
407
    # Program wurde direkt aufgerufen
408
 
409
    # Kommunikation zum MK herstellen
410
    $mk_thr = threads->create (\&MkCommLoop) -> detach();
411
 
412
    &MkLogLoop();
413
 
414
    # should never exit
415
    }
416
 
417
1;
418
 
419
__END__