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";