require ESL;
use IO::Socket::INET;

#ESL::eslSetLogLevel(7);

my $ip = "127.0.0.1";
my $sock = new IO::Socket::INET ( LocalHost => $ip,  LocalPort => '8040',  Proto => 'tcp',  Listen => 1,  Reuse => 1 );
die "Could not create socket: $!\n" unless $sock;

for(;;) {
  my $new_sock = $sock->accept();
  my $pid = fork();
  if ($pid) {
    close($new_sock);
    next;
  }

  my $host = $new_sock->sockhost();
  my $fd = fileno($new_sock);
  
  my $con = new ESL::ESLconnection($fd);
  my $info = $con->getInfo();

  #print $info->serialize();
  my $uuid = $info->getHeader("unique-id");

  printf "Connected call %s, from %s\n", $uuid, $info->getHeader("caller-caller-id-number");

  $con->sendRecv("myevents");
  $con->execute("answer");
  $con->sendRecv("divert_events on");
  $con->execute("detect_speech", "pocketsphinx yes_no yes_no");
  $con->execute("playback", "/ram/swimp.raw");
  
  while($con->connected()) {
    #my $e = $con->recvEventTimed(100);
    my $e = $con->recvEvent();
    
    if ($e) {
      my $name = $e->getHeader("event-name");
      print "EVENT [$name]\n";
      if ($name eq "DETECTED_SPEECH") {
	print $e->serialize();
	my $type = $e->getHeader("speech-type");
	if ($type = "detected-speech") {
	  $con->execute("detect_speech", "resume");
	}
      }
      if ($name eq "DTMF") {
	my $digit = $e->getHeader("dtmf-digit");
	my $duration = $e->getHeader("dtmf-duration");
	print "DTMF digit $digit ($duration)\n";
      }
    }
  }

  print "BYE\n";
  close($new_sock);
}