Lab-Measurement
view release on metacpan or search on metacpan
lib/Lab/Moose/Instrument/OI_IPS.pm view on Meta::CPAN
package Lab::Moose::Instrument::OI_IPS;
$Lab::Moose::Instrument::OI_IPS::VERSION = '3.931';
#ABSTRACT: Oxford Instruments IPS Intelligent Power Supply
use v5.20;
use Moose;
use Moose::Util::TypeConstraints qw/enum/;
use MooseX::Params::Validate;
use Lab::Moose::Instrument qw/
validated_getter validated_setter validated_no_param_setter setter_params /;
use Lab::Moose::Instrument::Cache;
use Lab::Moose::Countdown 'countdown';
use Carp;
use namespace::autoclean;
extends 'Lab::Moose::Instrument';
# Ideally, max_fields and max_field_rates should be preconfigured in a
# subclass, with values specific for the magnet used at the setup
has max_fields =>
( is => 'ro', isa => 'ArrayRef[Lab::Moose::PosNum]', required => 1 );
has max_field_rates =>
( is => 'ro', isa => 'ArrayRef[Lab::Moose::PosNum]', required => 1 );
has verbose => (
is => 'ro',
isa => 'Bool',
default => 1
);
sub BUILD {
my $self = shift;
warn "The IPS driver is work in progress. You have been warned\n";
# Unlike modern GPIB equipment, this device does not assert the EOI
# at end of message. The controller shell stop reading when receiving the
# eos byte.
$self->connection->set_termchar( termchar => "\r" );
$self->connection->enable_read_termchar();
$self->clear();
# Use extended resolution mode (setpoint 10 μT, rate 100 μT/min)
$self->set_communications_protocol( value => 4 );
$self->set_control( value => 3 );
$self->_check_field_rates();
}
sub _check_field_rates {
my $self = shift;
my @max_fields = @{ $self->max_fields };
my @max_field_rates = @{ $self->max_field_rates };
if ( @max_fields < 1 ) {
croak "Need at least one element in max_fields array";
}
if ( @max_fields != @max_field_rates ) {
croak "Need as many values in max_fields as in max_field_rates";
}
for my $i ( 1 .. $#max_fields ) {
if ( $max_fields[$i] <= $max_fields[ $i - 1 ] ) {
croak "values in max_fields must be in increasing order";
}
if ( $max_field_rates[$i] > $max_field_rates[ $i - 1 ] ) {
croak "values in max_field_rates must decrease";
}
}
}
sub _check_sweep_parameters {
my ( $self, %args ) = validated_hash(
\@_,
current => { isa => 'Num' },
target => { isa => 'Num' },
rate => { isa => 'Num' },
);
my $current = abs( delete $args{current} );
my $target = abs( delete $args{target} );
my $rate = abs( delete $args{rate} );
( run in 0.551 second using v1.01-cache-2.11-cpan-39bf76dae61 )