Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
727 rain-er 1
#!/usr/bin/perl
2
#!/usr/bin/perl -d:ptkdb
3
 
4
###############################################################################
5
#
6
# mktrack.pl -  Tracking Antenne 
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
# 2009-02-14 0.0.1 rw created
41
# 2009-04-01 0.1.0 rw RC1
42
# 2009-06-14 0.1.1 rw Tilt-Servo added
43
# 2009-08-15 0.1.2 rw Flip Pan/Tilt servo for >180 degree
44
#                     config servo direction and range
45
#                     optional get antenna home position from Map-config
46
#                     Signal handler replaced by command-queue
47
# 2009-09-30 0.1.3 rw Commandline parameter added
48
# 2009-10-07 0.1.4 rw COM-Port > 9
49
#                     Servo Speed, neutral position and 8 bit position
50
#                     Add Coldstart command
51
#                     Relax servo at shutdown
52
#                     PortSetSkip config
53
# 2010-01-02 0.1.5 rw bugfix 
54
#
55
###############################################################################
56
 
57
$Version{'track.pl'} = "0.1.5 - 2010-01-02";
58
 
59
 
60
if ( $0 =~ /track.pl$/i )
61
    {
62
    # Program wurde direkt aufgerufen
63
 
64
    # change working directory to program path
65
    my $Cwd = substr ($0, 0, rindex ($0, "track.pl"));
66
    chdir $Cwd;
67
 
68
    # set path for local Perl libs
69
    push @INC, $Cwd . "perl/lib";
70
    }
71
 
72
 
73
# Packages
74
use Time::HiRes qw(usleep gettimeofday);   # http://search.cpan.org/~jhi/Time-HiRes-1.9719/HiRes.pm
75
use threads;           # http://search.cpan.org/~jdhedden/threads-1.72/threads.pm
76
                       # http://perldoc.perl.org/threads.html
77
use threads::shared;   # http://search.cpan.org/~jdhedden/threads-shared-1.28/shared.pm
78
use Thread::Queue;     # http://search.cpan.org/dist/Thread-Queue-2.11/lib/Thread/Queue.pm
79
use Math::Trig;
80
use Geo::Ellipsoid;    # http://search.cpan.org/dist/Geo-Ellipsoid-1.12/lib/Geo/Ellipsoid.pm
81
                       # http://www.kompf.de/gps/distcalc.html
82
                       # http://www.herrmann-w.de/Geocaching/Downloads/Richt.XLS
83
                       # http://williams.best.vwh.net/avform.htm
84
                       # http://williams.best.vwh.net/gccalc.html
85
                       # http://de.wikipedia.org/wiki/Orthodrome
86
if ( $^O =~ /Win32/i )
87
    {
88
    require Win32::SerialPort;  # http://search.cpan.org/dist/Win32-SerialPort
89
    }
90
else
91
    {
92
    require Device::SerialPort; # http://search.cpan.org/~cook/Device-SerialPort-1.04/SerialPort.pm
93
    }
94
 
95
require "mkcomm.pl";   # MK communication
96
 
97
# Sharing for Threads
98
share (@ServoPos);
99
share (%MkTrack);
100
 
101
# Queue for receiving commands
102
$TrackQueue = Thread::Queue->new();
103
 
104
# Commandline
105
my %CmdLine = @ARGV;
106
 
107
 
108
#
109
# Parameter
110
#
111
 
112
# System Timer
113
$SysTimerResolution = 1000;  # Resolution in us
114
 
115
# Com Port for Pololu Mikro-Servoboard
116
# http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=65&products_id=118
117
my $ComPort = $Cfg->{'track'}->{'Port'}  || "COM8";
118
 
119
my $ServoPanCtrl  = $Cfg->{'track'}->{'ServoPanCtrl'}  || (0x00 | 15);
120
my $ServoTiltCtrl = $Cfg->{'track'}->{'ServoTiltCtrl'} || (0x20 | 15    );
121
my $ServoPanSpeed  = $Cfg->{'track'}->{'ServoPanSpeed'}  || 0;
122
my $ServoTiltSpeed = $Cfg->{'track'}->{'ServoTiltSpeed'} || 0;
123
my $ServoPanNeutral  = $Cfg->{'track'}->{'ServoPanNeutral'}  || 3000;
124
my $ServoTiltNeutral = $Cfg->{'track'}->{'ServoTiltNeutral'} || 3000;
125
 
