#!/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='/video0';
$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");
kill_vdr($VIDEODIR);
remove_driver();
load_driver();
unless ( start_vdr() ) # Wenn VDR-Start nicht erfolgreich ist
{
  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_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_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");
  system("modprobe -r ivtv-fb");
  system("modprobe -r ivtv");
  system("modprobe -r cinergyT2");
}


sub load_driver
{
  print "Lade Treiber...\n";
  system("modprobe cinergyT2");
  system("modprobe ivtv");
  system("modprobe ivtv-fb");
  print "Lade Treiber für Fernbedienung...\n";
  system("modprobe lirc_i2c");
  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 \"remote --lirc=/dev/lircd\" ";
#  $plugins .= "-P 'mp3 -i $VIDEODIR/plugins/image_convert.sh' ";
  $plugins .= "-P 'image -C $VIDEODIR/plugins/imageplugin.sh' ";
  $plugins .= "-P streamdev-server ";
  $plugins .= "-P epgsearch ";
  $plugins .= "-P bitstreamout ";
  $plugins .= "-P pvrinput ";
###################################
### Entweder die PVR so:
  $plugins .= "-P pvr350 ";
### oder per XINE:
#  $plugins .= "-P xine ";
###################################
  system("./vdr -w 90 -v $VIDEODIR -d -t /dev/tty5 -g /tmp -s $VIDEODIR/shutdownvdr $plugins");
  sleep 10;
  print "Prüfe, ob auch wirklich alle Karten ($NUMBER_OF_DVB_DEVICES) gefunden wurden...\n";
  my $tmp = `grep -a found /var/log/messages | grep device | grep found | grep -v "no primary device found" | tail -n 1`;
  if ($tmp =~ /found $NUMBER_OF_DVB_DEVICES video device/)
  {
    print "Es wurde(n) $NUMBER_OF_DVB_DEVICES 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 alle $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_vdr($VIDEODIR);
  remove_driver();
  die "Ende von $appname wegen Signal SIG$signame.\n";
}


