vfd.pl

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;
}