diff options
Diffstat (limited to 'src/transduct')
-rwxr-xr-x | src/transduct | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/src/transduct b/src/transduct new file mode 100755 index 0000000..38561ae --- /dev/null +++ b/src/transduct @@ -0,0 +1,177 @@ +#!/usr/bin/perl -w +# +# transduct, an Ivy transductor +# +# Copyright (C) 2002 +# Centre d'Études de la Navigation Aérienne +# +# Main +# +# Authors: Gwenael Bothorel <bothorel@cena.dgac.fr> +# +# $Id$ +# + +use Ivy; +use strict; +use Getopt::Long; +use XML::Parser; +require File::Basename; + +my $bus = ":2010"; +my $verbose = undef; +my $filename = undef; +my $help = undef; +my $app_name = "TRANSDUCT"; +my $num_message = 0; +my @outputs; +my @outputtoggles; +my $max_nb_parameters = 10; +my %toggled_message; +my $output_type = undef; + +my %options = ('bus=s', \$bus, + 'verbose', \$verbose, + 'file=s', \$filename, + 'help', \$help); +GetOptions (%options); + +if ($help) { + Usage (); + exit; +} + +if (! $filename) { + print "Transductor file is mandatory\n"; + Usage (), + exit; +} + +# Niveau de verbosité : +# 0 : très verbeux +# 1 : moins verbeux +# +if (defined $verbose) { + $verbose = 0; + Verbose (__LINE__, 0, "Verbose=yes"); +} else { + $verbose = 1; + Verbose (__LINE__, 0, "Verbose=no"); +} + +Ivy->init (-loopMode => 'LOCAL', -appName => $app_name, -ivyBus => $bus); +my $ivy = Ivy->new (-ivyBus => $bus, -appName => $app_name); +$ivy->start; + +my $p = XML::Parser->new(Style => 'Subs'); +$p->parsefile ($filename); + +$ivy->mainLoop; + +############################################################################### + +sub Verbose { + my ($line, $value, $msg) = @_; + + if ($value >= $verbose) { + my $FILE = File::Basename::basename (__FILE__); + print "$FILE:$line: $msg\n"; + } +} + +sub Usage { + print "Usage : transduct --file transductor_file [--bus my_bus] [--verbose] [--help]\n"; + print "Options :\n"; + print " --file : transductor file\n"; + print " --bus : Ivy bus\n"; + print " --verbose : verbose mode\n"; + print " --help : help\n"; +} + +sub message { + $num_message++; + Verbose (__LINE__, 0, "A new message"); +} + +sub input { + Verbose (__LINE__, 0, "A new input"); + my ($parser, $elementname, %attrs) = @_; + (my $name) = $attrs{name}; + Verbose (__LINE__, 0, "input <$name>"); + $ivy->bindRegexp ("$name", [\&CB_Callback, $num_message]); + if ($attrs{type}) { + my $type = $attrs{type}; + if ($type eq "toggle") { + $toggled_message{$num_message} = 0; + } + } +} + +sub output { + Verbose (__LINE__, 0, "A new output"); + $output_type="normal"; +} + +sub outputtoggle { + Verbose (__LINE__, 0, "A new outputtoggle"); + $output_type="toggled"; +} + +sub item { + Verbose (__LINE__, 0, "A new item"); + my ($parser, $elementname, %attrs) = @_; + (my $msg) = $attrs{msg}; + Verbose (__LINE__, 0, "output item <$msg>"); + + if($output_type eq "normal") { + if (! $outputs[$num_message]) { + $outputs[$num_message] = $msg; + } else { + $outputs[$num_message] .= " , $msg"; + } + } else { + if (! $outputtoggles[$num_message]) { + $outputtoggles[$num_message] = $msg; + } else { + $outputtoggles[$num_message] .= " , $msg"; + } + } +} + +sub CB_Callback { + my ($who, $num, @tab) = @_; + my $toggled = undef; + Verbose (__LINE__, 0, "Message num = $num"); +# for (my $i = 0; $i < $max_nb_parameters; $i++) { +# if ($tab[$i]) { +# print " <$tab[$i]>"; +# } +# } +# print "\n"; + + if (defined $toggled_message{$num}) { + if ($toggled_message{$num} == 0) { + Verbose (__LINE__, 0, "The toggle button was off"); + $toggled_message{$num} = 1; + } else { + Verbose (__LINE__, 0, "The toggle button was on"); + $toggled_message{$num} = 0; + my @tab_msgs = split (/ , /, $outputtoggles[$num]); + foreach my $item (@tab_msgs) { + for (my $i = 0; $i < $max_nb_parameters; $i++) { + $item =~ s/\$$i/$tab[$i-1]/; + } + $ivy->sendMsgs ($item); + } + return; + } + } + + my @tab_msgs = split (/ , /, $outputs[$num]); + foreach my $item (@tab_msgs) { + for (my $i = 0; $i < $max_nb_parameters; $i++) { + $item =~ s/\$$i/$tab[$i-1]/; + } + $ivy->sendMsgs ($item); + } +} |