Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
670 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
# 2009-05-01 0.1.1 rw configurable logging interval
44
# 2009-05-17 0.1.7 rw _Timestamp timeout von 2s auf 10s erhoeht
45
# 2009-09-30 0.1.8 rw SignalHandler removed
46
#
47
###############################################################################
48
 
49
$Version{'logging.pl'} = "0.1.8 - 2009-09-30";
50
 
51
#
52
# Parameter
53
#
54
 
55
my $LoopTime = $Cfg->{'logging'}->{'Intervall'} || 1;  # in s
56
$LoopTime *= 1000000;      # in us
57
 
58
# Packages
59
use threads;
60
use threads::shared;
61
use Time::HiRes qw(usleep);
62
 
63
require "mkcomm.pl";     # MK communication
64
require "geserver.pl";   # Google Earth Server
65
require "translate.pl";  # Übersetzungstable
66
 
67
 
68
my $LogCsvIsOpen = 0;
69
my $LogKmlIsOpen = 0;
70
my $LogGpxIsOpen = 0;
71
my $GeServerIsRunning = 0;
72
 
73
#
74
# CSV
75
#
76
 
77
# Open CSV logfile
78
sub LogCsvOpen()
79
    {
80
    if ( ! $LogCsvIsOpen )
81
        {      
82
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
83
        my $Filename = sprintf ("mk-%04d%02d%02d-%02d%02d%02d.csv", $year+1900, $mon+1, $mday, $hour, $min, $sec);
84
        open LOGCSV, ">$Cfg->{'logging'}->{'CsvLogDir'}/$Filename";
85
 
86
        $LogCsvIsOpen = 1;
87
 
88
        # print labes at first line
89
 
90
        # NC OSD
91
        my $Sep = "";
92
        foreach $Label (sort keys %MkOsd)
93
            {
94
            if ( $Translate{$Label} ne "" )
95
                {
96
                $Label = $Translate{$Label};
97
                }
98
            print LOGCSV "$Sep" . "$Label";
99
            $Sep = ",";
100
            }
101
 
102
        # NC Debug
103
        foreach $Label (sort keys %MkNcDebug)
104
            {
105
            if ( $Translate{$Label} ne "" )
106
                {
107
                $Label = $Translate{$Label};
108
                }
109
            print LOGCSV "$Sep" . "$Label";
110
            }
111
        print LOGCSV "\n";
112
        }
113
 
114
    return 0;
115
    }
116
 
117
 
118
# Close CSV
119
sub LogCsvClose()
120
    {
121
    if ( $LogCsvIsOpen )
122
        {
123
        close LOGCSV;
124
        $LogCsvIsOpen = 0;
125
        }
126
 
127
    return 0;
128
    }  
129
 
130
# Log CSV
131
sub LogCsv()
132
    {
133
    lock %MkOsd;      # until end of Block
134
    lock %MkNcDebug;  # until end of Block
135
 
136
    if ( $MkOsd{'_Timestamp'} >= time-10 )
137
        {
138
        # active connection to MK
139
        &LogCsvOpen();
140
 
141
        # NC OSD
142
        my $Sep = "";
143
        foreach $Label (sort keys %MkOsd)
144
            {
145
            print LOGCSV "$Sep" . "$MkOsd{$Label}";
146
            $Sep = ",";
147
            }
148
 
149
        # NC Debug
150
        foreach $Label (sort keys %MkNcDebug)
151
            {
152
            print LOGCSV "$Sep" . "$MkNcDebug{$Label}";
153
            }
154
        print LOGCSV "\n";
155
        }
156
    else
157
        {
158
        # connection to MK lost, close Logfile
159
        &LogCsvClose();
160
        }
161
 
162
    return 0;
163
    }
164
 
165
 
166
#
167
# GPX
168
# http://www.topografix.com/gpx_manual.asp
169
#
170
 
