#!/usr/bin/perl
# last modified : 10/12/16 17:50:23 

$date = 'Dec 14, 2007';

$makefile = 'Makefile';
$common   = 'common.h';
$rcd      = 'nbbq';

$deb      = 0;

$camac[0]{'name'} = 'TOYO CC/7700';
$camac[0]{'cciodef'} = 'CCIO_CC7700';
$camac[0]{'make'} = 'bb-cc77';
$camac[0]{'use'} = 0;
$camac[1]{'name'} = 'Kinetic K2915';
$camac[1]{'cciodef'} = 'CCIO_K2915';
$camac[1]{'make'} = 'bb-k2915';
$camac[1]{'use'} = 0;
$camac[2]{'name'} = 'TOYO CC/NET';
$camac[2]{'cciodef'} = 'CCIO_CCNET';
$camac[2]{'make'} = 'bb-ccnet';
$camac[2]{'use'} = 0;

$vme[0]{'name'} = 'Bit3 SBS 618/620';
$vme[0]{'viodef'} = 'VIO_SBS620';
$vme[0]{'make'} = 'bb-sbs620';
$vme[0]{'use'} = 0;
$vme[1]{'name'} = 'Wiener VMEMM';
$vme[1]{'viodef'} = 'VIO_VMEMM';
$vme[1]{'make'} = 'bb-vmemm';
$vme[1]{'use'} = 0;
$vme[2]{'name'} = 'Advanet Advme 8001';
$vme[2]{'viodef'} = 'VIO_ADVME';
$vme[2]{'make'} = 'bb-advme';
$vme[2]{'use'} = 0;
$vme[3]{'name'} = 'CAEN V2718';
$vme[3]{'viodef'} = 'VIO_V2718';
$vme[3]{'make'} = 'bb-v2718';
$vme[3]{'use'} = 0;
$vme[4]{'name'} = 'VMIVME 7807';
$vme[4]{'viodef'} = 'VIO_UNIV';
$vme[4]{'make'} = 'bb-univ';
$vme[4]{'use'} = 0;


@online = ('nbbqcom','analyzer','blkmonitor');
@ccio   = ('nbbqccio','ccutil');
@vio    = ('nbbqvio','vmeutil');

$blksize = 16384;
$shmkey  = 17001;
$semkey  = 18001;

$anaport = 16730;
$monitorport = 13948;

$nbbqdrv{'major'} = 122;
$nbbqdrv{'dev'}   = '/dev/nbbqdrv';
$babildrv{'major'} = 124;
$babildrv{'dev'}   = '/dev/babildrv';
$viodrv{'major'}  = 126;
$viodrv{'dev'}    = '/dev/nbbqvio';
$cciodrv{'major'} = 127;
$cciodrv{'dev'}   = '/dev/nbbqccio';

$use{'autoana'} = 1;

print "***********  NBBQ Configure ***********\n";
print "  Version $date          H.Baba\n";
print "\n\n";

# Kernel version
print "Kernel 2.6? [y] : ";
$yn = <STDIN>;
$yn = &chkyn($yn,1);
if($yn){
  $niroku = 1;
  $mkfile = 'Makefile.26';
}else{
  $niroku = 0;
  $mkfile = 'Makefile.24';
}
print "\n";

system("cp nbbqdrv/$mkfile nbbqdrv/Makefile");


# RedHat or Debian
print "Use Debian? [n] : ";
$yn = <STDIN>;
$yn = &chkyn($yn,0);
if($yn){
  $deb = 1;
}else{
  $deb = 0;
}
print "\n";


# Default
print "Use default settings? [y] : ";
$yn = <STDIN>;
$yn = &chkyn($yn,1);
if($yn){
  $custom = 0;
}else{
  $custom = 1;
}
print "\n";

if($custom){
  # Install Dir
  print "Install Dir [/usr/nbbq] : ";
  $dir = <STDIN>;
  &st(*dir);
  if($dir eq ''){
    $dir = '/usr/nbbq';
  }
}else{
  $dir = '/usr/nbbq';
}
print "\n";

