Quancom.pm
changeset 0 a900786f2174
child 2 a19ea3b8c48d
equal deleted inserted replaced
-1:000000000000 0:a900786f2174
       
     1 package Quancom;
       
     2 
       
     3 use strict;
       
     4 use warnings;
       
     5 use IO::Socket::INET;
       
     6 
       
     7 my $DEFAULT_PORT = 1001;
       
     8 
       
     9 sub new {
       
    10     my $class = ref $_[0] ? ref shift : shift;
       
    11     my $self = bless {} => $class;
       
    12 
       
    13     $self->{peer} = shift;
       
    14     $self->{peer} .= ":$DEFAULT_PORT"
       
    15       unless $self->{peer} =~ /:\d+$/;
       
    16 
       
    17     $self->{socket} = new IO::Socket::INET(
       
    18         Proto    => "tcp",
       
    19         PeerAddr => $self->{peer}
       
    20     );
       
    21 
       
    22     $self->{job} = 0;
       
    23 
       
    24     return $self;
       
    25 }
       
    26 
       
    27 sub cmd {
       
    28     my $self = shift;
       
    29     my $cmd  = shift;
       
    30 
       
    31     $self->_tx($cmd);
       
    32     $self->_rx($cmd);
       
    33 }
       
    34 
       
    35 sub _tx {
       
    36     my $self = shift;
       
    37     my $cmd  = shift;
       
    38 
       
    39     $self->{job} = ++$self->{job} % 255;    # cap the job id on 255;
       
    40     $cmd = "\x02" . sprintf("%02x", $self->{job}) . $cmd;   # add STX and job id
       
    41     $cmd .= sprintf("%02x", unpack("%8C*", $cmd));          # add checksum
       
    42 
       
    43     warn "sending $cmd | " . unpack("H*", $cmd) . "\n";
       
    44     $self->{socket}->print($cmd . "\r");
       
    45 }
       
    46 
       
    47 sub _rx {
       
    48     my $self = shift;
       
    49     local $/ = "\r";
       
    50     my $r = $self->{socket}->getline;
       
    51     chomp($r);
       
    52     return $r;
       
    53 }