#!/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 = 2;

######################################################################
### 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");
kill_vdradmin($VIDEODIR);
kill_vdr($VIDEODIR);
remove_driver();
load_driver();
unless ( start_vdr() ) # Wenn VDR-Start nicht erfolgreich ist
{
  kill_vdradmin($VIDEODIR);
  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 vdradmin
  restart_vdradmin_if_not_running($VIDEODIR);

  # Ü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");
  kill_vdradmin($VIDEODIR);
  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
  {
    kill_vdradmin($VIDEODIR);
    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";
  sleep 2;
  system("modprobe -r evdev");
  sleep 2;
  system("modprobe -r dvb_ttpci");
#  sleep 2;
  system("modprobe -r cx88-dvb");
#  sleep 2;
  system("modprobe -r cx8800");
}


sub load_driver
{
  print "Lade Treiber für Nexus-S...\n";
  system("modprobe dvb_ttpci");

  print "Lade Treiber für Nova-S...\n";
  system("modprobe cx88-dvb");

  print "Lade Treiber für Fernbedienung...\n";
  system("modprobe evdev");
  sleep 1;
}


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

  print "Starte VDR...\n";
  chdir $VIDEODIR;
  my $plugins = "";
  $plugins .= "-P dvbsddevice ";
  $plugins .= "-P remote ";
  $plugins .= "-P epgsearch ";
  $plugins .= "-P streamdev-server ";
  $plugins .= "-P extrecmenu ";
#  $plugins .= "-P svdrpservice ";
#  $plugins .= "-P remoteosd ";
  $plugins .= "-P svdrposd ";
  $plugins .= "-P 'mp3 -i $VIDEODIR/plugins/image_convert.sh' ";
#  $plugins .= "-P 'image -C $VIDEODIR/plugins/imageplugin.sh' ";
#  $plugins .= "-P 'mplayer --mplayer $VIDEODIR/plugins/mplayer.sh' ";
  $plugins .= "-P radio ";
  $plugins .= "-P weatherng ";
  $plugins .= "-P 'osdteletext -r' ";
  $plugins .= "-P femon ";
  $plugins .= "-P 'suspendoutput --nomenu --logo' ";
  my $options = "-w 120 -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("ionice -c2 -n0 ./vdr $options $plugins");
  sleep 10;
  print "Prüfe, ob auch wirklich alle Karten (mindestens $NUMBER_OF_DVB_DEVICES) gefunden wurden...\n";
  my $tmp = `grep -a found /var/log/syslog | grep device | grep found | grep -v "no primary device found" | grep -v "no PNP device found" | tail -n 1`;
  $tmp =~ /found (\d+) DVB devices/;
  $erkannt = $1;
  if ($erkannt >= $NUMBER_OF_DVB_DEVICES)
  {
    print "Es wurde(n) $erkannt Karte(n) erkannt.\n";
    print "$tmp";
    print "Starte VDR-Admin...\n";
    chdir "$VIDEODIR/vdradmin";
    system("./vdradmind.pl");
    system("date");
    return 1;
  }
  else
  {
    print "FEHLER: Es wurde(n) NICHT mindestens $NUMBER_OF_DVB_DEVICES Karte(n) erkannt!\n";
    print "$tmp\n";
    system("date");
    return 0;
  }
}


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

