The following script operates the right jaw, file name /online_dir/vm1.pl.
#!/usr/bin/perl -w
use Spectra;
my ($method, $value_new) = @ARGV;
my $status = 1;
#
# (x, y, z, w) <-> (r, l, t, b)
#
my $axis = 'r';
if( "$method" eq "set_position")
{
Spectra::set_dmc( $axis, $value_new);
}
elsif( "$method" eq "get_position")
{
$SYM{RETURN_VALUE} = Spectra::get_dmc( $axis);
}
elsif( "$method" eq "get_limit_min")
{
$SYM{RETURN_VALUE} = -220;
}
elsif( "$method" eq "get_limit_max")
{
$SYM{RETURN_VALUE} = 220;
}
$status;
vm1.pl uses functions that are defined in /online_dir/TkIrc.pl:
package Spectra;
#
# open socket for dmc controller
#
my $flag_dmc_open = 0;
my $conv = 10000;
$Spectra::test_var = 1;
sub open_dmc
{
my ($iaddr, $paddr, $proto, $line);
my $remote = '192.168.57.3';
my $port = 10000;
$port = getservbyname( $port, 'tcp') if( $port =~ /\D/);
die " no port " unless $port;
$iaddr = Socket::inet_aton( $remote) or die "no host $remote";
$paddr = Socket::sockaddr_in( $port, $iaddr);
$proto = getprotobyname( 'tcp');
socket( SOCKET_DMC, Socket::PF_INET, Socket::SOCK_STREAM, $proto) or
die "socket: $!";
connect( SOCKET_DMC, $paddr) or die "connect: $!";
my $flags = fcntl (SOCKET_DMC, Fcntl::F_GETFL(), 0);
$flags &= ~Fcntl::O_NONBLOCK();
fcntl ( SOCKET_DMC, Fcntl::F_SETFL(), $flags);
$flag_dmc_open = 1;
}
#
#
#
sub recv_dmc
{
my $status = undef;
if( !$flag_dmc_open)
{
open_dmc();
if( !$flag_dmc_open)
{
# Util::log( "Failed to open socket for Dmc controller");
Spectra::error( "Failed to open socket for Dmc controller");
goto finish;
}
}
my $rin = my $win = my $ein = "";
vec( $rin, fileno( SOCKET_DMC), 1) = 1;
$ein = $rin | $win;
#
# do we have input, time-out: 0.1s
#
my $nfd = select( $rin, $win, $ein, 0.1);
my $buffer = "";
if( $nfd)
{
sysread( SOCKET_DMC, $buffer, 100, 0);
$status = $buffer;
}
finish:
# Util::display_text( "DMC" , "received $buffer");
return $status;
}
#
#
#
sub send_dmc
{
my ($buffer) = @_;
# Util::display_text( "DMC", "sending $buffer");
syswrite( SOCKET_DMC, $buffer, length($buffer), 0);
}
#
#
#
sub get_dmc
{
my ($axis) = @_;
my $status = undef;
if( !$flag_dmc_open)
{
open_dmc();
if( !$flag_dmc_open)
{
# Util::log( "Failed to open socket for Dmc controller");
Spectra::error( "Failed to open socket for Dmc controller");
goto finish;
}
}
#
# x, y, z, w
#
if( $axis =~ /^x$/i)
{
send_dmc( "TP X\015");
$status = recv_dmc();
$status =~ s/^\s*(\S*)\s+:$/$1/;
$status = $status/$conv;
}
elsif( $axis =~ /^y$/i)
{
send_dmc( "TP Y\015");
$status = recv_dmc();
$status =~ s/^\s*(\S*)\s+:$/$1/;
$status = $status/$conv;
}
elsif( $axis =~ /^z$/i)
{
send_dmc( "TP Z\015");
$status = recv_dmc();
$status =~ s/^\s*(\S*)\s+:$/$1/;
$status = $status/$conv;
}
elsif( $axis =~ /^w$/i)
{
send_dmc( "TP W\015");
$status = recv_dmc();
$status =~ s/^\s*(\S*)\s+:$/$1/;
$status = $status/$conv;
}
#
# r, l, t, b
#
elsif( $axis =~ /^t$/i)
{
send_dmc( "TP X\015");
$status = recv_dmc();
$status =~ s/^\s*(\S*)\s+:$/$1/;
$status = $status/$conv;
}
elsif( $axis =~ /^b$/i)
{
send_dmc( "TP Y\015");
$status = recv_dmc();
$status =~ s/^\s*(\S*)\s+:$/$1/;
$status = $status;
$status = $status/$conv;
}
elsif( $axis =~ /^l$/i)
{
send_dmc( "TP Z\015");
$status = recv_dmc();
$status =~ s/^\s*(\S*)\s+:$/$1/;
$status = $status;
$status = $status/$conv;
}
elsif( $axis =~ /^r$/i)
{
send_dmc( "TP W\015");
$status = recv_dmc();
$status =~ s/^\s*(\S*)\s+:$/$1/;
$status = $status/$conv;
}
#
# cx, cy, dx, dy
#
elsif( $axis =~ /^cx$/i)
{
my $r = get_dmc( "r");
my $l = get_dmc( "l");
$status = ($r + $l )/2.;
}
elsif( $axis =~ /^cy$/i)
{
my $t = get_dmc( "t");
my $b = get_dmc( "b");
$status = ($t + $b )/2.;
}
elsif( $axis =~ /^dx$/i)
{
my $r = get_dmc( "r");
my $l = get_dmc( "l");
$status = ($l - $r);
}
elsif( $axis =~ /^dy$/i)
{
my $t = get_dmc( "t");
my $b = get_dmc( "b");
$status = ($t - $b);
}
finish:
return $status;
}
sub set_dmc
{
my ($axis, $value_new) = @_;
my $status = 1;
my $buffer = "";
my $value_raw = $value_new*$conv;
if( !$flag_dmc_open)
{
open_dmc();
if( !$flag_dmc_open)
{
$status = 1;
# Util::log( "Failed to open socket for Dmc controller");
Spectra::error( "Failed to open socket for Dmc controller");
goto finish;
}
}
$Spectra::SYM{ interrupt_scan} = 0;
#
# x, y, z, w
#
if( $axis =~ /^x$/i)
{
$buffer = "PA ${value_raw},_PAY,_PAZ,_PAW;BG\015";
}
elsif( $axis =~ /^y$/i)
{
$buffer = "PA _PAX,${value_raw},_PAZ,_PAW;BG\015";
}
elsif( $axis =~ /^z$/i)
{
$buffer = "PA _PAX,_PAY,${value_raw},_PAW;BG\015";
}
elsif( $axis =~ /^w$/i)
{
$buffer = "PA _PAX,_PAY,_PAZ,${value_raw};BG\015";
}
#
# r, l, t, b
#
elsif( $axis =~ /^t$/i)
{
$buffer = "PA ${value_raw},_PAY,_PAZ,_PAW;BG\015";
}
elsif( $axis =~ /^b$/i)
{
$buffer = "PA _PAX,${value_raw},_PAZ,_PAW;BG\015";
}
elsif( $axis =~ /^l$/i)
{
$buffer = "PA _PAX,_PAY,${value_raw},_PAW;BG\015";
}
elsif( $axis =~ /^r$/i)
{
$buffer = "PA _PAX,_PAY,_PAZ,${value_raw};BG\015";
}
#
# cx, cy, dx, dy
#
elsif( $axis =~ /^cx$/i)
{
my $cx_old = get_dmc( "cx");
my $diff = $value_new - $cx_old;
set_dmc( "r", get_dmc( "r") + $diff);
set_dmc( "l", get_dmc( "l") + $diff);
goto finish;
}
elsif( $axis =~ /^cy$/i)
{
my $cy_old = get_dmc( "cy");
my $diff = $value_new - $cy_old;
set_dmc( "t", get_dmc( "t") + $diff);
set_dmc( "b", get_dmc( "b") + $diff);
goto finish;
}
elsif( $axis =~ /^dx$/i)
{
my $dx_old = get_dmc( "dx");
my $diff = $value_new - $dx_old;
set_dmc( "r", get_dmc( "r") - $diff/2.);
set_dmc( "l", get_dmc( "l") + $diff/2.);
goto finish;
}
elsif( $axis =~ /^dy$/i)
{
my $dy_old = get_dmc( "dy");
my $diff = $value_new - $dy_old;
set_dmc( "t", get_dmc( "t") + $diff/2.);
set_dmc( "b", get_dmc( "b") - $diff/2.);
goto finish;
}
send_dmc( $buffer);
while( length( $buffer))
{
$buffer = recv_dmc();
}
my $time = 0;
$buffer = get_dmc( $axis);
while( abs( $buffer - $value_new) > 0.01)
{
if( defined( $Spc::h{ w_top}))
{
Util::refresh_motor_positions();
}
Spectra::wait( 0.5);
$time += 0.5;
last if( $time > 40);
#
# did the user press 'stop'?
#
if( $Spectra::SYM{ interrupt_scan})
{
Util::log( "TkIrc.pl::set_dmc: interrupted, stopping moves");
send_dmc( "ST\015");
while( length( $buffer))
{
$buffer = recv_dmc();
}
last;
}
$buffer = get_dmc( $axis);
}
finish:
return $status;
}