Tested on Windows XP with Active Perl
use Net::Telnet ();
use Win32::SerialPort; # on Windows
use Term::ReadKey;
sub openPort($);
sub closePort($);
sub trim($);
# === General settings ===
$DEVICE = "COM2"; # on Windows
$host = "g7rau.demon.co.uk";
$port = 7374;
$callsign = "xx0xx"; # <----------------- Please setup your callsign !
$login_pattern = "\/\.\*login\:\.\*\$\/";
$dxc_nohere_cmd = "unset/here"; # dxspider
$spot_show_time = 4;
$vfd_type = "ibm"; # dsp800,ibm,epson,firich
# === DSP800 setup ===
$vfd_init{dsp800} = "";
$vfd_home1{dsp800} = pack("H*","0401503117");
$vfd_home2{dsp800} = pack("H*","0401504517");
$vfd_clear{dsp800} = pack("H*","040143315817");
# === IBM setup ===
# 0x15=slahed zero 0x16=O
$vfd_init{ibm} = pack("H*","0001111403157088C8A89888700003167088888888887000");
$vfd_home1{ibm} = pack("H*","1000");
$vfd_home2{ibm} = pack("H*","1014");
$vfd_clear{ibm} = pack("H*","202020202020202020202020202020202020202020202020202020202020202020202020202020201000");
# === Epson setup ===
$vfd_init{epson} = pack("H*","1F011B40");
$vfd_home1{epson} = pack("H*","1F240101");
$vfd_home2{epson} = pack("H*","1F240102");
$vfd_clear{epson} = pack("H*","0C");
# === Firich/CD5220 ===
$vfd_init{firich} = pack("H*","1B111B40");
$vfd_home1{firich} = pack("H*","1B6C0101");
$vfd_home2{firich} = pack("H*","1B6C0102");
$vfd_clear{firich} = pack("H*","0C");
my $serial = openPort($DEVICE);
#init VFD
$serial->write($vfd_init{$vfd_type});
#login DX Cluster
$serial->write($vfd_clear{$vfd_type});
$serial->write("Connecting..");
$serial->write($host.":".$port);
$t = new Net::Telnet;
$t->open(Host => $host, Port=> $port);
$t->waitfor($login_pattern);
$serial->write($vfd_clear{$vfd_type});
$serial->write("Login..");
$serial->write($vfd_home2{$vfd_type});
$serial->write($callsign);
$t->print($callsign);
sleep(5);
$serial->write($vfd_clear{$vfd_type});
$serial->write("Set NOHERE");
$t->print($dxc_nohere_cmd);
sleep(1);
ReadMode 'raw';
while("q" ne ReadKey(-1)) {
$line = $t->getline(Timeout=>900);
if (substr($line,0,2) eq "DX") {
$spotter_pfx = substr $line,6,2;
$spotter = trim(substr $line,6,7);
$qrg = trim(substr $line,14,8);
$dx = trim(substr $line,24,15);
$comment = substr $line,39,20;
#print to console
print $qrg." ".$spotter." ".$dx." ".$comment."\n";
$top_line = $qrg." ".$spotter_pfx." ".$dx;
if ($vfd_type eq "ibm") {
$top_line =~ tr/[0,O]/[\x15,\x16]/;
$comment =~ tr/[0,O]/[\x15,\x16]/;
}
#print to VFD
$serial->write($vfd_clear{$vfd_type});
$serial->write($top_line);
$serial->write($vfd_home2{$vfd_type});
$serial->write($comment);
sleep($spot_show_time);
}
}
$serial->write($vfd_clear{$vfd_type});
$serial->write("==End==");
closePort($serial);
exit;
sub openPort($)
{
my ($device) = @_;
#my $serial = Device::SerialPort->new ($device, 1); # on UNIX
my $serial = Win32::SerialPort->new ($device, 1); # on Windows
die "Can't open serial port $serial: $^E\n" unless ($serial);
$serial->user_msg(1);
$serial->databits(8);
$serial->baudrate(9600);
$serial->parity("none");
$serial->stopbits(1);
#$serial->handshake("rts");
$serial->handshake("none");
$serial->write_settings || undef $serial;
return $serial;
}
sub closePort($)
{
my ($serial) = @_;
$serial->close();
}
sub trim($) {
my $string = shift;
$string =~ s/^\s+//;
$string =~ s/\s+$//;
return $string;
}