#!/usr/bin/perl
use Modern::Perl;  # template

# 192.168.1.24 ESP_4138D5_BAT
#use Time::HiRes qw (usleep alarm sleep); # removed time to use integer systime since epoch
use Time::HiRes::Sleep::Until; # may need to be added at target machine
#use DateTime;
#use DBI;
use Socket;
use IO::Select;
#use POSIX 'setsid'; # for daemonizing

my $portno = 42042; # my standard command/response LoT port
my $ESPbata = "192.168.1.24"; # using fixed IP for now
my $msg;  # data back from slave ESP
my $maxtoread = 1024;
my $msgsock; # for talking to slave etc
my $su; # sleep until
my $ESPbatdest; # slave address in desired format
my $IOSel; # thing that knows how to wait a little while for msg

# my $debug = 1;  # often useful

#////
sub initialize
{
  $su = Time::HiRes::Sleep::Until->new; # create a "wait until" object
  socket($msgsock,PF_INET,SOCK_DGRAM,getprotobyname("udp")) or die ("socket:$!");
  $IOSel = IO::Select->new($msgsock) or die ("IOSel:$!");   # quickie way to see if ready
  $ESPbatdest= sockaddr_in($portno, inet_aton($ESPbata)); # massage addr info
  open (LOG,">", "newbat.txt") or die "file:$!";
  print (LOG "some junk to test this\n");
  my $ofh = select LOG;
  $| = 1;
  select $ofh;
}

#/////main
initialize();
#while (1) # till ctrl-c for simple testing
#{ # read bat data and output 1/minute
	do
	{
	 send($msgsock,'r',0,$ESPbatdest) or die("send:$!"); # send request
	 if ($IOSel->can_read(2)) # with timeout
	 {
	  recv($msgsock,$msg,$maxtoread,0); # get whatever it sent
	 } else
	 {
	  # say "oh shit, timed out" if $debug;
	  $msg = "timed out!";
	 }
	
#	chomp $msg; # bite off any extra newline
	print LOG "$msg"; # display the returned data
	print $msg;
	} while ($su->second(0)); # do loop at top of every minute
#}
close LOG;
