use strict;
use warnings;
use Getopt::Std;
use vars '%opt';

getopt( 'hsdcn', \%opt );

if ($opt{"h"})
  {
  print qq~
  Usage: $0 -s Versorgungsspannung [V]
            -d Durchflussspannung [V]
            -c LED-Strom [mA]
            -n Anzahl LEDs
            -h Usage
  Example: $0 -s 12 -d 1.7 -c 35 -n 1
  Standardwerte fuer -d: 
      ir: 1.6, rt: 1.8, ge: 2.2,
      gn: 2.3, bl: 3.4, we: 3.5
  Example: $0 -s 12 -d bl -c 30 -n 2
  ~;
  exit;
  }

# Standardwerte fuer die einzelnen LED-Farben
my %default = ('ir' => 1.6, 'rt' => 1.8, 'ge' => 2.2,
#               infrarot    rot           gelb
               'gn' => 2.3, 'bl' => 3.4, 'we' => 3.5);
#               gruen       blau         weiss
# E12-Widerstandswerte 
my @E12 = qw(1.0 1.2 1.5 1.8 2.2 2.7 3.3 3.9 4.7 5.6 6.8 8.2);

# Fehlende Werte ergaenzen, -n 1  -c 20
$opt{'n'} = 1 unless defined($opt{'n'});
$opt{'c'} = 20 unless defined($opt{'c'});
if ($opt{'s'} && $opt{'d'} && $opt{'c'} && $opt{'n'})
  {
  # Zahlenangabe oder Standardwert?
  my $d = $default{$opt{'d'}} ? $default{$opt{'d'}} : $opt{'d'};
  # Fehlerbehandlung
  $opt{'s'} =~ /^\d+$/ or die "Versorgungsspannung keine Zahl\n";
  $opt{'c'} =~ /^\d+$/ or die "LED-Strom keine Zahl\n";
  $opt{'n'} =~ /^\d+$/ or die "Anzahl LEDs keine Zahl\n";
  $d =~ /^[0-9.]+$/ or die "Durchflussspannung keine Zahl\n";
  # nun wird gerechnet
  my $Ures = ($opt{'s'} - $opt{'n'}*$d);
  die "Durchflussspannung(en) > Versorgung\n" if ($Ures < 0);
  my $res = ($Ures/$opt{'c'})*1000;
  printf("Vorwiderstand.......: %1.1f Ohm\n", $res);
  # passenden Wert der E12-Reihe ermitteln, zuerst den Faktor:
  # getestet wird mit dem groessten Wert
  my $fakt = 1; my $i = 0;
  $fakt = $fakt*10 while ($E12[11]*$fakt < $res);
  # dann den naechstgroesseren Wert der E12-Reihe nehmen
  while ($E12[$i]*$fakt < $res) { $i++ };
  printf("Vorschlag E12-Reihe.: %1.1f Ohm\n", $E12[$i]*$fakt);
  }
