diff --git a/sw/supervision/Paparazzi/CpGui.pm b/sw/supervision/Paparazzi/CpGui.pm deleted file mode 100755 index 615f7e146f..0000000000 --- a/sw/supervision/Paparazzi/CpGui.pm +++ /dev/null @@ -1,358 +0,0 @@ -package Paparazzi::CpGui; - -use Subject; -use Paparazzi::CpSessionMgr; -@ISA = qw(Paparazzi::CpSessionMgr); - -use strict; - -use Tk; -use Tk::MainWindow; -use Tk::NoteBook; -use Tk::HList; -use Tk::ItemStyle; -use Data::Dumper; - -sub populate { - my ($self, $args) = @_; - $self->SUPER::populate($args); - $self->configspec(-logo_file => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, undef], - -variables => [S_SUPER, S_SUPER, S_SUPER, S_SUPER, S_SUPER, {}], - ); -} -sub completeinit { - my ($self) = @_; - $self->SUPER::completeinit(); - $self->build_gui(); -} - -sub onProgramSelected { - my ($self, $pgm_name) = @_; - $self->toggle_program($pgm_name); -} - -sub onSessionSelected { - my ($self, $session_name) = @_; - $self->{'session_command_'.$session_name}->configure(-state => 'disabled'); - $self->start_session($session_name); - $self->add_session_page($session_name); -} - -sub onCloseSession { - my ($self, $session_name) = @_; - print "on close session\n"; - $self->kill_session($session_name); - $self->{'session_command_'.$session_name}->configure(-state => 'active'); - $self->remove_session_page($session_name); -} - -use constant LIST_WIDTH => 80; -use constant LIST_HEIGHT => 20; - - -sub onCompile { - my ($self) = @_; - my $paparazzi_src = Paparazzi::Environment::paparazzi_src(); - print `cd $paparazzi_src; make`; - -} - -sub build_gui { - my ($self) = @_; - my $mw = MainWindow->new(); - $self->{mw} = $mw; - $mw->title ($self->{cp_name}); - # menu bar - my $menubar = - $mw->Frame( -relief => 'ridge')->pack(-side => 'top', -fill => 'x'); - my $session_menu = $menubar->Menubutton(-text => 'Sessions')->pack(-side => 'left');; - my $sessions = $self->get('-sessions'); - foreach my $session_name (sort keys %{$sessions}) { - $self->{'session_command_'.$session_name} = - $session_menu->command( -label => $session_name, - -command => [\&onSessionSelected, $self, $session_name] ); - } - my $program_menu = $menubar->Menubutton(-text => 'Programs')->pack(-side => 'left');; - my $programs = $self->get(-programs); - foreach my $pgm_name (keys %{$programs}) { - $program_menu->command( -label => $pgm_name, - -command => [\&onProgramSelected, $self, $pgm_name] - ); - } - # session frame - my $session_frame = $mw->Frame( -relief => 'groove')->pack(-side => 'bottom', -fill => 'both', -expand => "yes",); - my $notebook = $session_frame->NoteBook( -ipadx => 6, -ipady => 6); - $self->{notebook} = $notebook; - $notebook->pack(-expand => "yes", - -fill => "both", - -padx => 5, -pady => 5, - -side => "top"); - $self->build_logo_page($notebook); -# $self->build_compile_page($notebook); -# $self->build_list_page($notebook, "hosts", "Hosts", ["name", "ip", "status"], \&build_hosts_page); -# $self->build_list_page($notebook, "variables", "Variables", ["name", "value"], \&build_variables_page); -# $self->build_list_page($notebook, "programs", "Programs", ["name", "command", "args"], \&build_programs_page); -# $self->build_programs_page($notebook); -# $self->build_list_page($notebook, "sessions", "Sessions", ["name", "command", "args"], \&build_sessions_page); -# $self->build_programs_page($notebook); -# my $programs_page = $notebook->add("programs", -label => "Programs", -underline => 0); -# my $sessions_page = $notebook->add("sessions", -label => "Sessions", -underline => 0); - - $self->{session_frame} = $session_frame; - - check_paparazzi_home($mw); - -} - -sub check_paparazzi_home { - my ($mw) = @_; - if (Paparazzi::Environment::paparazzi_home() eq "/usr/share/paparazzi") { - my $button = $mw->messageBox( - -title => 'Welcome to Paparazzi', - -type => 'YesNo', - -message => "Paparazzi needs access to a writable directory to store your data and settings. Do you want Paparazzi to use a temporary system directory ?"); - - my $pph = ""; - - if ($button eq "Yes") { - $pph = `mktemp -d /tmp/paparazzi.XXXXXXXX`; - print "using dir $pph as paparazzi_home\n" - } - else { - $pph = $mw->chooseDirectory(-title => 'choose a directory', - -initialdir => '~/paparazzi' - ); -# print "choosed $file_name\n"; - if ($pph eq "") { - die("need a writable dir. Exiting"); - } - } - my $pps = "/usr/share/paparazzi"; - `cd $pps && make -f conf/Makefile.install DESTDIR=$pph install_skel\n`; - } -} - - - -sub build_logo_page { - my ($self, $notebook) = @_; - my $logo_filename = $self->get('-logo_file'); - return unless defined $logo_filename; - my $logo_page = $notebook->add("logo", -label => "Logo", -underline => 0); - my $image = $logo_page->Photo('logogif', -format => 'GIF', - -file => $logo_filename); - my $labelImage = $logo_page->Label('-image' => 'logogif')->pack(); - return $logo_page; -} - -sub build_compile_page { - my ($self, $notebook) = @_; - my $compile_page = $notebook->add("compile", -label => "Compile", -underline => 0); - my $paparazzi_src = Paparazzi::Environment::paparazzi_src(); - my(@pl) = qw/-side top -expand yes -padx 10 -pady 10 -fill both/; - my $ground_frame = $compile_page->Frame(-label => 'Ground', -borderwidth => 2, - relief =>'groove')->pack(@pl); -# my $airborne_frame = $compile_page->Frame(-label => "Air", -borderwidth => 2, - relief =>'groove')->pack(@pl); -# my $ground_frame = $compile_page->Frame(-borderwidth => 2, - relief =>'groove')->pack(@pl); - my $airborne_frame = $compile_page->Frame(-borderwidth => 2, - relief =>'groove')->pack(@pl); - @pl = qw/-side top -expand yes -pady 2 -anchor w/; - my $mode_txt = 'Mode : '. (defined $paparazzi_src ? "Source tree" : "System install"); - my $mode_label = $ground_frame->Label(-text => $mode_txt)->pack(@pl); - my $paparazzi_src_txt = 'location : '. (defined $paparazzi_src ? $paparazzi_src : "/usr/share/paparazzi"); - my $paparazzi_src_label = $ground_frame->Label(-text => $paparazzi_src_txt)->pack(@pl); - my $make_button = $ground_frame->Button( - -text => "Compile", - -width => 10, - -command => [\&onCompile, $self], - ); - $make_button->pack(qw/-side top -expand yes -pady 2/); - - my @header = ("name", "airframe", "radio", "flight plan"); - my $hlist = $airborne_frame->Scrolled ('HList', - # -selectmode => 'extended', - -header => 1, - # -columns => $#header + 1, - -width => LIST_WIDTH, -# -height => LIST_HEIGHT, - -itemtype => 'imagetext', - -indent => 35, - -separator => '/', - )->grid(-sticky => 'nsew'); - - Paparazzi::Environment::read_config(); - -} - -sub build_hosts_page { - my ($self, $hlist, $e, $section_h, $item) = @_; - $hlist->itemCreate ($e, 0, - -itemtype => 'text', - -text => $item - ); - my $ip = $section_h->{$item}; - $hlist->itemCreate ($e, 1, - -itemtype => 'text', - -text => $ip?$ip:"unknown" - ); - $hlist->itemCreate ($e, 2, - -itemtype => 'text', - -text => "unknown" - ); -} - -sub build_variables_page { - my ($self, $hlist, $e, $section_h, $item) = @_; - $hlist->itemCreate ($e, 0, -itemtype => 'text', - -text => $item - ); - $hlist->itemCreate ($e, 1, -itemtype => 'text', - -text => $section_h->{$item}, - ); -} - -#sub build_programs_page { -# my ($self, $hlist, $e, $section_h, $item) = @_; -# $hlist->itemCreate ($e, 0, -itemtype => 'text', -# -text => $item -# ); -# $hlist->itemCreate ($e, 1, -itemtype => 'text', -# -text => $section_h->{$item}->{command}, -# ); - -# $hlist->itemCreate ($e, 2, -itemtype => 'text', -# -text => $section_h->{$item}->{args}, -# ); -#} - -sub build_sessions_page { - my ($self, $hlist, $e, $section_h, $item) = @_; - $hlist->itemCreate ($e, 0, -itemtype => 'text', - -text => $item - ); - $hlist->itemCreate ($e, 1, -itemtype => 'text', - -text => $section_h->{$item}->{command}, - ); - - $hlist->itemCreate ($e, 2, -itemtype => 'text', - -text => $section_h->{$item}->{args}, - ); -} - - -sub build_programs_page { - my ($self, $notebook) = @_; - my $page = $notebook->add("programs", -label => "Programs", -underline => 0); - my @header = ("name", "command", "args"); - my $hlist = $page->Scrolled ('HList', -# -selectmode => 'extended', - -header => 1, -# -columns => $#header + 1, - -width => LIST_WIDTH, - -height => LIST_HEIGHT, - -itemtype => 'imagetext', - -indent => 35, - -separator => '/', - )->grid(-sticky => 'nsew'); -# for my $i (0 .. $#header) { -# $hlist->header('create', $i, -text => $header[$i]); -# } - my $section_h = $self->get('-programs'); - foreach my $program (keys %{$section_h}) { -# print Dumper($section_h->{$program})."\n"; - $hlist->add($program, -text => $program ); - - $hlist->add($program."/command", -text => "command : ".$section_h->{$program}->{command}); - $hlist->add($program."/args", -text => "args :"); - my $args = $section_h->{$program}->{args}; - foreach my $argh (@{$args}) { - $hlist->add($program."/args/".$argh->{flag}, -text => $argh->{flag}."\t". $argh->{type}."\t". $argh->{value}); - } - } - return $page -} - - -sub build_list_page { - my ($self, $notebook, $section, $label, $header, $row_fun) = @_; - my $page = $notebook->add($section, -label => $label, -underline => 0); - my @header = @{$header}; - my $hlist = $page->Scrolled ('HList', - -header => 1, - -columns => $#header + 1, - -width => LIST_WIDTH, - -height => LIST_HEIGHT, - )->grid(-sticky => 'nsew'); - for my $i (0 .. $#header) { -# print("header $header[$i]\n"); - $hlist->header('create', $i, -text => $header[$i]); - } - my $section_h = $self->get('-'.$section); -# print "CpGui variables ".Dumper($section_h) if ($section eq "variables"); - foreach my $item (keys %{$section_h}) { - my $e = $hlist->addchild(""); - &$row_fun($self, $hlist, $e, $section_h, $item); - # print("$hlist, $e, $section_h, $item\n"); - } - return $page -} - -sub add_session_page { - my ($self, $session_name) = @_; - my ($mw, $notebook) = ($self->{mw}, $self->{notebook}); - my $page_id = "session_".$session_name; - my $session_page = $notebook->add($page_id, -label => "$session_name", - -underline => 0); - my $sessions = $self->get('-sessions'); - my $session = $sessions->{$session_name}; - my $hlist = $session_page->Scrolled ('HList', - -scrollbars => 'o', - -header => 1, - -columns => 3, - -width => LIST_WIDTH, - -height => LIST_HEIGHT, - -command => [\&on_session_pgm_clicked, $self, $session_name], - )->grid(-columnspan => 2); - $hlist->header('create', 0, -text => 'name'); - $hlist->header('create', 1, -text => 'status'); - $hlist->header('create', 2, -text => 'args'); - foreach my $i (0..@{$session->{pgms}}-1) { - my $pgm = $session->{pgms}->[$i]; - my $pgm_name = $pgm->{name}; - print "i $i name : $pgm_name\n"; - $hlist->add($i); - $hlist->itemCreate($i, 0, -text => $pgm_name ); - $hlist->itemCreate($i, 1, -text => 'on' ); - $hlist->itemCreate($i, 2, -text => 'blah' ); - } - $self->{$session_name.'hlist'} = $hlist; -# $session_page->Button( -text => "killall")->grid(-column => 0, -row => 1); - $session_page->Button( -text => "close", - -command => [\&onCloseSession, $self, $session_name])->grid(-column => 1, -row => 1); - $notebook->raise($page_id); -} - -sub remove_session_page { - my ($self, $session_name) = @_; - my $notebook = $self->{notebook}; - my $page_id = "session_".$session_name; - $notebook->delete($page_id); -} - -sub on_session_pgm_clicked { - print "in CpGui::on_session_pgm_clicked @_\n"; - my ($self, $session_name, $pgm_idx) = @_; - $self->toggle_program_in_session($session_name, $pgm_idx); - my $text = $self->get_session_program_status($session_name, $pgm_idx) ? 'on' : 'off'; - $self->{$session_name.'hlist'}->itemConfigure($pgm_idx, 1, -text => $text); -} - -1; - - - - - - - - - - diff --git a/sw/supervision/Paparazzi/CpPgmMgr.pm b/sw/supervision/Paparazzi/CpPgmMgr.pm deleted file mode 100644 index 0b5dd4558d..0000000000 --- a/sw/supervision/Paparazzi/CpPgmMgr.pm +++ /dev/null @@ -1,79 +0,0 @@ -package Paparazzi::CpPgmMgr; - -use Subject; -@ISA = ("Subject"); - -use strict; - -sub populate { - my ($self, $args) = @_; - $self->SUPER::populate($args); - $self->configspec(-children => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, {}], - ); -} - -sub completeinit { - my $self = shift; - $self->SUPER::completeinit; -} - -sub start_program() { - my ($self, $pgm, @options, @args, $keep_stdin) = @_; - my %children = %{$self->get('-children')}; - -# print("in ChildrenSpawner::start_programm args [$pgm @args]\n"); - my $pid = undef; - my $sleep_count = 0; - my $fh; - do { - $pid = fork(); - $SIG{PIPE} = sub { die "whoops, $pgm pipe broke" }; - unless (defined $pid) { - warn "cannot fork: $!"; - die "bailing out" if $sleep_count++ > 6; - sleep 1; - } - } until defined $pid; - - if (! $pid) { # child - $SIG{TERM} = 'IGNORE'; - exec ($pgm, @options, @args);# or die "couldnt exec foo: $pgm @args"; - # NOTREACHED - exit(1); - } - # parent - $children{$pid} = {cmd => $pgm, args => \@args};#, ktw => $fh}; - $self->configure('-children', \%children); -# foreach my $key (keys %children) { -# print("in ChildrenSpawner::start_programm child: [$key $children{$key}]\n"); -# } - return $pid; -} - -sub stop_program() { - my ($self, $pid) = @_; -# print "in_stop_program $pid\n"; - - my %children = %{$self->get('-children')}; - my $pgm = $children{$pid}; - - if (defined $pgm) { -# printf STDOUT "Killing Process %d [%s %s]\n", $pid, $pgm->{cmd}, $pgm->{args}; - kill 9, $pid; - $children{$pid} = undef; - $self->configure('-children', \%children); - } -} - - -sub terminate_all() { - my ($self) = @_; -# print("in ChildrenSpawner::terminate_all\n"); - my %pgms = %{$self->get('-children')}; - foreach my $pid (keys %pgms) { -# print "killing $pid ($pgms{$pid})\n"; - $self->stop_program($pid); - } -} - -1; diff --git a/sw/supervision/Paparazzi/CpSessionMgr.pm b/sw/supervision/Paparazzi/CpSessionMgr.pm deleted file mode 100644 index 798df5ca52..0000000000 --- a/sw/supervision/Paparazzi/CpSessionMgr.pm +++ /dev/null @@ -1,248 +0,0 @@ -package Paparazzi::CpSessionMgr; - -use Data::Dumper; -use XML::DOM; -use Subject; - -use Paparazzi::CpPgmMgr; -@ISA = qw(Paparazzi::CpPgmMgr); - -use strict; - -sub populate { - my ($self, $args) = @_; - $self->SUPER::populate($args); - $self->configspec(-config_file => [S_NEEDINIT, S_PASSIVE, S_RDONLY, S_OVRWRT, S_NOPRPG, undef], - -bin_base_dir => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, "/usr/bin"], - -log_dir => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, "/var/tmp"], - -variables => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, {}], - -hosts => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, {}], - -programs => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, {}], - -sessions => [S_NOINIT, S_PASSIVE, S_RDWR, S_OVRWRT, S_NOPRPG, {}], - ); -} - -sub completeinit { - my ($self) = @_; - $self->SUPER::completeinit(); -# my $cfg_file = $self->get('-config_file'); -# my $variables = $self->get('-variables'); -# $self->read_cfg($cfg_file); - $self->check_config(); -} - -sub prepare_args { - my ($self, $args, $session) = @_; - my (@options, @rargs); - my $variables = $self->get('-variables'); -# print "CpSessionMgr : variables ".Dumper($variables); - foreach my $opt (@{$args}) { - my $type = $opt->{type}; - my $flag = $opt->{flag}; - my $value; - if ($type eq 'var') { - if (defined $session and exists $session->{vars}->{$opt->{value}}) { - $value = $session->{vars}->{$opt->{value}} - } - else { - $value = $variables->{$opt->{value}} - } - } - else { - $value = $opt->{value}; - } - if ($flag) { - if ($flag =~ /\.*=/) { push @options, $flag.$value} - else {push @options, $flag, $value} - } - else { push @rargs, $value} - } - return (@options, @rargs); -} - -sub find_binary { - my ($self, $program) = @_; - my $command; - if ($program->{command} =~ /^\/.*/) { - $command = $program->{command}; - } - else { - $command = $self->get('-bin_base_dir')."/".$program->{command}; - } - return $command; -} - -sub toggle_program { - my ($self, $pgm_name) = @_; - print "processing program out session context\n"; - my $program = $self->get('-programs')->{$pgm_name}; - if (defined $program->{pid}) { - $self->SUPER::stop_program($program->{pid}); - $program->{pid} = undef; - } - else { - my (@options, @args) = $self->prepare_args($program->{args}); - my $command = $self->find_binary($program); - print "starting $program->{name} [$command @options @args]\n"; - $program->{pid} = $self->SUPER::start_program($command, @options[0..$#options], @args[0..$#args]); - } -} - -sub toggle_program_in_session { - my ($self, $session_name, $pgm_idx) = @_; - $self->check_config(); - my $session = $self->get('-sessions')->{$session_name}; - my $session_program = $session->{pgms}->[$pgm_idx]; -# print "processing program in session context\n".Dumper($session); - if (defined $session_program->{pid}) { - print "killing program $session_program->{name} => $session_program->{pid}\n"; - $self->SUPER::stop_program($session_program->{pid}); - $session_program->{pid} = undef; - } - else { - print "launching program\n"; - my $program_name = $session_program->{name}; - my $program = $self->get('-programs')->{$program_name}; - my (@pgm_options, @pgm_args) = $self->prepare_args($program->{args}, $session); - my (@session_options, @session_args) = $self->prepare_args($session_program->{args}); - push @pgm_options, @session_options; - push @pgm_args, @session_args; - my $command = $self->find_binary($program); - print "starting $program->{name} [$command @pgm_options @pgm_args]\n"; - $session_program->{pid} = $self->SUPER::start_program($command, @pgm_options[0..$#pgm_options], @pgm_args[0..$#pgm_args]); - # print "launched $program_name => pid $session_program->{pid}\n"; - } -} - -sub start_session { - my ($self, $session_name) = @_; - $self->check_config(); -# print "starting session $session_name\n"; - my $sessions = $self->get('-sessions'); - my $session = $sessions->{$session_name}; - my @progs = @{$session->{pgms}}; -# print "progs ".Dumper(@progs); - foreach my $pgm_idx (0..@progs-1) { - $self->toggle_program_in_session($session_name, $pgm_idx); - } -} - -sub kill_session { - my ($self, $session_name) = @_; - my $session = $self->get('-sessions')->{$session_name}; - my @progs = @{$session->{pgms}}; - foreach my $pgm_idx (0..@progs-1) { - $self->toggle_program_in_session($session_name, $pgm_idx) if ($self->get_session_program_status($session_name, $pgm_idx)); - } -} - -sub get_session_program_status { - my ($self, $session_name, $pgm_idx) = @_; - my $session = $self->get('-sessions')->{$session_name}; - my $session_program = $session->{pgms}->[$pgm_idx]; - return (defined $session_program->{pid}); -} - - -# -# check if the config file has been modified since we parsed it and -# eventually reread it -# -sub check_config { - my ($self) = @_; - my $cfg_file = $self->get('-config_file'); - my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, - $atime,$mtime,$ctime,$blksize,$blocks) - = stat($cfg_file); - - if (not exists $self->{last_cfg_read_time} or $mtime > $self->{last_cfg_read_time}) { - print("(re) reading config\n"); - $self->read_cfg($cfg_file); - $self->{last_cfg_read_time} = $mtime; - } -} - -sub xml_parse_args { - my ($args) = @_; - my @args_a; - foreach my $arg (@{$args}){ - my $var = $arg->getAttribute('variable'); - my $args_h = { - flag => $arg->getAttribute('flag'), - type => $var eq '' ? 'const' : 'var', - value => $var eq '' ? $arg->getAttribute('constant'): $var, - }; - push @args_a, $args_h; - } -# print "@args_a\n"; - return \@args_a; -} - -sub xml_parse_section { - my ($self, $section) = @_; - my $section_name = $section->getAttribute('name'); - my ($items_name) = ($section_name =~ /(.*)s$/); -# print "section $section_name items_name $items_name\n"; - my $items = $section->getElementsByTagName($items_name); - my $h_name = '-'.$section_name; -# print "h_name $h_name\n"; - my $tmp = $self->get($h_name); - foreach my $item (@{$items}){ - if ($section_name eq "hosts") { - $tmp->{$item->getAttribute('name')} = $item->getAttribute('ip'); - } - elsif ($section_name eq 'variables') { - $tmp->{$item->getAttribute('name')} = $item->getAttribute('value'); - } - elsif ($section_name eq 'programs') { - my $pgm_name = $item->getAttribute('name'); - my $args = $item->getElementsByTagName("arg"); - my $args_h = xml_parse_args($args); - $tmp->{$pgm_name} = - {name => $pgm_name, - command => $item->getAttribute('command'), - args => $args_h, - }; - } - elsif ($section_name eq 'sessions') { - my $session_name = $item->getAttribute('name'); - my $xsessions_pgms = $item->getElementsByTagName("program"); - my @sessions_pgms; - foreach my $session_pgm (@{$xsessions_pgms}){ - my $pgm_name = $session_pgm->getAttribute('name'); - my $session_args = $session_pgm->getElementsByTagName("arg"); - my $args_h = xml_parse_args($session_args); - push @sessions_pgms, { - name => $pgm_name, - args => $args_h - }; - } - my $session_vars = {}; - my @xsession_vars = $item->getElementsByTagName("variable"); - foreach my $session_var (@xsession_vars){ - $session_vars->{$session_var->getAttribute('name')} = $session_var->getAttribute('value') - } - $tmp->{$session_name} = { - name => $session_name, - pgms => \@sessions_pgms, - vars => $session_vars, - }; - } - } - $self->configure($h_name => $tmp); -} - -sub read_cfg { - my ($self, $filename) = @_; - my $parser = XML::DOM::Parser->new(); - my $doc = $parser->parsefile($filename); - my $cp = $doc->getElementsByTagName("control_panel")->[0]; - $self->{cp_name} = $cp->getAttribute('name'); - my $sections = $cp->getElementsByTagName("section"); - foreach my $section (@{$sections}) { - $self->xml_parse_section($section); - } -} - - -1;