Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
825 - 1
#!/usr/bin/perl
2
#!/usr/bin/perl -d:ptkdb
3
 
4
###############################################################################
5
#
6
# tts.pl -  Text To Speech
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-08-08 0.0.1 rw created
41
# 2010-07-01 0.5.0 rw TTS system messages closer to current situation
42
#
43
###############################################################################
44
 
45
$Version{'tts.pl'} = "0.5.0 - 2010-07-01";
46
 
47
# Packages
48
use threads;                # http://search.cpan.org/~jdhedden/threads-1.72/threads.pm
49
                            # http://perldoc.perl.org/threads.html
50
use threads::shared;        # http://search.cpan.org/~jdhedden/threads-shared-1.28/shared.pm
51
use Thread::Queue;          # http://search.cpan.org/dist/Thread-Queue-2.11/lib/Thread/Queue.pm
52
use Time::HiRes qw(usleep); # http://search.cpan.org/~jhi/Time-HiRes-1.9719/HiRes.pm
53
 
54
# eSpeak software required, download from: http://espeak.sourceforge.net/
55
 
56
# Queues for Sending Mesages to TTS Thread
57
$TtsSendQueueLow    = Thread::Queue->new(); # for low prio messages
58
$TtsSendQueueMedium = Thread::Queue->new(); # for medium prio messages
59
$TtsSendQueueHigh   = Thread::Queue->new(); # for high prio messages
60
 
61
share (%System);
62
share (%MkOsd);
63
 
64
$TtsMute = 0;   # Mute audio switch
65
 
66
# Main loop, never ending
67
sub TtsLoop()
68
    {
69
 
70
    # say hello
71
 
72
    # Parameter
73
    local $Program = $Cfg->{'tts'}->{'Program'}  || "C:/Program Files/eSpeak/command_line/espeak.exe";
74
    local $Options = $Cfg->{'tts'}->{'Options'}  || "-v de -a 200 -b";
75
    local $Welcome = $Cfg->{'tts'}->{'Welcome'}  || "Starte Mischn Kockpit";  
76
 
77
    if ( ! -f $Program )
78
        {
79
        print "TTS: Program \"$Program\" does not exist. Exit\n";
80
        return;
81
        }
82
 
83
    # say hello
84
    &TtsCall ($Welcome);
85
 
86
    while ( 1 )
87
        {      
88
        # process all High prio Messages
89
        while ( $TtsSendQueueHigh->pending() > 0 )
90
            {
91
            my $Text = $TtsSendQueueHigh->dequeue(1);
92
            &TtsCall($Text);
93
            }
94
 
95
        # process all Medium prio Messages
96
        while ( $TtsSendQueueMedium->pending() > 0  and
97
                $TtsSendQueueHigh->pending() == 0 )
98
            {
99
            my $Text = $TtsSendQueueMedium->dequeue(1);
100
            &TtsCall($Text);
101
            }
102
 
103
        # Check Low prio Messages one by one
104
        if ( $TtsSendQueueLow->pending() > 0  and
105
             $TtsSendQueueMedium->pending() == 0  and
106
             $TtsSendQueueHigh->pending() == 0 )
107
            {
108
            my $Text = $TtsSendQueueLow->dequeue(1);
109
            &TtsCall($Text);
110
            }
111
 
112
        usleep (100000); # 100ms
113
        }
114
    }
115
 
116
 
117
# call TTS program
118
sub TtsCall()
119
    {
120
    my ($Text) = @_;
121
 
122
    # Eval, if Text is function Call "&Fct()";
123
    if ( substr($Text, 0, 1) eq "&" )
124
        {
125
        $Text = eval "$Text";
126
        }
127
 
128
    my $Cmd = "\"$Program\" $Options \"$Text\"";
129
    system $Cmd;
130
    }
131
 
132
 
133
# Add Text to TTS-Queue
134
sub TtsSpeak ()
135
    {
136
    my ($Prio, $Text) = @_;
137
 
138
    if ( ! $TtsMute  and  $Cfg->{'tts'}->{'Active'} =~ /y/i )
139
        {
140
        if ( $Prio eq 'HIGH' )
141
            {
142
            $TtsSendQueueHigh->enqueue($Text);
143
            }
144
        elsif ( $Prio eq 'MEDIUM' )
145
            {
146
            $TtsSendQueueMedium->enqueue($Text);
147
            }
148
        else
149
            {
150
            $TtsSendQueueLow->enqueue($Text);
151
            }
152
        }
153
    }
154
 
155
 
156
# Clear pending Messages
157
sub TtsClear ()
158
    {
159
    my  ($Prio) = @_;
160
 
161
    while ($Prio eq 'HIGH'  and  $TtsSendQueueHigh->pending() >0 )
162
        {
163
        $TtsSendQueueHigh->dequeue();
164
        }
165
    while ($Prio eq 'MEDIUM' and $TtsSendQueueMedium->pending() >0 )
166
        {
167
        $TtsSendQueueMedium->dequeue();
168
        }
169
    while ($Prio eq 'LOW' and $TtsSendQueueLow->pending() >0 )
170
        {
171
        $TtsSendQueueLow->dequeue();
172
        }
173
    }
174
 
175
# Mute TTS
176
sub TtsMute ()
177
    {
178
    my ($Param) = @_;
179
 
180
    $TtsMute = $Param;
181
    }
182
 
183
 
184
# TTS evalution functions
185
sub TtsAltitude
186
    {
187
    if ( $System{'Alt'} < 0 )
188
        {
189
        return sprintf ("$Translate{'TtsAltitudeNegative'}", abs($System{'Alt'}) );
190
        }
191
    else
192
        {
193
        return sprintf ("$Translate{'TtsAltitude'}", $System{'Alt'} );
194
        }
195
    }
196
 
197
 
198
sub TtsFlightTime
199
    {
200
    my $Min = int ( ($System{'MkFlyingTime'} +1) / 60);
201
    my $Sec = int ( ($System{'MkFlyingTime'} +1) % 60);
202
    my $Text = sprintf ("$Translate{'TtsFlightTimeMinSec'}", $Min, $Sec);
203
    if ( $Min == 0 )
204
        {
205
        $Text = sprintf ("$Translate{'TtsFlightTimeSec'}", $Sec);
206
        }
207
    return $Text;
208
    }
209
 
210
sub TtsUBat
211
    {
212
    my ($Volt, $Tenth) = split '\.', $System{'UBat'};
213
    return sprintf ("$Translate{'TtsBattery'}", $Volt, $Tenth);
214
    }
215
 
216
sub TtsHomeDist
217
    {
218
    return sprintf ("$Translate{'TtsHomeDist'}", int ($System{'HomeDist'} + 0.5) );
219
    }
220
 
221
sub TtsTargetDist
222
    {
223
    return sprintf ("$Translate{'TtsTargetDist'}", int ($System{'TargetDist'} + 0.5) );
224
    }
225
 
226
sub TtsSatsInUse
227
    {
228
    return sprintf ("$Translate{'TtsSatellite'}", $MkOsd{'SatsInUse'});
229
    }
230
 
231
# Hauptprgramm
232
#       
233
 
234
if ( $0 =~ /tts.pl$/i )
235
    {
236
    # Program wurde direkt aufgerufen
237
    &TtsLoop();
238
 
239
    # should never exit
240
    }
241
 
242
1;
243
 
244
__END__