#!/usr/bin/perl -w
# play.pl

use IO::Socket;
use IO::Select;
use threads;
use threads::shared;

my $IndirizzoMoxa     = '192.168.127.254';
my $IndirizzoMacchina = '4001';
my $IndirizzoLocale   = '192.168.127.10';
my $Protocollo        = 'udp';
my $TipoTrasmissione  = SOCK_DGRAM;

my $running = 1;
my $timeout = 10;

share($running);

$CMD1     = chr(0x20); # Transport Control - 0 Data
$CMD2     = chr(0x01); # in Transport Control -> PLAY

$CHECKSUM = chr(0x21); # Checksum for PLAY command

# Inizializzo la socket per la connessione con la macchina, attraverso la Moxa.
$socket=new IO::Socket::INET->new(
	LocalAddr => $IndirizzoLocale, 
	PeerAddr  => $IndirizzoMoxa, 
	PeerPort  => $IndirizzoMacchina,
	Type      => $TipoTrasmissione,
	Proto     => $Protocollo
);

sub _service_recv {
	
	my $debug  = 1;
	my $SOCKET = shift;
	my $MAXLEN = 1024;
	my $S      = IO::Select->new($SOCKET);

        print "service_recv started\n" if ($debug);
        while($running) {
		print "." if($debug);
#		foreach my $SERVER ($S->can_read(10)){
			print "\nleggo dall'UDP.\n" if ($debug);
			$SOCKET->recv(my $response, $MAXLEN) or die print "Non ho ricevuto nulla"; # Commentando il foreach sostiusco $SERVER con $SOCKET.

			print "ho letto da $SOCKET la stringa $response\n" if ($debug);
			my @RESPONSE = split '', $response;
			my $CMD1 = shift @RESPONSE;
			my $CMD2 = shift @RESPONSE;
			my $CHECKSUM = shift @RESPONSE;

			if ($CMD1 == chr(0x10)) {
				if ($CMD2 == chr(0x01) && $CHECKSUM == chr(0x11)) {
					print "ho ricevuto l'ack";
				}
				else {
					print "Errore di comunicazione";
				}
			}
			elsif ($CMD1 == chr(0x11)) {
				if ($CMD2 == chr(0x12)) {
					$DATA = $CHECKSUM;
					$CHECKSUM = shift @RESPONSE;
					print "da realizzare il controllo del checksum";
					print "ho ricevuto un errore con codice $DATA";
				}
			}
			else {
				print "ERRORE su tutto il fronte\n";
			}
#		}
	}
        print "service_recv shutting down\n" if ($debug);
}

my $thread_recv = threads->new(\&_service_recv, $socket);

# Send Command to machine.
$socket->send($CMD1);
$socket->send($CMD2);
$socket->send($CHECKSUM);

my $end = time() + $timeout;
while ( time() < $end ) {
	sleep(1);
}

print "\nTimeout end!\n";
$running = 0;
$thread_recv->join();
close($socket);
exit(1);

