use strict;
use warnings;
use IO::Socket;

# Das Programm erwartet einen Kommandozeilenparameter
die "Usage: $0 <IP-Adresse>\n" if ($#ARGV != 0);
my $port = $ARGV[0];

my ($sock, $answer, $beenden, $i, $all);

my %menu = ('1' => 'Digitaleingang abfragen',
            '2' => 'Analogeingang abfragen',
            '3' => 'Ausgang schalten',
            '4' => 'Ausgangs-Status abfragen',
            'B' => 'Beenden');

$sock = createsocket();
$beenden = 0;

while (! $beenden)
  {
  print "\n";
  foreach my $key (sort(keys(%menu)))
    { print "$key : $menu{$key}\n"; }
  print "? ";
  my $auswahl = <STDIN>;
  chomp($auswahl);
  next unless($auswahl);
  last if (uc($auswahl) eq 'B');
  if ($auswahl eq '1')
    {
    print "Digitaleingänge: ";
    for $i (1..4)
      {
      print $sock "GETPORT $i\r\n";
      $answer = <$sock>;
      chomp($answer); $answer =~ s/\r//;
      print "$answer ";
      }
    print "\n Leitung Nummer: 1 2 3 4";
    print "\n";
    }
  elsif ($auswahl eq '2')
    {
    print "Analogeingänge: ";
    for $i (1..4)
      {
      print $sock "GETADC $i\r\n";
      $answer = <$sock>;
      chomp($answer); $answer =~ s/\r//;
      my $volt = ($answer * 5/1023);
      printf "%3d (%4.2f V)  ", $answer, $volt;
      }
    print "\nLeitung Nummer:";
    for $i (1..4) {print "      $i       "; }
    print "\n";
    }
  elsif ($auswahl eq '3')
    {
    print "Ausgang (1..8) und Wert (0/1) eingeben: ";
    $answer = <STDIN>;
    # Komma oder Blank zwischen den Zahlen erlauben
    $answer =~ s/,/ /; 
    my ($num, $wert) = split(' ',$answer);
    print $sock "SETPORT $num.$wert\r\n";
    $answer = <$sock>;
    chomp($answer); $answer =~ s/\r//;
    print "$answer\n";
    }
  elsif ($auswahl eq '4')
    {
    # Digitaler Ausgangsstatus
    print $sock "GETSTATUS\r\n";
    $answer = <$sock>;
    chomp($answer); $answer =~ s/\r//;
    $answer =~ s/^S//;  # "S" am Anfang weg
    $answer =~ s/(.)/ \1/g;  # Leerzeichen dazwischen
    print "Digitalausgänge: $answer\n";
    print " Leitung Nummer:  8 7 6 5 4 3 2 1\n";
    }
  }
close($sock);
exit;


sub createsocket
  {
	my $remote_port = '50290';
	my $socket = IO::Socket::INET -> new(PeerAddr => $port,
        	                             PeerPort => $remote_port,
        	                             Proto    => "tcp",
        	                             Type     => SOCK_STREAM)
       or die "Couldn't connect to $port:$remote_port: $@\n";
  return $socket;
  }
