#!/usr/bin/perl -w

use lib '/usr/local/bin','/usr/sl';
use slmini;
use slvdr; # Download: http://www.loescher-online.de/progdata/slvdr.pm

######################################################################
### Voreinstellungen
######################################################################

$version = '1.2';
$appname = 'runvdr';

$VIDEODIR='/video';
# $NUMBER_OF_DVB_DEVICES = 1;

######################################################################
### Hauptprogramm
######################################################################

# Signal-Handler installieren
$SIG{HUP}  = \&catch_signal;
$SIG{INT}  = \&catch_signal;
$SIG{QUIT} = \&catch_signal;
$SIG{ABRT} = \&catch_signal;
$SIG{TERM} = \&catch_signal;

# Erster Start
print "Start von $appname $version\n";
system("date");
stop_vdr_sxfe();
kill_vdr($VIDEODIR);
remove_driver();
load_driver();
unless ( start_vdr() ) # Wenn VDR-Start nicht erfolgreich ist
{
  stop_vdr_sxfe();
  kill_vdr($VIDEODIR);
  remove_driver();
  load_driver();
  unless ( start_vdr() ) # Wenn VDR-Start nicht erfolgreich ist
  {
    reboot();
  }
}

print "Überwachung des VDR-Zustandes...\n";
while(1)
{
  sleep 10;

  # Überprüfung von vdr-sxfe
  restart_vdr_sxfe_if_not_running();

  # Überprüfung von vdr
  next if is_vdr_running();

  # Wenn VDR nicht mehr läuft:
  print "WARNING!!! VDR beendet! Neustart! ...\n";
  print "Datum: ";
  system("date");
  stop_vdr_sxfe();
  kill_vdr($VIDEODIR);

  # FIXME: Nur VDR durchstarten und nicht gleich den Treiber neu laden!

  remove_driver();
  load_driver();

  unless ( start_vdr() ) # Wenn VDR-Start nicht erfolgreich ist
  {
    stop_vdr_sxfe();
    kill_vdr($VIDEODIR);
    remove_driver();
    load_driver();
    unless ( start_vdr() ) # Wenn VDR-Start nicht erfolgreich ist
    {
      reboot();
    }
  }
}

######################################################################
### Unterprogramme
######################################################################

sub remove_driver
{
  print "Entferne Treiber...\n";
#  system("modprobe -r lirc_i2c");
}


sub load_driver
{
  print "Lade Treiber...\n";
#  system("/etc/init.d/lircd stop");
#  system("/etc/init.d/lircd zap");
#  system("/etc/init.d/lircd start");
#  sleep 1;
#  system("modprobe lirc_i2c");
}


sub start_vdr
{
  # Return-Wert:
  # 0 = Fehler beim Start von VDR
  # 1 = Alles OK.

  print "Starte VDR...\n";
  chdir $VIDEODIR;
  my $plugins = "";
#  $plugins .= "-P streamplayer ";
  $plugins .= "-P extrecmenu ";
  $plugins .= "-P'xineliboutput --local=none --remote=37890 --primary' ";
  my $options = "--lirc -w 60 -v $VIDEODIR -d -t /dev/tty5 -g /tmp --port=2001";
  # Sprache umstellen bzw. zumindest die Möglichkeit dazu bieten
  $ENV{LC_COLLATE}='de_DE';
  $ENV{LANG}='de_DE';
  system("./vdr $options -s $VIDEODIR/shutdownvdr $plugins");
  start_vdr_sxfe();
  sleep 1;
  system("date");
  return 1;
}


sub catch_signal
{
  my $signame = shift;
  print "Signal SIG$signame empfangen. Beende VDR...\n";
  stop_vdr_sxfe();
  kill_vdr($VIDEODIR);
  remove_driver();
  die "Ende von $appname wegen Signal SIG$signame.\n";
}

