#!/usr/bin/perl
use strict ;
use warnings ;
#
# Genera gruppi di Numeri e Lettere
# da trascodificare in tastiera:
# se decodificato bene, il programma va avanti
# in caso contrario, ripete lo stesso gruppo
#
# Autore: Franco, IK7XJA, Giugno 2022
# Sito: https://www.ik7xja.it/xja/linux_cw.shtml
#

my $WPM = $ARGV[0] ;
if (!$WPM) {
   $WPM = 25 ;
}

my $LUN = $ARGV[1] ;
if (!$LUN) {
   $LUN = 3 ;
}

my $Continua = 1 ;
my $Genera = 1 ;
my $Parola = '' ;

my ($Tempo_start, $Tempo_fine, $Errori, $Gruppi_totali, $Gruppi_decodificati) = () ;
print "Scrivi le lettere che ascolti;
  premi:
     #Q per USCIRE 
     #R per ripetere

  Lancia con ./indovina_parola.pl <WPM> <Caratteri gruppo>
  o modifica a runtime con (ad esempio):
     #W25 per impostare a 25 WPM
     #L9  per impostare lunghezza parola a 9 caratteri

     WPM = $WPM; Lunghezza = $LUN\n\n";
$Tempo_start = time() ;
while ($Continua) {
   if ($Genera) {
      $Parola = &genstr($LUN) ;
      my $Comando = qq{echo "$Parola" | cw -w $WPM} ;
      my $Res = qx{$Comando} ;
      $Gruppi_totali++ ;
   }
   my $InputUtente = <STDIN>;
   chomp $InputUtente;
   $InputUtente = uc($InputUtente) ;
   
   if ($InputUtente eq "#R") {
      my $Comando = qq{echo "$Parola" | cw -w $WPM} ;
      my $Res = qx{$Comando} ;
      $Genera = 0 ;
      $Errori++ ;
   } elsif ($InputUtente eq "#Q") {
      $Continua = 0 ;
   } elsif ($InputUtente =~ /^\#W(\d{2})$/) {
      $WPM = $1 ;
      print "--> Velocita ora a $WPM WPM\n" ;
      my $Comando = qq{echo "$Parola" | cw -w $WPM} ;
      my $Res = qx{$Comando} ;
      $Genera = 0 ;
   } elsif ($InputUtente =~ /^\#L(\d{1})$/) {
      $LUN = $1 ;
      print "--> Lunghezza gruppi ora a $LUN car.\n" ;
      $Genera = 1 ;
   } elsif ($InputUtente eq $Parola) {
      my $Comando = qq{echo "ok " | cw -w $WPM} ;
      my $Res = qx{$Comando} ;
      $Genera = 1 ;
      $Gruppi_decodificati++ ;
   } else {
      my $Comando = qq{echo "no $Parola" | cw -w $WPM} ;
      my $Res = qx{$Comando} ;
      $Genera = 0 ;
      $Errori++ ;
   }
}

$Tempo_fine = time() ;
my $Durata = $Tempo_fine - $Tempo_start ;
my $Minuti = 0 ;
if ($Durata > 60) {
   $Minuti = int($Durata / 60) ;
   my $Secondi = $Durata%60 ;
   $Durata = "$Minuti min e $Secondi sec.\n\n" ;
} else {
   $Durata = "0 min e $Durata sec.\n\n" ;
}

print "  - Generati $Gruppi_totali gruppi\n  - errori e ripetizioni: $Errori\n  - gruppi decodificati: $Gruppi_decodificati\n" ;
print "Durata del test: $Durata" ;

exit ;

sub genstr {
   # Genera una stringa con numeri casuali
   my $lung = shift;  # Lunghezza dell stri8nga da generare
   my @Car=('A'..'Z','0'..'9');
   my $Rstr = "" ;
   foreach (1..$lung) { $Rstr .= $Car[rand @Car]; }
   return $Rstr;
}