# CAMAC
print "Use CAMAC? [y] : ";
$yn = <STDIN>;
$yn = &chkyn($yn,1);
if($yn){
  $use{'camac'} = 1;
}else{
  $ues{'camac'} = 0;
}
print "\n";
if($use{'camac'}){
  $cc_cnt = 0;
  while(!$cc_cnt){
    print "Choose CAMAC Crate Controllers\n";
    for($i=0;$i<=$#camac;$i++){
      print "$camac[$i]{'name'}? [y] : ";
      $yn = <STDIN>;
      $yn = &chkyn($yn,1);
      if($yn){
	$camac[$i]{'use'} = 1;
	$cc_cnt ++;
	system("cp -f $camac[$i]{'make'}/$mkfile $camac[$i]{'make'}/Makefile");
      }
    }
    if(!$cc_cnt){
      print "No CAMAC Crate Controller.\n\n";
    }
  }
  print "\n";
  print "Use NBBQCCIO (driver for cmdcc)? [y] : ";
  $yn = <STDIN>;
  $yn = &chkyn($yn,1);
  if($yn){
    $use{'ccio'} = 1;
    system("cp -f nbbqccio/$mkfile nbbqccio/Makefile");
  }else{
    $use{'ccio'} = 0;
  }
  if($custom){
    while($use{'ccio'}){
      print "Input NBBQCCIO Major Number. [127] : ";
      $major_ccio = <STDIN>;
      &st(*major_ccio);
      if($major_ccio eq ''){
	last;
      }
      if($major_ccio =~ /\D/){
	print "Invalid Number.\n\n";
      }else{
	$cciodrv{'major'} = $major_ccio;
	last;
      }
    }
  }
  if($cc_cnt > 1){
    $loop = 1;
    while($loop){
      print "\nSelect default Crate Controller.\n";
      for($i=0;$i<=$#camac;$i++){
	if($camac[$i]{'use'}){
	  print "$camac[$i]{'name'}? [y] : ";
	  $yn = <STDIN>;
	  $yn = &chkyn($yn,1);
	  if($yn){
	    $ccio_ctrl = $i;
	    $loop = 0;
	    last;
	  }
	}
      }
    }
  }else{
    for($i=0;$i<=$#camac;$i++){
      if($camac[$i]{'use'}){
	$ccio_ctrl = $i;
      }
    }
  }
}


print "\n";
# VME
print "Use VME? [y] : ";
$yn = <STDIN>;
$yn = &chkyn($yn,1);
if($yn){
  $use{'vme'} = 1;
}else{
  $ues{'vme'} = 0;
}
if($use{'vme'}){
  $vme_cnt = 0;
  while(!$vme_cnt){
    print "Choose VME Controllers.\n";
    for($i=0;$i<=$#vme;$i++){
      print "$vme[$i]{'name'}? [y] : ";
      $yn = <STDIN>;
      $yn = &chkyn($yn,1);
      if($yn){
	$vme[$i]{'use'} = 1;
	$vme_cnt ++;
	system("cp -f $vme[$i]{'make'}/$mkfile $vme[$i]{'make'}/Makefile");
      }
    }
    if(!$vme_cnt){
      print "No VME Controller.\n\n";
    }
  }
  print "\n";
  print "Use NBBQVIO (driver for cmdvme)? [y] : ";
  $yn = <STDIN>;
  $yn = &chkyn($yn,1);
  if($yn){
    $use{'vio'} = 1;
    system("cp -f nbbqvio/$mkfile nbbqvio/Makefile");
  }else{
    $use{'vio'} = 0;
  }
  if($custom){
    while($use{'vio'}){
      print "Input NBBQVIO Major Number. [126] : ";
      $major_vio = <STDIN>;
      &st(*major_vio);
      if($major_vio eq ''){
	last;
      }
      if($major_vio =~ /\D/){
	print "Invalid Number.\n\n";
      }else{
	$viodrv{'major'} = $major_vio;
	last;
      }
    }
  }
  if($vme_cnt > 1){
    $loop = 1;
    while($loop){
      print "\nSelect default VME Controller.\n";
      for($i=0;$i<=$#vme;$i++){
	if($vme[$i]{'use'}){
	  print "$vme[$i]{'name'}? [y] : ";
	  $yn = <STDIN>;
	  $yn = &chkyn($yn,1);
	  if($yn){
	    $vio_ctrl = $i;
	    $loop = 0;
	    last;
	  }
	}
      }
    }
  }else{
    for($i=0;$i<=$#vme;$i++){
      if($vme[$i]{'use'}){
	$vio_ctrl = $i;
      }
    }
  }
}