126
$MkTrack{'ServoPanCtrl'}     = $ServoPanCtrl;
127
$MkTrack{'ServoTiltCtrl'}    = $ServoTiltCtrl;
128
$MkTrack{'ServoPanSpeed'}    = $ServoPanSpeed;
129
$MkTrack{'ServoTiltSpeed'}   = $ServoTiltSpeed;
130
$MkTrack{'ServoPanNeutral'}  = $ServoPanNeutral;
131
$MkTrack{'ServoTiltNeutral'} = $ServoTiltNeutral;
132
 
133
# Servo parameter
134
$ServoPan   = 0;            # Servo channel Pan
135
$ServoTilt  = 1;            # Servo channel Tilt
136
$MkTrack{'ServoPan'}  = $ServoPan;
137
$MkTrack{'ServoTilt'} = $ServoTilt;
138
@ServoSpeed = (200/40, 200/40, 200/40, 200/40, 200/40, 200/40, 200/40, 200/40); # ms/degree
139
$ServoConstPpm = 20;        # PPM protocol overhead in ms
140
 
141
@ServoTest = ( [  90,   0 ],       # Pan, Tilt in degrees for servo test
142
               [ 180,   0 ],
143
               [ 180,  90 ],
144
               [  90,   0 ],
145
               [   0,   0 ],
146
               [   0,  90 ],
147
               [  90,   0 ],
148
               [  90, 180 ],
149
               [  90,   0 ], );
150
 
151
# Tracking
152
$TrackInterval = 50;    # in ms
153
 
154
#
155
# Timer
156
#
157
 
158
sub SetTimer_ms()
159
    {
160
    return $SysTimerCount_ms + $_[0];
161
    }
162
 
163
sub CheckTimer_ms()
164
    {
165
    my $Diff = $_[0] - $SysTimerCount_ms;
166
    return ($Diff <= 0);
167
    }
168
 
169
#
170
# Servo
171
#
172
 
173
sub ServoInit()
174
    {
175
    # open COM-Port
176
    undef $ServoPort;
177
 
178
    if ( $ComPort =~ /^COM/i )
179
        {
180
        $ComPort = "\\\\.\\" . $ComPort;  # for Port > 9 required
181
        }
182
 
183
    if ( $^O =~ m/Win32/ )
184
        {
185
        $ServoPort = Win32::SerialPort->new ($ComPort) || die "Error open $ComPort\n";
186
        }
187
    else
188
        {
189
        $ServoPort = Device::SerialPort->new ($ComPort) || die "Error open $ComPort\n";
190
        }
191
 
192
    if ( ! ($Cfg->{'track'}->{'PortSetSkip'} =~ /y/i) )
193
        {
194
        # Set COM parameters, don't set for Bluetooth device
195
        $ServoPort->baudrate(38400);
196
        $ServoPort->parity("none");
197
        $ServoPort->databits(8);
198
        $ServoPort->stopbits(1);
199
        $ServoPort->handshake('none');
200
        $ServoPort->write_settings;
201
        }
202
 
203
    # Byte 1: sync - Pololu Mode
204
    # Byte 2: device
205
    # Byte 3: command
206
    # Byte 4: Servo num
207
 
208
    # Byte 5: Set Speed 0, 1..127, 0=full speed
209
    # Speed Pan/Tilt servo #0/#1
210
    my $Output = pack('C*', 0x80, 0x01, 0x01, 0, $ServoPanSpeed );
211
    $ServoPort->write($Output);
212
    my $Output = pack('C*', 0x80, 0x01, 0x01, 1, $ServoTiltSpeed );
213
    $ServoPort->write($Output);
214
 
215
    # Byte 5: Set Parameter
216
    #         Bit 6: Servo on/off 
217
    #         Bit 5: Direction 
218
    #         Bit 4-0: Servo Range
219
    # Set Pan/Tilt servo #0/#1
220
    my $Output = pack('C*', 0x80, 0x01, 0x00, 0, 0x40 | $ServoPanCtrl );
221
    $ServoPort->write($Output);
222
    my $Output = pack('C*', 0x80, 0x01, 0x00, 1, 0x40 | $ServoTiltCtrl );
223
    $ServoPort->write($Output);
224
 
225
    # Byte 5/6: Neutral in 0.5us
226
    # Neutral Pan/Tilt servo #0/#1
227
    my $Output = pack('C*', 0x80, 0x01, 0x05, 0, $ServoPanNeutral >> 7, $ServoPanNeutral & 0x7f);
228
    $ServoPort->write($Output);
229
    my $Output = pack('C*', 0x80, 0x01, 0x05, 1, $ServoTiltNeutral >> 7, $ServoTiltNeutral & 0x7f);
230
    $ServoPort->write($Output);
231
 
232
    @ServoStartTime = (0, 0, 0, 0, 0, 0, 0, 0);   # Timestamp of last ServoMove() call
233
    @ServoEndTime   = (0, 0, 0, 0, 0, 0, 0, 0);   # Timestamp of estimated arrival at end position
234
    @ServoPos       = (90, 90, 90, 90, 90, 90, 90, 90);   # Current servo position 0..180 degree
235
    }
