# Script de Caller-ID - Marcelo Fernandez. fernandezm22@yahoo.com.ar
# Dependencias: Device::Modem y Device::Serial.

#!/usr/bin/perl
use Device::Modem;
#use Device::SerialPort;
# También es necesario que esté instalado Device::SerialPort (o Win32::SerialPort para Win32 machines), lo necesita Device::Modem

my $fl=''; # Caracter de fin de linea
# Inicializo el Modem
if ($^O =~ /Win/i) { # Si el SO es windows, es Com1, sino ttyS0
  $puerto = 'COM1';
  $fl="\r\n";
} else {
  $puerto = '/dev/ttyS0';
  $fl="\n";
}
my $baudios = 19200;
my $modem = new Device::Modem ( port => $puerto);

(die "No me pude conectar al puerto $puerto !" . $fl) unless ($modem->connect( baudrate => $baudios, init_string => 'S7=45 S0=0 L1 V1 X4 &c1 E1 Q0'));

print "Conectado al puerto $puerto" . $fl;

# Comando de inicialización de Caller ID
$modem->atsend('AT#CID=1' . Device::Modem::CR);

# Polling del estado del modem
my $llamadas_recibidas = 0;
my $number = '';

print "Esperando por Llamada...\n";
while( ! $llamadas_recibidas ) {
	# Escucho por datos provenientes del modem
	my $cid_info = $modem->answer(undef, 3);  # 3 segundos de timeout
	# Si se recibio algo que concuerde con el NMBR, lo parseamos
	if( $cid_info =~ /NMBR = (\d+)/ ) {
		# Recibido! El número está en $1 (por la regex)
		$number = $1;
		$llamadas_recibidas++;
		print "Está llamando $number" . $fl;
	} elsif( $cid_info ) {
		# Algo distinto se recibio, lo imprimo
		print "Info:$cid_info" . $fl;
	} else {
		# No se recibieron datos, aunque está llamando... !?
	}
	# Repetir hasta que tenga ganas. (Ctrl+C) :-D
}

$modem->disconnect();