# nbbqdrv
print "\n";
print "Use on-line analys? [y] : ";
$yn = <STDIN>;
$yn = &chkyn($yn,1);
if($yn){
  $use{'nbbqdrv'} = 1;
}else{
  $ues{'nbbqdrv'} = 0;
  $use{'autoana'} = 0;
}
print "\n";
if($use{'nbbqdrv'}){
  if($custom){
    while(1){
      print "Input NBBQDRV Major Number. [122] : ";
      $major_nbbqdrv = <STDIN>;
      &st(*major_nbbqdrv);
      if($major_nbbqdrv eq ''){
	last;
      }
      if($major_nbbqdrv =~ /\D/){
	print "Invalid Number.\n\n";
      }else{
	$nbbqdrv{'major'}  = $major_nbbqdrv;
	last;
      }
    }
    while(1){
      print "Input Block Size. [16384] : ";
      $blksize = <STDIN>;
      &st(*blksize);
      if($blksize eq ''){
	$blksize = 16384;
	last;
      }
      if($blksize =~ /\D/){
	print "Invalid Number.\n\n";
      }else{
	last;
      }
    }
  }else{
    $major_nbbqdrv = 122;
    $blksize = 16384;
  }
  if($custom){
    print "Auto start \'analyzer\'? [y] : ";
    $yn = <STDIN>;
    $yn = &chkyn($yn,1);
    if($yn){
      $use{'autoana'} = 1;
    }else{
      $use{'autoana'} = 0;
    }
  }
  print "\n";
}


# write into common.h
open(OUT,"> $common");
print OUT "/* Common definition file */\n\n";
print OUT "/* VIOCTRL */\n";
if($use{'vio'}){
  print OUT "\#define $vme[$vio_ctrl]{'viodef'}\n";
}else{
  print OUT "/* No use */\n";
}
print OUT "\n";
#
print OUT "/* CCIOCTRL */\n";
if($use{'ccio'}){
  print OUT "\#define $camac[$ccio_ctrl]{'cciodef'}\n";
}else{
  print OUT "/* No use */\n";
}
print OUT "\n";
#
$str = sprintf("0x%04x",$blksize);
print OUT "/* Block Size */\n";
print OUT "\#define BLKSIZE $str\n\n";
#
print OUT "/* Shared Memory Keys */\n";
print OUT "\#define SHMKEY $shmkey\n";
print OUT "\#define SEMKEY $semkey\n\n";
#
print OUT "/* Ports */\n";
print OUT "\#define ANAPORT $anaport\n";
print OUT "\#define MONITORPORT $monitorport\n\n";
#
print OUT "/* Driver Major Numbers */\n";
print OUT "\#define NBBQ_MAJOR     $nbbqdrv{'major'}\n";
print OUT "\#define NBBQVIO_MAJOR  $viodrv{'major'}\n";
print OUT "\#define NBBQCCIO_MAJOR $cciodrv{'major'}\n";
close(OUT);

open(OUT,"> $rcd");
print OUT "\#!/bin/bash\n\#\n\#       /etc/rc.d/init.d/nbbq\n";
print OUT "\#\n\# Starts the NBBQ\n\n\# Source function library.\n";
if(!$deb){
  print OUT ". /etc/init.d/functions\n\n";
}
print OUT "RETVAL=0\nDIR=$dir\nINSM=/sbin/insmod\nRMM=/sbin/rmmod\n";
print OUT "LSM=/sbin/lsmod\n\n";
print OUT "start() {\n";
$mkl = "\$INSM \$DIR/";
if($use{'autoana'}){
#  print OUT "\t${dir}/analyzer/analyzer \&\n";
  if(!$deb){
    print OUT "\tdaemon ${dir}/analyzer/analyzer -D\n";
  }else{
    print OUT "\tstart-stop-daemon --start --quiet --exec ${dir}/analyzer/analyzer -- \"-D\"\n";
  }
}


if($niroku){
  $doto = 'ko';
}else{
  $doto = 'o';
}

for($i=0;$i<=$#camac;$i++){
  if($camac[$i]{'use'}){
    print OUT "\t$mkl$camac[$i]{'make'}/$camac[$i]{'make'}.$doto\n";
  }
}
for($i=0;$i<=$#vme;$i++){
  if($vme[$i]{'use'}){
    print OUT "\t$mkl$vme[$i]{'make'}/$vme[$i]{'make'}.$doto\n";
  }
}
if($use{'ccio'}){
  print OUT "\t$mkl$ccio[0]/$ccio[0].$doto\n";
}
if($use{'vio'}){
  print OUT "\t$mkl$vio[0]/$vio[0].$doto\n";
}
print OUT "}\n\n";
print OUT "stop() { \n";
$mkl = "\$RMM ";
print OUT "\t${mkl}nbbqdrv\n";
if($use{'ccio'}){
  print OUT "\t$mkl$ccio[0]\n";
}
if($use{'vio'}){
  print OUT "\t$mkl$vio[0]\n";
}
for($i=0;$i<=$#camac;$i++){
  if($camac[$i]{'use'}){
    print OUT "\t$mkl$camac[$i]{'make'}\n";
  }
}
for($i=0;$i<=$#vme;$i++){
  if($vme[$i]{'use'}){
    print OUT "\t$mkl$vme[$i]{'make'}\n";
  }
}
if($use{'autoana'}){
  if(!$deb){
    print OUT "\tkillproc analyzer \n";
  }else{
    print OUT "\tstart-stop-daemon --stop --oknodo --exec ${dir}/analyzer/analyzer\n";
  }
}


