#!/usr/bin/perl -w
#
# therm-logger.pl
# version 3.0 -- 21 October 2012
#
# Query Sensatronics E4 thermometer and log results
# 
# Copyright 2012 by John R. Ackermann  N8UR (jra@febo.com)
# Licensed under the GPL version 2 or later; see the file COPYING
# included with this distribution.  I request, but do not require, that
# any modifications that correct bugs or errors, or increase the program's
# functionality, be sent via email to the author at the address above.

use strict;
use POSIX qw(setsid);
use Getopt::Std;
use Time::HiRes qw(usleep sleep gettimeofday tv_interval);
use Net::Telnet;
use n8ur;
use n8ur_gpib;

#----------
# some variables that need to be declared
my $therm = 'therm0.febo.com';
my $tag = "mjd";
my $telnet;
my $reading;
my $pre;
my $output;
my $result;
my $null;
my $temp1;
my $temp2;
my $temp3;
my $temp4;

#----------
# handle signals and errors -- mainly to clear lockfile on termination
sub sig_handler {
	undef $telnet;
	close LOG;
	exit(0);
}

# there's got to be a better way!
$SIG{'HUP'} = 'sig_handler';
$SIG{'INT'} = 'sig_handler';
$SIG{'KILL'} = 'sig_handler';
$SIG{'STOP'} = 'sig_handler';
$SIG{'TERM'} = 'sig_handler';
#----------

#----------
# display usage
my $opt_string = 'hf:';

sub usage() {
print STDERR << "EOF";

usage: $0 [-h] -f logfile
-h	: this (help) message
-f	: logfile using full pathname;
	  for output to console, use "-f -"

EOF
}

#----------
getopts( "$opt_string", \my %opt ) or usage() and exit;

# print usage
usage() and exit if $opt{h};

# output file
my $logfile = $opt{f};

#----------
# set up telnet port
$telnet = new Net::Telnet ( Timeout=>7,
			     Port=>80, 
                             Errmode=>'die');

#----------
# set up logfile ; use non-buffered since log rate is slow
if (-e $logfile) {
        open (LOG, ">>$logfile") || die "Can't open logfile $logfile!\n";
} else {
        open (LOG, ">$logfile") || die "Can't create logfile $logfile!\n";
        my $dt = DateTime->now;
        my $current_iso = $dt->ymd('-') . 'T' . $dt->hms(':');
        my $current_mjd = $dt->mjd;
        printf LOG "# Run started at %s (MJD %11.6F).\n",
                $current_iso,$current_mjd;
        print LOG "# Data from $therm.\n";
        }
select(LOG), $| = 1;

#----------
# main loop
$telnet->open($therm);
$telnet->print("GET /temp HTTP/1.0\n");
($pre,$output) = $telnet->waitfor(Match=>'/[0-9]$/');
$telnet->close;
$result = $pre . $output;
($null,$temp1,$null,$temp2,$null,$temp3,$null,$temp4) = split(/\|/,$result);

# print routine
print LOG logline($tag,-1,$temp1,-1,$temp2,-1,$temp3,-1,$temp4);

exit 0;
