use constant PoolTemp => 95;
use constant SpaTemp  => 95;

$v_compool_test = new Voice_Cmd('Test compool [status,set_time,reset_pool_temp,reset_spa_temp,inc_pool_temp,inc_spa_temp,dec_pool_temp,dec_spa_temp,toggle_pool,toggle_spa,toggle_spa_booster,toggle_pool_light,toggle_spa_light,toggle_waterfall,toggle_cleaner]');

# Once a day (and at startup) set the Compool's time to the machine time.
if ($Startup or $New_Day) {
    bdc_set_time($Serial_Ports{Compool}{object});
}

if ($Startup or $New_Minute)
{
    &run_voice_cmd("Test compool status");
}

if ($state = said $v_compool_test)
{
    my $port = $Serial_Ports{Compool}{object};
    print_log "Running Compool test $state on port object $port";

    if ($state eq 'set_time') 
    {
	bdc_set_time($port);
    }
    elsif ($state eq 'reset_pool_temp') 
    {
        bdc_set_temp($port, 'pooldesiredtemp',PoolTemp());
    }
    elsif ($state eq 'reset_spa_temp') 
    {
        bdc_set_temp($port, 'spadesiredtemp',SpaTemp());
    }
    elsif ($state eq 'inc_pool_temp') 
    {
        bdc_inc_temp($port, 'pooldesiredtemp', +1);
    }
    elsif ($state eq 'inc_spa_temp') 
    {
        bdc_inc_temp($port, 'spadesiredtemp', +1);
    }
    elsif ($state eq 'dec_pool_temp') 
    {
        bdc_inc_temp($port, 'pooldesiredtemp', -1);
    }
    elsif ($state eq 'dec_spa_temp') 
    {
        bdc_inc_temp($port, 'spadesiredtemp', -1);
    }
    elsif ($state eq 'toggle_pool') 
    {
	bdc_toggle($port, 'pool');
    }
    elsif ($state eq 'toggle_spa') 
    {
	bdc_toggle($port, 'spa');
    }
    elsif ($state eq 'toggle_spa_booster') 
    {
	bdc_toggle($port, 'aux5');
    }
    elsif ($state eq 'toggle_pool_light') 
    {
	bdc_toggle($port, 'aux2');
    }
    elsif ($state eq 'toggle_spa_light') 
    {
	bdc_toggle($port, 'aux3');
    }
    elsif ($state eq 'toggle_waterfall') 
    {
	bdc_toggle($port, 'aux4');
    }
    elsif ($state eq 'toggle_cleaner') 
    {
	bdc_toggle($port, 'aux1');
    }
    elsif ($state eq 'status') 
    {
        # Time
	my ($h, $m)  = Compool::get_time($port);
	my $hour     = ord($h);
	my $minute   = ord($m);
	my $time     = sprintf("%02d:%02d", $hour, $minute);

        # Basic temperature settings
        my $pooldesiredtemp = Compool::get_temp($port, 'pooldesiredtemp');
        my $spadesiredtemp  = Compool::get_temp($port, 'spadesiredtemp');
        my $pooltemp        = Compool::get_temp($port, 'pooltemp');
	my $spatemp         = Compool::get_temp($port, 'spatemp');
	my $airtemp         = Compool::get_temp($port, 'airtemp');

        # Primary equipment
	my $spa             = Compool::get_device($port, 'spa');
	my $pool 	    = Compool::get_device($port, 'pool');
	my $aux1 	    = Compool::get_device($port, 'aux1');
	my $aux2 	    = Compool::get_device($port, 'aux2');
	my $aux3 	    = Compool::get_device($port, 'aux3');
	my $aux4 	    = Compool::get_device($port, 'aux4');
	my $aux5 	    = Compool::get_device($port, 'aux5');
	my $aux6 	    = Compool::get_device($port, 'aux6');

        # Secondary equipment
	my $service         = Compool::get_device($port, 'service');
	my $heater          = Compool::get_device($port, 'heater');
	my $solar           = Compool::get_device($port, 'solar');
	my $remote          = Compool::get_device($port, 'remote');
	my $display         = Compool::get_device($port, 'display');
	my $allowsolar      = Compool::get_device($port, 'allowsolar');
	my $aux7            = Compool::get_device($port, 'aux7');
	my $freeze          = Compool::get_device($port, 'freeze');

	my $output = "";
        $output .= "Time is : $time\n";
        $output .= "Pool Desired Temperature is : $pooldesiredtemp degrees\n";
        $output .= "Spa Desired Temperature is  : $spadesiredtemp degrees\n";
        $output .= "Pool Temperature is : $pooltemp degrees\n";
        $output .= "Spa Temperature is  : $spatemp degrees\n";
        $output .= "Air Temperature is  : $airtemp degrees\n";
        $output .= "The Spa is          : $spa\n";
        $output .= "The Pool is         : $pool\n";
        $output .= "The Cleaner is      : $aux1\n";
        $output .= "The Pool Light is   : $aux2\n";
        $output .= "The Spa Light is    : $aux3\n";
        $output .= "The Waterfall is    : $aux4\n";
        $output .= "The Spa Booster is  : $aux5\n";
        #$output .= "The Aux6 is         : $aux6\n";
        $output .= "The Service mode is : $service\n";
        $output .= "The Heater is       : $heater\n";
        $output .= "The Solar is        : $solar\n";
        #$output .= "The Remote is       : $remote\n";
        #$output .= "The Display is      : $display\n";
        #$output .= "Solar is available  : $allowsolar\n";
        #$output .= "The aux7 is         : $aux7\n";
        $output .= "The Freeze mode is  : $freeze\n";
	
	print_log($output);
	print($output);

	my $datetime = sprintf("%04d-%02d-%02d.%02d:%02d", $Year, $Month, $Mday, $Hour, $Minute);
	my $log_file = sprintf("$config_parms{data_dir}/pool-data-%04d-%02d-%02d.csv", $Year, $Month, $Mday);
	if (! -e $log_file) {
	    my $header = 
		"datetime,".
		"pooldesiredtemp,spadesiredtemp,pooltemp,spatemp,airtemp,".
		"spa,pool,aux1,aux2,aux3,aux4,aux5,aux6,".
		"service,heater,solar,remote,display,allowsolar,aux7,freeze)\n";
	    logit($log_file, $header, 0);
	}

	my $data = join(",", $datetime, 
			$pooldesiredtemp, $spadesiredtemp, $pooltemp, $spatemp, $airtemp, 
			$spa, $pool, $aux1, $aux2, $aux3, $aux4, $aux5, $aux6, 
			$service, $heater, $solar, $remote, $display, $allowsolar, $aux7, $freeze)."\n";
	logit($log_file, $data, 0);
    }
    else 
    {
        print "unknown request $state\n";
    }

}

sub bdc_set_time ($)
{
    my ($port) = @_;

    if (Compool::set_time($port) != -1) 
    {
	print "Compool time was set to $Time_Now\n";
    }
    else 
    {
	print "Error in setting Compool time\n";
    }
}

sub bdc_toggle ($@)
{
    my ($port, @targets) = @_;
    my $goal = undef;
    foreach my $target (@targets) {
	if (!defined($goal)) {
	    $goal = (Compool::get_device($port, $target) eq 'on') ? 'off' : 'on';
	}
	if (Compool::set_device($port,$target,$goal) != -1) 
	{
	    print "Compool set_device $target $goal ok\n";
	}
	else 
	{
	    print "Error in setting Compool set_device $target $goal\n";
	}
    }
}

sub bdc_inc_temp ($$$)
{
    my ($port, $target, $delta) = @_;
    bdc_set_temp($port, $target, Compool::get_temp($port, $target) + $delta);
}

sub bdc_set_temp ($$$)
{
    my ($port, $target, $temp) = @_;

    if (Compool::set_temp($port, $target, $temp) != -1) 
    {
        print "Compool set $target temperature to $temp\n";
    }
    else 
    {
        print "Error in setting Compool $target temp to $temp\n";
    }
}