print OUT "}\n\n";
print OUT "restart() {\n        stop\n        start\n}\n\n";
print OUT "reload() {\n        restart\n}\n\n";
print OUT "status_at() {\n        \$LSM\n}\n\n";
print OUT "case \"\$1\" in\nstart)\n        start\n        ;;\n";
print OUT "stop)\n        stop\n        ;;\nreload|restart)\n";
print OUT "        restart\n        ;;\nstatus)\n        status_at\n";
print OUT "        ;;\n*)\n        echo \$\"Usage: \$0 ";
print OUT "{start|stop|restart|status}\"\n        exit 1\n";
print OUT "esac\n\nexit \$?\nexit \$RETVAL\n";
close(OUT);

open(OUT,"> $makefile");
print OUT "ALL : all\n\n";
print OUT "INSTDIR = $dir\n";
if(!$deb){
  print OUT "RCD = /etc/rc.d\n\n";
}else{
  print OUT "RCD = /etc\n\n";
}
for($j=0;$j<2;$j++){
  if($j == 0){
    print OUT "all : \n";
    $mkl = "\n";
  }else{
    print OUT "clean : \n";
    print OUT "\trm -f Module.symvers\n";
    $mkl = " clean\n";
  }
  for($i=0;$i<=$#camac;$i++){
    if($camac[$i]{'use'}){
      print OUT "\tmake -C $camac[$i]{'make'}$mkl";
    }
  }
  for($i=0;$i<=$#vme;$i++){
    if($vme[$i]{'use'}){
      print OUT "\tmake -C $vme[$i]{'make'}$mkl";
    }
  }
  if($use{'ccio'}){
    foreach $line (@ccio){
      print OUT "\tmake -C $line$mkl";
    }
  }
  if($use{'vio'}){
    foreach $line (@vio){
      print OUT "\tmake -C $line$mkl";
    }
  }
  if($use{'nbbqdrv'}){
    foreach $line (@online){
      print OUT "\tmake -C $line$mkl";
    }
  }
  print OUT "\n";
}

print OUT "install :\n";
if($use{'ccio'}){
  print OUT "\tmknod -m 0666 $cciodrv{'dev'} c $cciodrv{'major'} 0\n";
}
if($use{'vio'}){
  print OUT "\tmknod -m 0666 $viodrv{'dev'} c $viodrv{'major'} 0\n";
}
if($use{'nbbqdrv'}){
  print OUT "\tmknod -m 0666 $nbbqdrv{'dev'} c $nbbqdrv{'major'} 0\n";
  print OUT "\tmknod -m 0666 $babildrv{'dev'} c $babildrv{'major'} 0\n";
}
print OUT "\tmkdir \$(INSTDIR)\n";
print OUT "\tcp -dpR * \$(INSTDIR)/\n";
print OUT "\tchown -R root:root \$(INSTDIR)/*\n";
print OUT "\tchmod +s /sbin/insmod\n";
print OUT "\tchmod +s /sbin/rmmod\n";
print OUT "\tcp -f \$(INSTDIR)/nbbq \$(RCD)/init.d/\n";
print OUT "\tln -sf \$(RCD)/init.d/nbbq \$(RCD)/rc2.d/S99nbbq\n";
print OUT "\tln -sf \$(RCD)/init.d/nbbq \$(RCD)/rc3.d/S99nbbq\n";
print OUT "\tln -sf \$(RCD)/init.d/nbbq \$(RCD)/rc5.d/S99nbbq\n";
if($niroku){
print OUT "\tchmod 666 /usr/nbbq/Module.symvers\n";
}
print OUT "\n";

print OUT "update :\n";
print OUT "\trm -rf \$(INSTDIR)\n";
print OUT "\tmkdir \$(INSTDIR)\n";
print OUT "\tcp -dpR * \$(INSTDIR)/\n";
print OUT "\tchown -R root:root \$(INSTDIR)/*\n";
print OUT "\tcp -f \$(INSTDIR)/nbbq \$(RCD)/init.d/\n";
close(OUT);

chmod(0755,'nbbq');

sub st{
  local(*line) = @_;
  $line =~ s/ //g;
  $line =~ s/\n//;
}

sub chkyn{
  local($yn) = $_[0];
  local($mode) = $_[1];
  local($ret);
  &st(*yn);
  if($yn eq ''){
    $ret = $mode;
  }elsif($yn eq 'y' || $yn eq 'yes'){
    $ret = 1;
  }elsif($yn eq 'n' || $yn eq 'no'){
    $ret = 0;
  }else{
    $ret = $mode;
  }
  return $ret;
}