236
 
237
 
238
sub ServoMove()
239
    {
240
    my ($Num, $Angel, $Time) = @_;
241
 
242
    my $Overhead = 0;
243
 
244
    if ( $Angel != $ServoPos[$Num] )
245
        {
246
        if ( $Angel < 0)   {$Angel = 0;}
247
        if ( $Angel > 180) {$Angel = 180;}
248
 
249
        my $Pos = int ($Angel * 255/180 + 0.5);   # angel 0..180 degree to servo position 0..255
250
 
251
        # output to COM port
252
        # Byte 1: sync - Pololu Mode
253
        # Byte 2: device
254
        # Byte 3: command
255
        # Byte 4: Servo num
256
        # Byte 5/6: servo position 0..255
257
 
258
        my $Output = pack('C*', 0x80, 0x01, 0x03, $Num, $Pos >> 7, $Pos & 0x7f);
259
        $ServoPort->write($Output);
260
 
261
        $Overhead += $ServoConstPpm;   # PPM protocol overhead
262
        }
263
 
264
    # set timer stuff for travel time predicion
265
    my $LastAngel = $ServoPos[$Num];
266
    my $EstimatedTime = abs($Angel - $LastAngel) * $ServoSpeed[$Num] + $Overhead;
267
    if ( $Time > 0 )
268
        {
269
        # Parameter override
270
        $EstimatedTime = $Time;
271
        }
272
    $ServoStartTime[$Num] = $SysTimerCount_ms;
273
    $ServoEndTime[$Num]   = $SysTimerCount_ms + $EstimatedTime;
274
    $ServoPos[$Num] = $Angel;
275
 
276
    return $ServoEndTime[$Num];
277
    }
278
 
279
 
280
# switch off servo
281
sub ServoRelax()
282
    {
283
    if ( defined $ServoPort )
284
        {
285
        # Byte 1: sync - Pololu Mode
286
        # Byte 2: device
287
        # Byte 3: command
288
        # Byte 4: Servo num
289
 
290
        # Byte 5: Set Parameter
291
        #         Bit 6: Servo on/off 
292
        #         Bit 5: Direction 
293
        #         Bit 4-0: Servo Range
294
        # Set Pan/Tilt servo #0/#1
295
        my $Output = pack('C*', 0x80, 0x01, 0x00, 0, 0x00 | $ServoPanCtrl );
296
        $ServoPort->write($Output);
297
        my $Output = pack('C*', 0x80, 0x01, 0x00, 1, 0x00 | $ServoTiltCtrl );
298
        $ServoPort->write($Output);
299
        }
300
    }
301
 
302
 
