#!/usr/bin/perl
#
# A quick perl script to talk to my Hitachi plasma screen.  Plasma 
# is connected via a ethernet to serial converter at fixed IP.
#
use Socket;
my $ip = "192.168.0.141";

# Connect
my($serverAddr) = (gethostbyname($ip))[4];
socket(SH, AF_INET(), SOCK_STREAM(), getprotobyname("tcp")) 
    or die $!;
$packFormat = 'S n a4 x8'; 
connect(SH, pack($packFormat, AF_INET(), 3001, $serverAddr))
    or die("connect: $!");
select(SH); $| = 1; select(STDOUT);  

# Send "Start" (until you send "End" the remote is locked out)
send(SH,"\005",1);
recv(SH,$buffer,1,0);
if (ord $buffer != 6) {
    die "Didn't get ack, got %#o\n",ord $buffer;
}

# Grab some variables
print "power=".&getdata(0x6E)."\n";
print "input=".&getdata(0x6F)."\n";
print "contrast=".&getdata(0x59)."\n";
print "brightness=".&getdata(0x1F)."\n";
print "colour=".&getdata(0x10)."\n";
print "sharpness=".&getdata(0x14)."\n";
print "mode=".&getdata(0x40)."\n";
print "hours=".(&getdata(0xF0)*256+&getdata(0xF1))."\n";

# Send power off....
#&senddata(0x6E,0,0);

# Send "End", to unlock the remote control
send(SH,"\04",1);
recv(SH,$buffer,1,0);
if (ord $buffer != 6) {
    die "Didn't get ack, got %#o\n",ord $buffer;
}

sub getdata {
    my ($command)=@_;
    my $result = "";

    $data = sprintf "%02X",$command;
    send(SH,"\002".$data."0100000000\003",15);
    recv(SH,$buffer,1,0);
    return "err" unless (ord $buffer == 2);
    while (ord $buffer != 3) {
        recv(SH,$buffer,1,0);
        $result .= sprintf "%c",ord $buffer;
    }
    $hex = hex $result;
    $hex = $hex-65536 if ($hex > 32767);
    return $hex;
}

sub senddata {
    my ($command,$third,$data) = @_;
    my $send = sprintf "\002%02X00%04X%04X\003",$command,$third,$data;
    send(SH,$send,15); 
    recv(SH,$buffer,1,0);
    if (ord $buffer != 6) {
        die "Didn't get ack, got %#o\n",ord $buffer;
    }
}