171
# Open GPX logfile
172
sub LogGpxOpen()
173
    {
174
    if ( ! $LogGpxIsOpen )
175
        {
176
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
177
        my $TimeStamp = sprintf ("%04d%02d%02d-%02d%02d%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
178
        my $Filename = "mk-" . $TimeStamp . ".gpx";
179
        open LOGGPX, ">$Cfg->{'logging'}->{'GpxLogDir'}/$Filename";
180
        $LogGpxIsOpen = 1;
181
 
182
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
183
        my $UtcTimeStamp = sprintf ("%04d-%02d-%02dT%02d:%02d:%02dZ", $year+1900, $mon+1, $mday, $hour, $min, $sec);
184
 
185
        # print GPX-Header
186
        print LOGGPX <<EOF;
187
<?xml version="1.0" encoding="UTF-8"?>
188
<gpx
189
  version="1.0"
190
  creator="MK Mission Cockpit"
191
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
192
  xmlns="http://www.topografix.com/GPX/1/0"
193
  xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
194
  <time>${UtcTimeStamp}</time>
195
  <trk>
196
    <name>Mikrokopter GPS logging</name>
197
        <desc>Flight ${TimeStamp}</desc>
198
    <trkseg>
199
EOF
200
        }
201
 
202
    return 0;
203
    }  
204
 
205
 
206
# Close GPX
207
sub LogGpxClose()
208
    {
209
    if ( $LogGpxIsOpen )
210
        {
211
        # print GPX-Trailer
212
        print LOGGPX <<EOF;
213
    </trkseg>
214
  </trk>
215
</gpx>
216
EOF
217
        close LOGGPX;
218
        $LogGpxIsOpen = 0;
219
        }
220
 
221
    return 0;
222
    }  
223
 
224
 
225
# Log GPX
226
sub LogGpx()
227
    {
228
    lock %MkOsd;   # until end of Block
229
 
230
    if ( $MkOsd{'_Timestamp'} >= time-10  and
231
         $MkOsd{'MKFlags'} & 0x02  and  $MkOsd{'CurPos_Stat'} == 1 )
232
        {
233
        # active connection to MK, MK is flying, valid GPS
234
        &LogGpxOpen();
235
 
236
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
237
        my $UtcTimeStamp = sprintf ("%04d-%02d-%02dT%02d:%02d:%02dZ", $year+1900, $mon+1, $mday, $hour, $min, $sec);
238
 
239
        my $Speed = $MkOsd{'GroundSpeed'} / 100;  # m/s
240
        printf LOGGPX <<EOF;
241
      <trkpt lat="$MkOsd{'CurPos_Lat'}" lon="$MkOsd{'CurPos_Lon'}">
242
        <ele>$MkOsd{'CurPos_Alt'}</ele>
243
        <time>${UtcTimeStamp}</time>
244
        <sat>$MkOsd{'SatsInUse'}</sat>
245
        <course>$MkOsd{'CompassHeading'}</course>
246
        <speed>$Speed</speed>
247
        <extensions>
248
          <Target-Lat>$MkOsd{'TargetPos_Lat'}</Target-Lat>
249
          <Target-Lon>$MkOsd{'TargetPos_Lon'}</Target-Lon>
250
          <Target-Alt>$MkOsd{'TargetPos_Alt'}</Target-Alt>
251
          <Target-Bearing>$MkOsd{'TargetPosDev_Bearing'}</Target-Bearing>
252
          <Target-Dist>$MkOsd{'TargetPosDev_Dist'}</Target-Dist>
253
          <Waypoint>$MkOsd{'WaypointIndex'} / $MkOsd{'WaypointNumber'}</Waypoint>
254
          <Altimeter>$MkOsd{'Altimeter'}</Altimeter>
255
          <Variometer>$MkOsd{'Variometer'}</Variometer>
256
          <UBat>$MkOsd{'UBat'}</UBat>
257
          <AngleNick>$MkOsd{'AngleNick'}</AngleNick>
258
          <AngleRoll>$MkOsd{'AngleRoll'}</AngleRoll>
259
          <MKFlags>$MkOsd{'MKFlags'}</MKFlags>
260
          <NCFlags>$MkOsd{'NCFlags'}</NCFlags>
261
        </extensions>
262
      </trkpt>         
263
EOF
264
        }
265
    else
266
        {
267
        &LogGpxClose();
268
        }
269
    }
270
 
271
#
272
# KML
273
# http://code.google.com/intl/de-DE/apis/kml/documentation/kml_tut.html
274
#
275
 
276
# Open KML logfile
277
sub LogKmlOpen()
278
    {
279
    if ( ! $LogKmlIsOpen )
280
        {      
281
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
282
        my $TimeStamp = sprintf ("%04d%02d%02d-%02d%02d%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
283
        my $Filename = "mk-" . $TimeStamp . ".kml";
284
        open LOGKML, ">$Cfg->{'logging'}->{'KmlLogDir'}/$Filename";
285
        $LogKmlIsOpen = 1;
286
 
287
        # print KML-Header
288
        print LOGKML <<EOF;
289
<?xml version="1.0" encoding="UTF-8"?>
290
<kml xmlns="http://earth.google.com/kml/2.2">
291
  <Document>
292
    <name>Mikrokopter GPS logging</name>
293
    <Style id="MK_gps-style">
294
      <LineStyle>
295
        <color>ff0000ff</color>
296
        <width>2</width>
297
      </LineStyle>
298
    </Style>
299
    <Placemark>
300
      <name>Flight ${TimeStamp}</name>
301
      <styleUrl>MK_gps-style</styleUrl>
302
      <LineString>
303
        <tessellate>1</tessellate>
304
        <altitudeMode>relativeToGround</altitudeMode>
305
        <coordinates>
306
EOF
307
        }
308
 
309
    return 0;
310
    }  
311
 
312
 
313
# Close KML
314
sub LogKmlClose()
315
    {
316
    if ( $LogKmlIsOpen )
317
        {
318
        # print KML-Trailer
319
        print LOGKML <<EOF;
320
        </coordinates>
321
      </LineString>
322
    </Placemark>
323
  </Document>
324
</kml>
325
EOF
326
        close LOGKML;
327
        $LogKmlIsOpen = 0;
328
        }
329
 
330
    return 0;
331
    }  
332
 
333
 
334
# Log KML
335
sub LogKml()
336
    {
337
    lock %MkOsd;   # until end of Block
338
 
339
    if ( $MkOsd{'_Timestamp'} >= time-10  and
340
         $MkOsd{'MKFlags'} & 0x02  and  $MkOsd{'CurPos_Stat'} == 1 )
341
        {
342
        # active connection to MK, MK is flying, valid GPS
343
        &LogKmlOpen();
344
 
345
        my $AltRel = $MkOsd{'CurPos_Alt'} - $MkOsd{'HomePos_Alt'};
346
        if ( $AltRel < 0 ) { $AltRel = 0; }
347
        printf LOGKML "          %f, %f, %f\n", $MkOsd{'CurPos_Lon'}, $MkOsd{'CurPos_Lat'}, $AltRel;
348
        }
349
    else
350
        {
351
        &LogKmlClose();
352
        }
353
    }
354
 
355
 
356
# Send Coords to GoogleEarth server
357
sub Send2GeServer()
358
    {
359
    lock %MkOsd;   # until end of Block
360
 
361
    if ( $MkOsd{'_Timestamp'} >= time-10  and
362
         $MkOsd{'MKFlags'} & 0x02  and  $MkOsd{'CurPos_Stat'} == 1 )
363
        {
364
        # active connection to MK, MK is flying, valid GPS
365
 
366
        my $AltRel = $MkOsd{'CurPos_Alt'} - $MkOsd{'HomePos_Alt'};
367
        if ( $AltRel < 0 ) { $AltRel = 0; }
368
 
369
        push @GeCoords, sprintf "%f, %f, %f", $MkOsd{'CurPos_Lon'}, $MkOsd{'CurPos_Lat'}, $AltRel;
370
        }
371
    }
372
 
373
 
374
sub MkLogLoop()
375
    {
376
    while (1)
377
        {
378
        &LogCsv();
379
        &LogKml();
380
        &LogGpx();
381
 
382
        &Send2GeServer();  # Google Earth
383
 
384
        # kurz schlafen legen
385
        usleep $LoopTime;
386
        }
387
    }
388
 
389
#
390
# Hauptprgramm
391
#       
392
 
393
if ( $0 =~ /logging.pl$/i )
394
    {
395
    # Program wurde direkt aufgerufen
396
 
397
    # Kommunikation zum MK herstellen
398
    $mk_thr = threads->create (\&MkCommLoop) -> detach();
399
 
400
    &MkLogLoop();
401
 
402
    # should never exit
403
    }
404
 
405
1;
406
 
407
__END__