303
# Check, if servo has reached end position
304
sub ServoCheck()
305
    {
306
    my $Num = $_[0];
307
    return &CheckTimer_ms($ServoEndTime[$Num]);
308
    }
309
 
310
 
311
sub ServoClose()
312
    {
313
    # close COM-Port
314
    undef $ServoPort;
315
    }
316
 
317
 
318
 
319
 
320
#
321
# Track it
322
#
323
 
324
sub TrackAntennaGps()
325
    {
326
 
327
    # initialize system-timer
328
    $SysTimerCount_ms = 0;
329
    $SysTimerError = 0;
330
    ($t0_s, $t0_us) = gettimeofday;
331
 
332
    #
333
    # State maschine
334
    #
335
 
336
    my $State = "Idle";
337
    while (1)
338
        {
339
 
340
        $MkTrack{'State'} = $State;  # export state
341
 
342
        #
343
        # Idle
344
        #
345
        if ( $State eq "Idle" )
346
            {
347
            # nothing to do. Wait for commands in TrackQueue
348
            }
349
 
350
        #
351
        # ColdStart
352
        #
353
        elsif ( $State eq "ColdStart" )
354
            {
355
            &ServoInit();
356
 
357
 
358
            $ServoTestIndex = 0;
359
 
360
            $State = "InitServoTest";
361
            }
362
 
363
        #
364
        # Start servo test
365
        # doesn't really make much sense, but looks cool:-)
366
        #
367
 
368
        elsif ( $State eq "InitServoTest")
369
            {
370
            if ( &ServoCheck ($ServoPan)  and  &ServoCheck ($ServoTilt) )
371
                {
372
 
373
                my $PanPos  = $ServoTest[$ServoTestIndex][0];
374
                my $TiltPos = $ServoTest[$ServoTestIndex][1];
375
                $ServoTestIndex ++;
376
 
377
                if ( defined $PanPos  and  defined $TiltPos )
378
                    {
379
                    my $Delay = 200;
380
                    my $LastPan  = $ServoPos[$ServoPan];
381
                    my $LastTilt = $ServoPos[$ServoTilt];
382
                    my $EstimatedPan = 1000;
383
                    if ( $ServoPanSpeed != 0 )
384
                        {
385
                        # about 2ms/180degree pulse, 50us/s servo pulse change per unit
386
                        $EstimatedPan  = abs($PanPos  - $LastPan)  * 0.002/180 / ($ServoPanSpeed  * 0.000050) * 1000 + $Delay;
387
                        }
388
                    my $EstimatedTilt = 1000;
389
                    if ( $ServoTiltSpeed != 0 )
390
                        {
391
                        # about 2ms/180degree pulse, 50us/s servo pulse change per unit
392
                        $EstimatedTilt = abs($TiltPos - $LastTilt) * 0.002/180 / ($ServoTiltSpeed * 0.000050) * 1000 + $Delay;
393
                        }
394
 
395
                    &ServoMove ($ServoPan,  $PanPos,  $EstimatedPan);    # override travel time
396
                    &ServoMove ($ServoTilt, $TiltPos, $EstimatedTilt);  # override travel time
397
                    }
398
                else
399
                    {
400
                    # complete
401
                    $ServoTestIndex = 0;
402
                    $State = "WaitGps";
403
                    }
404
                }
405
            }
406
 
407
        #
408
        # Servo test finisched
409
        #
410
        # Wait for GPS Home position and compass
411
        #
412
 
413
        elsif ( $State eq "WaitGps" )
414
            {
415
            if ( &ServoCheck ($ServoPan) )
416
                {
417
                lock (%MkOsd);     # until end of block
418
                lock (%MkTrack);
419
 
420
                if ( $MkOsd{'_Timestamp'} >= time-2  and
421
                     $MkOsd{'SatsInUse'} >= 6 )
422
                    {
423
                    # gültige OSD daten vom MK und guter Satellitenempfang
424
 
425
                    # take GPS and compass from map definition or MK as antenna home-position
426
                    $MkTrack{'HomePos_Lon'} = $Map{'Track_Lon'}  ||  $MkOsd{'HomePos_Lon'};
427
                    $MkTrack{'HomePos_Lat'} = $Map{'Track_Lat'}  ||  $MkOsd{'HomePos_Lat'};
428
                    $MkTrack{'HomePos_Alt'} = $Map{'Track_Alt'}  ||  $MkOsd{'HomePos_Alt'};
429
                    $MkTrack{'CompassHeading'} = $Map{'Track_Bearing'}  ||  $MkOsd{'CompassHeading'};
430
 
431
                    $TrackTimer = &SetTimer_ms($TrackInterval);
432
 
433
                    $State = "TrackGps";
434
                    }
435
                }
436
            }
437
 
438
        #
439
        # GPS Fix Home position
440
        # Track now
441
        #               
442
        elsif ( $State eq "TrackGps" )
443
            {
444
            if ( &CheckTimer_ms($TrackTimer) and &ServoCheck($ServoPan) )
445
                {
446
                $TrackTimer = &SetTimer_ms($TrackInterval);   # reload Timer
447
 
448
                lock (%MkOsd);     # until end of block
449
                lock (%MkTrack);
450
 
451
                if ( $MkOsd{'_Timestamp'} >= time -2  and
452
                     $MkOsd{'SatsInUse'} >= 4 )
453
                    {
454
                    # valid OSD data from the MK and sufficient satellites
455
 
456
                    my $Track_Geo = Geo::Ellipsoid->new( 'units' => 'degrees',
457
                                                         'distance_units' => 'meter',
458
                                                         'ellipsoid' => 'WGS84',
459
                                                         'longitude' => 1,         # Symmetric: -pi..pi
460
                                                       );
461
 
462
                    my ($Dist, $Bearing) = $Track_Geo->to($MkTrack{'HomePos_Lat'}, $MkTrack{'HomePos_Lon'},
463
                                                          $MkOsd{'CurPos_Lat'}, $MkOsd{'CurPos_Lon'}); 
464
                    my $Dir_h = $MkTrack{'CompassHeading'};
465
                    my $Dir_c = $MkOsd{'CompassHeading'};
466
 
467
                    if ( $Dist < 4 )  # meter
468
                        {
469
                        # Too close to Home-Position. Set antenna to middle position                                            
470
                        $Bearing = $Dir_h;
471
                        }
472
 
473
                    $MkTrack{'Bearing'}    = sprintf ("%d", $Bearing);
474
                    $MkTrack{'Dist'}       = sprintf ("%d", $Dist);
475
                    $MkTrack{'CurPos_Lon'} = $MkOsd{'CurPos_Lon'};
476
                    $MkTrack{'CurPos_Lat'} = $MkOsd{'CurPos_Lat'};     
477
                    $MkTrack{'CurPos_Alt'} = $MkOsd{'CurPos_Alt'};
478
 
479
                    # antenna pan direction: 0..180 degree, centre = 90
480
                    my $AngelPan = $Bearing - $Dir_h + 90;
481
                    $AngelPan = $AngelPan % 360;
482
 
483
                    # antenna tilt direction: 0..180 degree, centre is up, 0 is front
484
                    my $AngelTilt = rad2deg(atan2(($MkOsd{'CurPos_Alt'} - $MkTrack{'HomePos_Alt'}), $Dist));
485
                    if ( $AngelTilt < 0 )   { $AngelTilt = 0; }
486
                    if ( $AngelTilt > 180 ) { $AngelTilt = 180; }
487
 
488
                    if ( $AngelPan >= 180 )
489
                        {
490
                        # Flip Pan/Tilt
491
                        $AngelPan = $AngelPan - 180;
492
                        $AngelTilt = 180 - $AngelTilt;
493
                        }
494
 
495
                    $MkTrack{'AngelPan'} = $AngelPan;
496
                    $MkTrack{'AngelTilt'} = $AngelTilt;
497
 
498
                    &ServoMove ($ServoPan, $AngelPan);
499
                    &ServoMove ($ServoTilt, $AngelTilt);
500
 
501
                    # Timestamp, wann der Datensatz geschtieben wurde
502
                    $MkTrack{'_Timestamp'} = time;
503
                    }
504
                }
505
            }
506
 
507
        else
508
            {
509
            # Restart
510
            $State = "ColdStart";
511
            }
512
 
513
        #
514
        # check command queue
515
        #
516
        while ( $TrackQueue->pending() > 0 )
517
            {
518
            my $Cmd = $TrackQueue->dequeue(1);
519
 
520
            if ( $Cmd =~ /COLDSTART/i )
521
                {
522
                $State = "ColdStart";
523
                }
524
 
525
            if ( $Cmd =~ /IDLE/i )
526
                {
527
                if ( defined $ServoPort )
528
                    {
529
                    # move all Servo to neutral position
530
                    &ServoMove ($ServoPan, 90);
531
                    &ServoMove ($ServoTilt, 0);
532
 
533
                    sleep 1;
534
                    &ServoRelax();   # swith off servo
535
                    }
536
 
537
                $State = "Idle";
538
                }
539
            }
540
 
541
        #
542
        # update system-timer
543
        #
544
        ($t1_s, $t1_us) = gettimeofday;
545
        $SysTimerSleep_us = ($t0_s - $t1_s) * 1000000 + $t0_us - $t1_us + $SysTimerCount_ms * $SysTimerResolution;
546
 
547
        if ($SysTimerSleep_us > 0)
548
            {
549
            usleep ($SysTimerSleep_us);
550
            }
551
        else
552
            {
553
            $SysTimerError ++;
554
            }
555
 
556
        $SysTimerCount_ms ++;
557
        }
558
    }
