diff --git a/conf/messages.xml b/conf/messages.xml index dd9755923d..c0f85e72fb 100644 --- a/conf/messages.xml +++ b/conf/messages.xml @@ -259,7 +259,7 @@ - + @@ -345,7 +345,7 @@ - + diff --git a/sw/ground_segment/cockpit/Paparazzi/MissionD.pm b/sw/ground_segment/cockpit/Paparazzi/MissionD.pm index 989f111d30..9197389fb0 100644 --- a/sw/ground_segment/cockpit/Paparazzi/MissionD.pm +++ b/sw/ground_segment/cockpit/Paparazzi/MissionD.pm @@ -20,6 +20,7 @@ sub Populate { my $notebook = $self->NoteBook(-ipadx => 6, -ipady => 6); $notebook->pack(-fill => 'both', -expand => "1"); $self->Advertise('notebook' => $notebook); + $self->{cur_block} = $self->{cur_stage} = -1; } use Data::Dumper; @@ -52,7 +53,7 @@ sub add_aircraft { sub on_ac_changed { my ($self, $aircraft, $event, $new_value) = @_; - print "in MissionD : on_flight_plan @_\n"; + print "in MissionD : on_ac_changed $aircraft, $event $new_value\n"; my $ac_id = $aircraft->get('-ac_id'); if ($event eq 'flight_plan') { if (defined $new_value) { diff --git a/sw/ground_segment/cockpit/Paparazzi/NDPage.pm b/sw/ground_segment/cockpit/Paparazzi/NDPage.pm index 2ca48c5699..8dbc81efd2 100644 --- a/sw/ground_segment/cockpit/Paparazzi/NDPage.pm +++ b/sw/ground_segment/cockpit/Paparazzi/NDPage.pm @@ -29,7 +29,7 @@ sub completeinit { sub visible { my ($self, $old_val, $new_val) = @_; - print "in EngineView::visible $new_val\n"; +# print "in EngineView::visible $new_val\n"; return unless defined $new_val and defined $self->{main_group}; my $zinc = $self->get('-zinc'); $zinc->itemconfigure ($self->{main_group}, diff --git a/sw/ground_segment/cockpit/Paparazzi/Strip.pm b/sw/ground_segment/cockpit/Paparazzi/Strip.pm index 71afbbb054..9741667318 100644 --- a/sw/ground_segment/cockpit/Paparazzi/Strip.pm +++ b/sw/ground_segment/cockpit/Paparazzi/Strip.pm @@ -68,18 +68,23 @@ sub completeinit { # $self->{fp} = $flight_plan; $self->{modes} = - { ap_mode => - { name => ["Manual", "Auto1", "Auto2", "Home"], - color => ["sienna", "blue", "brown", "red"] - }, - gps_mode => - { name => [ "No fix", "GPS dead reckoning only", "2D-fix", "3D-fix", "GPS + dead reckoning combined"], - color => ["red", "red", "orange", "brown", "orange"] - }, - rc_status => - { name => ["Lost","Ok", "Really lost", "error"], - color => ["orange", "brown", "red", "red"] - } + { + ap_mode => + { name => ["Manual", "Auto1", "Auto2", "Home"], + color => ["sienna", "blue", "brown", "red"] + }, + gps_mode => + { name => [ "No fix", "GPS dead reckoning only", "2D-fix", "3D-fix", "GPS + dead reckoning combined"], + color => ["red", "red", "orange", "brown", "orange"] + }, + rc_status => + { name => ["Ok","Lost", "Really lost", "error"], + color => ["orange", "brown", "red", "red"] + }, + contrast_status => + { name => ["Default","Waiting", "Set", "error"], + color => ["orange", "brown", "red", "red"] + } }; $self->{'frame'} = undef; @@ -170,12 +175,12 @@ sub draw { $self->add_value_text("gps_mode"); ## Cal label and value - $self->add_label("cal", "cal", 70, 46); - $self->add_value_text("cal"); + $self->add_label("cal", "contrast_status", 70, 46); + $self->add_value_text("contrast_status"); ## crst label and value - $self->add_label("crst", "crst", 70, 58); - $self->add_value_text("crst"); + $self->add_label("crst", "contrast_value", 70, 58); + $self->add_value_text("contrast_value"); @@ -184,8 +189,8 @@ sub draw { $self->add_value_text("alt"); ## desired alt label and value - $self->add_label("desired:","desired_alt", 150, 22); - $self->add_value_text("desired_alt"); + $self->add_label("desired:","target_alt", 150, 22); + $self->add_value_text("target_alt"); ## speed label and value $self->add_label("speed:", "speed", 150, 46); @@ -284,8 +289,6 @@ sub border_block { my @groups = (); my @x = ( 300, 350, 400, 450, 500, 550, 600, 650, 700, 750); - print "############ coucou\n"; - my $zinc = $self->get('-zinc'); $zinc->add('text', $self->{contentgroup}, -text => "Event1", @@ -293,8 +296,6 @@ sub border_block { -color => $self->{options}->{label_color} ); - print "############ coucou2\n"; - $zinc->add('text', $self->{contentgroup}, -text => "Event2", -position => [ 260, 60], -font => $self->{options}->{small_font}, -color => $self->{options}->{label_color} @@ -347,8 +348,7 @@ sub set_block { # FIXME: should be deprecated and we should use set_item or something like that sub setBat { - my $self = shift; - my ($bat) = @_; + my ($self, $bat) = @_; $self->{'battery'} = $bat; my $batcolor = '#8080ff'; $self->{'zinc'}->remove($self->{'zinc_bat'}); @@ -374,7 +374,8 @@ sub string_of_time { ############################################################################## sub attach_to_aircraft { my ($self) = @_; - my @options = ('flight_plan', 'mode', 'flight_time', 'bat', 'speed', 'climb', 'alt', 'target_alt', 'cur_block'); + my @options = ('flight_plan', 'ap_mode', 'rc_mode', 'gps_mode', 'contrast_status', 'contrast_value', + 'flight_time', 'alt', 'target_alt', 'speed', 'climb'); foreach my $option (@options) { $self->get('-aircraft')->attach($self, $option, [\&aircraft_config_changed]); } @@ -385,19 +386,26 @@ sub aircraft_config_changed { my ($self, $aircraft, $event, $new_value) = @_; # parse_config(); # parse flight plan -# print "in strip aircraft_config_changed $event $new_value\n"; + print "in strip aircraft_config_changed $event $new_value\n"; # flight_plan if ($event eq 'flight_plan' and defined $new_value) { - $self->border_block(); # display blocks of flight plan +# $self->border_block(); # display blocks of flight plan } - # mode (AP) - elsif ($event eq 'mode') { - $self->set_item("ap_mode",$self->{modes}->{ap_mode}->{name}[$new_value], $self->{modes}->{ap_mode}->{color}[$new_value]); # display blocks of flight plan + elsif ($event eq 'ap_mode' or $event eq 'rc_status' or + $event eq 'gps_mode' or $event eq 'contrast_status') { + my $names = $self->{modes}->{$event}->{name}; + my $colors = $self->{modes}->{$event}->{color}; + if ($new_value < @{$names} ) { + $self->set_item($event,$self->{modes}->{$event}->{name}[$new_value], $self->{modes}->{$event}->{color}[$new_value]); + } + else { + print "in Strip::aircraft_config_changed : wrong value $new_value for $event\n"; + } } elsif ($event eq 'flight_time') { - $self->set_item("flight_time",$self->string_of_time($new_value), $self->{options}->{value_color}); + $self->set_item("flight_time",$self->string_of_time($new_value), $self->{options}->{value_color}); } elsif ($event eq 'bat') { diff --git a/sw/ground_segment/cockpit/Paparazzi/StripPanel.pm b/sw/ground_segment/cockpit/Paparazzi/StripPanel.pm index 97bc5ff815..c32ccc71a7 100644 --- a/sw/ground_segment/cockpit/Paparazzi/StripPanel.pm +++ b/sw/ground_segment/cockpit/Paparazzi/StripPanel.pm @@ -59,7 +59,7 @@ sub add_strip { use constant NB_STRIP => 3; my $step = $self->get('-height') / NB_STRIP; my $nb_strips = keys %{$self->{strips}}; - my ($p, $w, $h) = ([5, 10 + $step * $nb_strips], 120, 45); + my ($p, $w, $h) = ([5, 5 + $step * $nb_strips], 120, 45); my $strip = Paparazzi::Strip->new( -zinc => $zinc, -parent_grp => $self->{sp_main_group}, -origin => $p, -width => $w, -height => $h, -aircraft => $aircraft); diff --git a/sw/ground_segment/cockpit/cockpit.pl b/sw/ground_segment/cockpit/cockpit.pl index 1edd1f7004..e3bfc15170 100755 --- a/sw/ground_segment/cockpit/cockpit.pl +++ b/sw/ground_segment/cockpit/cockpit.pl @@ -103,11 +103,11 @@ sub build_gui { -height => $pfd_h, ); # $self->{pfd}->attach($self, 'SHOW_PAGE', ['onShowPage']); -# $self->{nd} = Paparazzi::ND->new( -zinc => $zinc, -# -origin => $nd_p, -# -width => $nd_w, -# -height => $nd_h, -# ); + $self->{nd} = Paparazzi::ND->new( -zinc => $zinc, + -origin => $nd_p, + -width => $nd_w, + -height => $nd_h, + ); # $self->{nd}->attach($self, 'WIND_COMMAND', ['onWindCommand']); my $md = $bot_frame->MissionD(-bg => '#c1daff'); $md->pack(-side => 'bottom', -anchor => "n", -fill => 'both', -expand => 1); diff --git a/sw/lib/perl/Paparazzi/Aircraft.pm b/sw/lib/perl/Paparazzi/Aircraft.pm index 58a007845e..3cf11f730c 100644 --- a/sw/lib/perl/Paparazzi/Aircraft.pm +++ b/sw/lib/perl/Paparazzi/Aircraft.pm @@ -76,6 +76,13 @@ sub populate { amp => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, 0.], energy => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, 0.], + svid => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, []], + flags => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, []], + qi => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, []], + cno => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, []], + elev => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, []], + azim => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, []], + rc_status => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, 0.], rc_mode => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, 0.], @@ -84,6 +91,9 @@ sub populate { contrast_status => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, 0.], contrast_value => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, 0.], + if_mode => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, 0.], + if_value1 => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, 0.], + if_value2 => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, 0.], diff --git a/sw/lib/perl/Paparazzi/AircraftsManager.pm b/sw/lib/perl/Paparazzi/AircraftsManager.pm index 85cd183e96..9bd84cd57b 100644 --- a/sw/lib/perl/Paparazzi/AircraftsManager.pm +++ b/sw/lib/perl/Paparazzi/AircraftsManager.pm @@ -27,8 +27,6 @@ use Subject; @ISA = ("Subject"); use strict; -use Text::CSV; - use Paparazzi::IvyProtocol; use Paparazzi::Aircraft; use Paparazzi::Flightplan; @@ -63,14 +61,12 @@ sub on_aircraft_new_die { } sub on_aircrafts { - print "AircraftsManager : in on_aircrafts\n"; +# print "AircraftsManager::on_aircrafts\n"; my ($sender_name, $msg_class, $msg_name, $fields, $self) = @_; -# use Data::Dumper; -# print "fields ".Dumper($fields)."\n"; - my $csv = Text::CSV->new(); - $csv->parse($fields->{ac_list}); - my @ac_list = $csv->fields(); - foreach my $ac_id (@ac_list) { + use Data::Dumper; +# print "in AircraftsManager::on_aircrafts : dumping fields\n ".Dumper($fields); + my $ac_list = $fields->{ac_list}; + foreach my $ac_id (@{$ac_list}) { $self->add_aircraft($ac_id) unless $ac_id eq ""; } } @@ -91,7 +87,7 @@ sub add_aircraft { sub on_config { my ($sender_name, $msg_class, $msg_name, $fields, $self) = @_; - print "AircraftsManager : in on_config\n"; # if (COCKPIT_DEBUG); + print "AircraftsManager::on_config\n"; # use Data::Dumper; # print "fields ".Dumper($fields)."\n"; my $ac_id = $fields->{ac_id}; @@ -112,12 +108,24 @@ sub on_config { sub on_ac_msg { my ($sender_name, $msg_class, $msg_name, $fields, $self) = @_; -# print "in on_ac_msg $msg_name\n";# if (COCKPIT_DEBUG); my $ac_id = $fields->{ac_id}; my $aircraft = $self->get('-aircrafts')->{$ac_id}; - delete $fields->{ac_id}; -# print Dumper($fields); - $aircraft->configure(%{$fields}); +# print "AircraftsManager::on_ac_msg : $msg_name\n".Dumper($fields); + if (defined ($aircraft)) { + delete $fields->{ac_id}; + $aircraft->configure(%{$fields}); + } + else { + print STDERR "in AircraftsManager::on_ac_msg : unknow aircraft $ac_id in message $msg_class:$msg_name\n"; + } +} + +sub on_sv_info { + my ($sender_name, $msg_class, $msg_name, $fields, $self) = @_; + print "in AircraftsManager::on_sv_info\n".Dumper($fields); + + + } sub listen_to_ac { @@ -130,7 +138,7 @@ sub listen_to_ac { ['FLY_BY_WIRE', \&on_ac_msg], ['INFRARED', \&on_ac_msg], ['INFLIGH_CALIB', \&on_ac_msg], -# ['SATS', \&ivyOnSats], + ['SVINFO', \&on_sv_info], ); foreach my $event (@ac_events) { Paparazzi::IvyProtocol::bind_msg("ground", "ground", $event->[0], diff --git a/sw/lib/perl/Paparazzi/IvyProtocol.pm b/sw/lib/perl/Paparazzi/IvyProtocol.pm index 40f03b6dee..330f4ced23 100644 --- a/sw/lib/perl/Paparazzi/IvyProtocol.pm +++ b/sw/lib/perl/Paparazzi/IvyProtocol.pm @@ -2,6 +2,7 @@ package Paparazzi::IvyProtocol; use strict; use XML::DOM; +use Text::CSV; use Carp; use Ivy; @@ -72,13 +73,28 @@ sub on_msg_received { # print STDERR "##### on_msg_received ".Dumper(@_); my $ret = {}; my $msg = $classes_by_name->{$msg_class}->{$msg_name}; + unless (defined $msg) { + print STDERR "in IvyProtocol::on_msg_received : unknown message $msg_class $msg_name\n"; + return; + } my $nb_fields = @{$msg}; - for (my $i=0; $i<$nb_fields; $i++) { - my $field_name = $msg->[$i]->{name}; + foreach my $field (@{$msg}) { + my $field_name = $field->{name}; if ($known_fields->{$field_name}) { $ret->{$field_name} = $known_fields->{$field_name}; } else { - $ret->{$field_name} = shift @matched_regexps; + my $val = shift @matched_regexps; + if (exists $field->{format} and $field->{format} eq 'csv') { +# print "in IvyProtocol::on_msg_received : val $val\n"; + my $csv = Text::CSV->new(); + $csv->parse($val); + my @list = $csv->fields(); + pop @list if $list[$#list] eq ''; + $ret->{$field_name} = \@list; + } + else { + $ret->{$field_name} = $val; + } } } # print STDERR "ret : ".Dumper($ret)."\n";