559
 
560
 
561
#
562
# Main Program
563
#
564
 
565
if ( $0 =~ /track.pl$/i )
566
    {
567
    # Program wurde direkt aufgerufen
568
 
569
    #
570
    # Commandline Parameter
571
    #
572
    my $TrackPort = $CmdLine{'-TrackPort'};
573
    if ( $TrackPort ne "" )
574
        {
575
        $ComPort = $TrackPort;
576
        }
577
 
578
    my $MkPort = $CmdLine{'-MkPort'};
579
    if ( $MkPort ne "" )
580
        {
581
        $Cfg->{'mkcomm'}->{'Port'} = $MkPort;
582
        }
583
 
584
    my $PanCtrl = $CmdLine{'-PanCtrl'};
585
    if ( $PanCtrl ne "" )
586
        {
587
        $ServoPanCtrl = $PanCtrl;
588
        }
589
 
590
    my $TiltCtrl = $CmdLine{'-TiltCtrl'};
591
    if ( $TiltCtrl ne "" )
592
        {
593
        $ServoTiltCtrl = $TiltCtrl;
594
        }
595
 
596
    my $PanSpeed = $CmdLine{'-PanSpeed'};
597
    if ( $PanSpeed ne "" )
598
        {
599
        $ServoPanSpeed = $PanSpeed;
600
        }
601
 
602
    my $TiltSpeed = $CmdLine{'-TiltSpeed'};
603
    if ( $TiltSpeed ne "" )
604
        {
605
        $ServoTiltSpeed = $TiltSpeed;
606
        }
607
 
608
    my $PanNeutral = $CmdLine{'-PanNeutral'};
609
    if ( $PanNeutral ne "" )
610
        {
611
        $ServoPanNeutral = $PanNeutral;
612
        }
613
 
614
    my $TiltNeutral = $CmdLine{'-TiltNeutral'};
615
    if ( $TiltNeutral ne "" )
616
        {
617
        $ServoTiltNeutral = $TiltNeutral;
618
        }
619
 
620
    # Kommunikation zum MK herstellen
621
    # Input: %MkOsd, %MkTarget, %MkNcDebug
622
    # Ouput: Thread-Queue: $MkSendQueue
623
    $mk_thr = threads->create (\&MkCommLoop) -> detach();
624
 
625
    $TrackQueue->enqueue("COLDSTART");   # start command
626
    &TrackAntennaGps();
627
 
628
    # should never exit
629
    }
630
 
631
1;
632
 
633
__END__