File Coverage

blib/lib/Lab/Moose/Instrument/Lakeshore350.pm
Criterion Covered Total %
statement 20 166 12.0
branch n/a
condition 0 33 0.0
subroutine 7 46 15.2
pod 37 39 94.8
total 64 284 22.5


line stmt bran cond sub pod time code
1             package Lab::Moose::Instrument::Lakeshore350;
2             $Lab::Moose::Instrument::Lakeshore350::VERSION = '3.880';
3             #ABSTRACT: Lakeshore Model 350 Temperature Controller
4              
5 1     1   2553 use v5.20;
  1         4  
6              
7 1     1   9 use Moose;
  1         2  
  1         8  
8 1     1   7466 use Moose::Util::TypeConstraints qw/enum/;
  1         3  
  1         9  
9 1     1   532 use MooseX::Params::Validate;
  1         3  
  1         10  
10 1         66 use Lab::Moose::Instrument qw/
11 1     1   602 validated_getter validated_setter setter_params /;
  1         3  
12 1     1   6 use Carp;
  1         2  
  1         59  
13 1     1   6 use namespace::autoclean;
  1         2  
  1         8  
14              
15             extends 'Lab::Moose::Instrument';
16              
17             with qw(
18             Lab::Moose::Instrument::Common
19             );
20              
21             has input_channel => (
22             is => 'ro',
23             isa => enum( [qw/A B C D/] ),
24             default => 'A',
25             );
26              
27             has default_loop => (
28             is => 'ro',
29             isa => enum( [ 1, 2, 3, 4 ] ),
30             default => 1,
31             );
32              
33             sub BUILD {
34 0     0 0   my $self = shift;
35 0           $self->clear();
36 0           $self->cls();
37             }
38              
39             my %channel_arg
40             = ( channel => { isa => enum( [qw/ A B C D/] ), optional => 1 } );
41             my %loop_arg = ( loop => { isa => enum( [ 1, 2, 3, 4 ] ), optional => 1 } );
42             my %output_arg = ( output => { isa => enum( [ 1, 2, 3, 4 ] ) } );
43              
44              
45             sub get_T {
46 0     0 1   my ( $self, %args ) = validated_getter(
47             \@_,
48             %channel_arg
49             );
50 0   0       my $channel = delete $args{channel} // $self->input_channel();
51 0           return $self->query( command => "KRDG? $channel", %args );
52             }
53              
54             sub get_value {
55 0     0 1   my $self = shift;
56 0           return $self->get_T(@_);
57             }
58              
59              
60             sub get_sensor_units_reading {
61 0     0 1   my ( $self, %args ) = validated_getter(
62             \@_,
63             %channel_arg
64             );
65 0   0       my $channel = delete $args{channel} // $self->input_channel();
66 0           return $self->query( command => "SRDG? $channel", %args );
67             }
68              
69              
70             sub get_setpoint {
71 0     0 1   my ( $self, %args ) = validated_getter(
72             \@_,
73             %loop_arg
74             );
75 0   0       my $loop = delete $args{loop} // $self->default_loop;
76 0           return $self->query( command => "SETP? $loop", %args );
77             }
78              
79             sub set_setpoint {
80 0     0 1   my ( $self, $value, %args ) = validated_setter(
81             \@_,
82             %loop_arg
83             );
84 0   0       my $loop = delete $args{loop} // $self->default_loop;
85              
86             # Device bug. The 340 cannot parse values with too many digits.
87 0           $value = sprintf( "%.6G", $value );
88 0           $self->write( command => "SETP $loop,$value", %args );
89             }
90              
91              
92             sub set_T {
93 0     0 1   my $self = shift;
94 0           $self->set_setpoint(@_);
95             }
96              
97              
98             sub set_heater_range {
99 0     0 1   my ( $self, $value, %args ) = validated_setter(
100             \@_,
101             %output_arg,
102             value => { isa => enum( [ 0 .. 5 ] ) }
103             );
104 0           my $output = delete $args{output};
105 0           $self->write( command => "RANGE $output, $value", %args );
106             }
107              
108             sub get_heater_range {
109 0     0 1   my ( $self, %args ) = validated_getter(
110             \@_,
111             %output_arg,
112             );
113 0           my $output = delete $args{output};
114 0           return $self->query( command => "RANGE? $output", %args );
115             }
116              
117              
118             sub set_heater_setup {
119 0     0 1   my ( $self, %args ) = validated_getter(
120             \@_,
121             output => { isa => enum( [ 1, 2 ] ) },
122             resistance => { isa => 'Lab::Moose::PosNum' },
123             max_current => { isa => enum( [ 0, 1, 2, 3, 4 ] ) },
124             max_user_current => { isa => 'Lab::Moose::PosNum' },
125             display => { isa => enum( [ 0, 1 ] ) },
126             );
127             my ( $output, $resistance, $max_current, $max_user_current, $display )
128             = delete @args{
129 0           qw/output resistance max_current max_user_current display/};
130 0           $self->write(
131             command =>
132             "HTRSET $output, $resistance, $max_current, $max_user_current, $display",
133             %args
134             );
135             }
136              
137             sub get_heater_setup {
138 0     0 1   my ( $self, %args ) = validated_getter(
139             \@_,
140             output => { isa => enum( [ 1, 2 ] ) },
141             );
142 0           my $output = delete $args{output};
143 0           my $rv = $self->query( command => "HTRSET? $output", %args );
144 0           my %htr;
145 0           @htr{qw/resistance max_current max_user_current display/} = split ',',
146             $rv;
147 0           return %htr;
148             }
149              
150              
151             sub get_sample_heater_output {
152 0     0 0   my ( $self, %args ) = validated_getter(
153             \@_,
154             output => { isa => enum( [ 1, 2 ] ) },
155             );
156 0           my $output = delete $args{output};
157 0           return $self->query( command => "HTR? $output", %args );
158             }
159              
160              
161             sub set_outmode {
162 0     0 1   my ( $self, %args ) = validated_getter(
163             \@_,
164             %output_arg,
165             mode => { isa => enum( [ 0 .. 5 ] ) },
166             %channel_arg,
167             powerup_enable => { isa => enum( [ 0, 1 ] ), default => 0 },
168             );
169 0   0       my $channel = delete $args{channel} // $self->input_channel();
170             my ( $output, $mode, $powerup_enable )
171 0           = delete @args{qw/output mode powerup_enable/};
172 0           $self->write(
173             command => "OUTMODE $output, $mode, $channel, $powerup_enable",
174             %args
175             );
176             }
177              
178             sub get_outmode {
179 0     0 1   my ( $self, %args ) = validated_getter(
180             \@_,
181             %output_arg,
182             );
183 0           my $output = delete $args{output};
184 0           my $rv = $self->query( command => "OUTMODE? $output", %args );
185 0           my @rv = split /,/, $rv;
186 0           return ( mode => $rv[0], channel => $rv[1], powerup_enable => $rv[2] );
187             }
188              
189              
190             sub set_input_curve {
191 0     0 1   my ( $self, $value, %args ) = validated_setter(
192             \@_,
193             %channel_arg,
194             value => { isa => enum( [ 0 .. 59 ] ) },
195             );
196 0   0       my $channel = delete $args{channel} // $self->input_channel();
197 0           $self->write( command => "INCRV $channel,$value", %args );
198             }
199              
200             sub get_input_curve {
201 0     0 1   my ( $self, %args ) = validated_getter(
202             \@_,
203             %channel_arg,
204             );
205 0   0       my $channel = delete $args{channel} // $self->input_channel();
206 0           return $self->query( command => "INCRV? $channel", %args );
207             }
208              
209              
210             sub set_remote_mode {
211 0     0 1   my ( $self, $value, %args )
212             = validated_setter( \@_, value => { isa => enum( [ 0 .. 2 ] ) } );
213 0           $self->write( command => "MODE $value", %args );
214             }
215              
216             sub get_remote_mode {
217 0     0 1   my ( $self, %args ) = validated_getter( \@_ );
218 0           return $self->query( command => "MODE?", %args );
219             }
220              
221              
222             sub set_pid {
223 0     0 1   my ( $self, %args ) = validated_getter(
224             \@_,
225             %output_arg,
226             P => { isa => 'Lab::Moose::PosNum' },
227             I => { isa => 'Lab::Moose::PosNum' },
228             D => { isa => 'Lab::Moose::PosNum' }
229             );
230 0           my ( $output, $P, $I, $D ) = delete @args{qw/output P I D/};
231 0           $self->write(
232             command => sprintf( "PID $output, %.1f, %d, %d", $P, $I, $D ),
233             %args
234             );
235             }
236              
237             sub get_pid {
238 0     0 1   my ( $self, %args ) = validated_getter(
239             \@_,
240             %output_arg
241             );
242 0           my $output = delete $args{output};
243 0           my $pid = $self->query( command => "PID? $output", %args );
244 0           my %pid;
245 0           @pid{qw/P I D/} = split /,/, $pid;
246 0           return %pid;
247             }
248              
249              
250             sub set_zone {
251 0     0 1   my ( $self, %args ) = validated_getter(
252             \@_,
253             %output_arg,
254             zone => { isa => enum( [ 1 .. 10 ] ) },
255             top => { isa => 'Lab::Moose::PosNum' },
256             P => { isa => 'Lab::Moose::PosNum' },
257             I => { isa => 'Lab::Moose::PosNum' },
258             D => { isa => 'Lab::Moose::PosNum' },
259             mout => { isa => 'Lab::Moose::PosNum', default => 0 },
260             range => { isa => enum( [ 0 .. 3 ] ) },
261             input => { isa => enum( [ 0 .. 8 ] ) },
262             rate => { isa => 'Lab::Moose::PosNum' },
263             );
264             my ( $output, $zone, $top, $P, $I, $D, $mout, $range, $input, $rate )
265 0           = delete @args{qw/output zone top P I D mout range input rate/};
266              
267 0           $self->write(
268             command => sprintf(
269             "ZONE $output, $zone, %.6G, %.1f, %.1f, %d, $mout, $range, $input, $rate",
270             $top, $P, $I, $D
271             ),
272             %args
273             );
274             }
275              
276             sub get_zone {
277 0     0 1   my ( $self, %args ) = validated_getter(
278             \@_,
279             %output_arg,
280             zone => { isa => enum( [ 1 .. 10 ] ) }
281             );
282 0           my $output = delete $args{output};
283 0           my $zone = delete $args{zone};
284 0           my $result = $self->query( command => "ZONE? $output, $zone", %args );
285 0           my %zone;
286 0           @zone{qw/top P I D mout range input rate/} = split /,/, $result;
287 0           return %zone;
288             }
289              
290             # =head2 set_filter/get_filter
291              
292             # $lakeshore->set_filter(
293             # channel => 5,
294             # on => 1,
295             # settle_time => 1, # (1s..200s)
296             # window => 2, # % 2 percent of full scale window (1% ... 80%)
297             # );
298              
299             # my %filter = $lakeshore->get_filter(channel => 5);
300              
301             # =cut
302              
303             # sub set_filter {
304             # my ( $self, %args ) = validated_getter(
305             # \@_,
306             # %channel_arg,
307             # on => { isa => enum( [ 0, 1 ] ) },
308             # settle_time => { isa => enum( [ 1 .. 200 ] ) },
309             # window => { isa => enum( [ 1 .. 80 ] ) }
310             # );
311             # my ( $channel, $on, $settle_time, $window )
312             # = delete @args{qw/channel on settle_time window/};
313             # $channel = $channel // $self->input_channel();
314              
315             # $self->write(
316             # command => "FILTER $channel,$on,$settle_time,$window",
317             # %args
318             # );
319             # }
320              
321             # sub get_filter {
322             # my ( $self, %args ) = validated_getter(
323             # \@_,
324             # %channel_arg,
325             # );
326             # my $channel = delete $args{channel} // $self->input_channel();
327             # my $result = $self->query( command => "FILTER? $channel", %args );
328              
329             # my %filter;
330             # @filter{qw/on settle_time window/} = split /,/, $result;
331             # return %filter;
332             # }
333              
334              
335             sub set_mout {
336 0     0 1   my ( $self, $value, %args ) = validated_setter(
337             \@_,
338             %output_arg,
339             value => { isa => 'Num' }
340             );
341 0           my $output = delete $args{output};
342 0           $self->write( command => "MOUT $output, $value", %args );
343             }
344              
345             sub get_mout {
346 0     0 1   my ( $self, %args ) = validated_getter(
347             \@_,
348             %output_arg,
349             );
350 0           my $output = delete $args{output};
351 0           return $self->query( command => "MOUT? $output" );
352             }
353              
354              
355             sub set_intype {
356 0     0 1   my ( $self, %args ) = validated_getter(
357             \@_,
358             %channel_arg,
359             sensor_type => { isa => enum( [ 0 .. 5 ] ) },
360             autorange => { isa => enum( [ 0, 1 ] ) },
361             range => { isa => enum( [ 1 .. 9 ] ) },
362             compensation => { isa => enum( [ 0, 1 ] ) },
363             units => { isa => enum( [ 1, 2, 3 ] ), default => 1 },
364             sensor_excitation => { isa => enum( [ 0, 1 ] ) }
365             );
366              
367 0   0       my $channel = delete $args{channel} // $self->input_channel();
368             my (
369             $sensor_type, $autorange, $range, $compensation, $units,
370             $sensor_excitation
371             )
372             = delete @args{
373 0           qw/sensor_type autorange range compensation units sensor_excitation/};
374 0           $self->write(
375             command =>
376             "INTYPE $channel, $sensor_type, $autorange, $range, $compensation, $units, $sensor_excitation",
377             %args
378             );
379             }
380              
381             sub get_intype {
382 0     0 1   my ( $self, %args ) = validated_getter(
383             \@_,
384             %channel_arg,
385             );
386 0   0       my $channel = delete $args{channel} // $self->input_channel();
387 0           my $rv = $self->query( command => "INTYPE? $channel", %args );
388 0           my %intype;
389             @intype{
390 0           qw/sensor_type autorange range compensation units sensor_excitation/}
391             = split /,/,
392             $rv;
393 0           return %intype;
394             }
395              
396              
397             sub curve_delete {
398 0     0 1   my ( $self, %args ) = validated_getter(
399             \@_,
400             curve => { isa => enum( [ 21 .. 59 ] ) },
401             );
402 0           my $curve = delete $args{curve};
403 0           $self->write( command => "CRVDEL $curve", %args );
404             }
405              
406              
407             sub set_curve_header {
408 0     0 1   my ( $self, %args ) = validated_getter(
409             \@_,
410             curve => { isa => enum( [ 21 .. 59 ] ) },
411             name => { isa => 'Str' },
412             SN => { isa => 'Str' },
413             format => { isa => enum( [ 1, 2, 3, 4 ] ) },
414             limit => { isa => 'Lab::Moose::PosNum' },
415             coefficient => { isa => enum( [ 1, 2 ] ) }
416             );
417             my ( $curve, $name, $SN, $format, $limit, $coefficient )
418 0           = delete @args{qw/curve name SN format limit coefficient/};
419 0           $self->write(
420             command => "CRVHDR $curve, $name, $SN, $format, $limit, $coefficient",
421             %args
422             );
423             }
424              
425             sub get_curve_header {
426 0     0 1   my ( $self, %args ) = validated_getter(
427             \@_,
428             curve => { isa => enum( [ 1 .. 59 ] ) },
429             );
430 0           my $curve = delete $args{curve};
431 0           my $rv = $self->query( command => "CRVHDR? $curve", %args );
432 0           my %header;
433 0           @header{qw/name SN format limit coefficient/} = split /,/,
434             $rv;
435 0           return %header;
436             }
437              
438              
439             sub set_curve_point {
440 0     0 1   my ( $self, %args ) = validated_getter(
441             \@_,
442             curve => { isa => enum( [ 21 .. 59 ] ) },
443             index => { isa => enum( [ 1 .. 200 ] ) },
444             units => { isa => 'Num' },
445             temp => { isa => 'Num' },
446             );
447             my ( $curve, $index, $units, $temp )
448 0           = delete @args{qw/curve index units temp/};
449 0           $self->write( command => "CRVPT $curve, $index, $units, $temp", %args );
450             }
451              
452             sub get_curve_point {
453 0     0 1   my ( $self, %args ) = validated_getter(
454             \@_,
455             curve => { isa => enum( [ 1 .. 59 ] ) },
456             index => { isa => enum( [ 1 .. 200 ] ) },
457             );
458 0           my $curve = delete $args{curve};
459 0           my $index = delete $args{index};
460 0           my $rv = $self->query( command => "CRVPT? $curve, $index", %args );
461 0           my %point;
462 0           @point{qw/units temp/} = split /,/,
463             $rv;
464 0           return %point;
465             }
466              
467              
468             sub set_input_name {
469 0     0 1   my ( $self, $value, %args ) = validated_setter(
470             \@_,
471             %channel_arg,
472             );
473 0   0       my $channel = delete $args{channel} // $self->input_channel();
474 0           $self->write( command => "INNAME $channel, $value", %args );
475             }
476              
477             sub get_input_name {
478 0     0 1   my ( $self, %args ) = validated_getter(
479             \@_,
480             %channel_arg,
481             );
482 0   0       my $channel = delete $args{channel} // $self->input_channel();
483 0           return $self->query( command => "INNAME? $channel", %args );
484             }
485              
486              
487             sub set_ramp {
488 0     0 1   my ( $self, %args ) = validated_getter(
489             \@_,
490             %output_arg,
491             rate => { isa => 'Lab::Moose::PosNum' },
492             on => { isa => enum( [ 0, 1 ] ) },
493             );
494 0           my $output = delete $args{output};
495 0           my $rate = delete $args{rate};
496 0           my $on = delete $args{on};
497 0           $self->write( command => "RAMP $output, $on, $rate", %args );
498             }
499              
500             sub get_ramp {
501 0     0 1   my ( $self, %args ) = validated_getter(
502             \@_,
503             %output_arg,
504             );
505 0           my $output = delete $args{output};
506 0           my $rv = $self->query( command => "RAMP? $output", %args );
507 0           my %ramp;
508 0           @ramp{qw/on rate/} = split ',', $rv;
509 0           return %ramp;
510             }
511              
512              
513             sub set_display_field {
514 0     0 1   my ( $self, %args ) = validated_getter(
515             \@_,
516             field => { isa => enum( [ 1 .. 8 ] ) },
517             input => { isa => enum( [ 0 .. 8 ] ) },
518             units => { isa => enum( [ 1 .. 5 ] ) },
519             );
520 0           my ( $field, $input, $units ) = delete @args{qw/field input units/};
521 0           $self->write( command => "DISPFLD $field, $input, $units", %args );
522             }
523              
524             sub get_display_field {
525 0     0 1   my ( $self, %args ) = validated_getter(
526             \@_,
527             field => { isa => enum( [ 1 .. 8 ] ) }
528             );
529 0           my $field = delete $args{field};
530 0           my $rv = $self->query( command => "DISPFLD? $field", %args );
531 0           my ( $input, $units ) = split ',', $rv;
532 0           return ( input => $input, units => $units );
533             }
534              
535              
536             sub set_display {
537 0     0 1   my ( $self, %args ) = validated_getter(
538             \@_,
539             mode => { isa => enum( [ 0 .. 10 ] ) },
540             num_fields => { isa => enum( [ 0, 1, 2 ] ) },
541             displayed_info => { isa => enum( [ 1 .. 4 ] ) }
542             );
543             my ( $mode, $num_fields, $displayed_info )
544 0           = delete @args{qw/mode num_fields displayed_info/};
545 0           $self->write(
546             command => "DISPLAY $mode, $num_fields, $displayed_info",
547             %args
548             );
549             }
550              
551             sub get_display {
552 0     0 1   my ( $self, %args ) = validated_getter( \@_ );
553 0           my $rv = $self->query( command => "DISPLAY?", %args );
554 0           my ( $mode, $num_fields, $displayed_info ) = split ',', $rv;
555             return (
556 0           mode => $mode, num_fields => $num_fields,
557             displayed_info => $displayed_info
558             );
559             }
560              
561              
562             __PACKAGE__->meta()->make_immutable();
563              
564             1;
565              
566             __END__
567              
568             =pod
569              
570             =encoding UTF-8
571              
572             =head1 NAME
573              
574             Lab::Moose::Instrument::Lakeshore350 - Lakeshore Model 350 Temperature Controller
575              
576             =head1 VERSION
577              
578             version 3.880
579              
580             =head1 SYNOPSIS
581              
582             use Lab::Moose;
583              
584             # Constructor
585             my $lakeshore = instrument(
586             type => 'Lakeshore372',
587             connection_type => 'VISA::GPIB',
588             connection_options => {pad => 10},
589             input_channel => 'A', # set default input channel for all method calls
590             );
591              
592              
593             my $temp_B = $lakeshore->get_T(channel => 'B'); # Get temperature for channel 'B'
594             my $resistance_B = $lakeshore->get_sensor_units_reading(channel => 'B'); # Get resistance for channel 'B'
595            
596            
597             # setup input channel 'A' for fixed 100kOhm range with 10nA excitation
598             $lakeshore->set_intype(
599             channel => 'A',
600             sensor_type => 3, # NTC RTD
601             autorange => 0,
602             range => 8, # 100kOhm
603             compensation => 1, # current reversal for EMF compensation
604             units => 1, # use Kelvin for setpoint control
605             sensor_excitation => 0, # 1mV => 10nA excitation current
606             );
607              
608             =head1 METHODS
609              
610             =head2 get_T
611              
612             my $temp = $lakeshore->get_T(channel => $channel);
613              
614             C<$channel> needs to be one of A, B, C, D.
615              
616             =head2 get_value
617              
618             alias for C<get_T>.
619              
620             =head2 get_sensor_units_reading
621              
622             my $reading = $lakeshore->get_sensor_units_reading(channel => $channel);
623              
624             Get sensor units reading (in ohm) of an input channel.
625              
626             =head2 set_setpoint/get_setpoint
627              
628             Set/get setpoint for loop 0 in whatever units the setpoint is using
629              
630             $lakeshore->set_setpoint(value => 10, loop => 0);
631             my $setpoint1 = $lakeshore->get_setpoint(loop => 0);
632              
633             =head2 set_T
634              
635             alias for C<set_setpoint>
636              
637             =head2 set_heater_range/get_heater_range
638              
639             $lakeshore->set_heater_range(output => 1, value => 1);
640             my $range = $lakeshore->get_heater_range(output => 1);
641              
642             For outputs 1 and 2: 0 = Off, 1 = Range 1, 2 = Range 2,
643             3 = Range 3, 4 = Range 4, 5 = Range 5
644              
645             For outputs 3 and 4: 0 = Off, 1 = On
646              
647             =head2 set_heater_setup/get_heater_setup
648              
649             $lakeshore->set_heater_setup(
650             loop => 0,
651             resistance => 1500, # Ohms
652             max_current => 0, # warm-up heater
653             max_user_current => 0.1, # Amps
654             display => 2, # Display power
655             );
656              
657             my %setup = $lakeshore->get_heater_setup(loop => 0);
658              
659             =head2 get_heater_output
660              
661             my $power = $lakeshore->get_heater_output(output => 1);
662              
663             Return heater output in percent of range.
664              
665             =head2 set_outmode/get_outmode
666              
667             $lakeshore->set_outmode(
668             output => 0, # 0, 1, 2
669             mode => 3, # 0, ..., 6
670             channel => 'A',
671             powerup_enable => 1, # (default: 0)
672             polarity => 1, # (default: 0)
673             filter => 1, # (default: 0)
674             delay => 1, # 1,...,255
675             );
676            
677             my $args = $lakeshore->get_outmode(output => 0);
678              
679             =head2 set_input_curve/get_input_curve
680              
681             # Set channel 5 to use curve 25
682             $lakeshore->set_input_curve(channel => 'A', value => 25);
683             my $curve = $lakeshore->get_input_curve(channel => 'A');
684              
685             =head2 set_remote_mode/get_remote_mode
686              
687             $lakeshore->set_remote_mode(value => 0);
688             my $mode = $lakeshore->get_remote_mode();
689              
690             Valid entries: 0 = local, 1 = remote, 2 = remote with local lockout.
691              
692             =head2 set_pid/get_pid
693              
694             $lakeshore->set_pid(output => 1, P => 1, I => 50, D => 50)
695             my %PID = $lakeshore->get_pid(output => 1);
696             # %PID = (P => $P, I => $I, D => $D);
697              
698             =head2 set_zone/get_zone
699              
700             $lakeshore->set_zone(
701             output => 1,
702             zone => 1,
703             top => 10,
704             P => 25,
705             I => 10,
706             D => 20,
707             mout => 0, # 0%
708             range => 1,
709             rate => 1.2, # 1.2 K / min
710             relay_1 => 0,
711             relay_2 => 0,
712             );
713              
714             my %zone = $lakeshore->get_zone(loop => 0, zone => 1);
715              
716             =head2 set_mout/get_mout
717              
718             $lakeshore->set_mout(output => 1, value => 10);
719             my $mout = $lakeshore->get_mout(output => 1);
720              
721             =head2 set_intype/get_intype
722              
723             $lakeshore->set_intype(
724             channel => 'A',
725             sensor_type => 3, # NTC
726             autorange => 0,
727             range => 8, 100kOhm
728             compensation => 1,
729             units => 1, # Kelvin (default)
730             sensor_excitation => 0
731             );
732              
733             my %intype = $lakeshore->get_intype(channel => 'A');
734              
735             =head2 curve_delete
736              
737             $lakeshore->curve_delete(curve => 21);
738              
739             =head2 set_curve_header/get_curve_header
740              
741             $lakeshore->set_curve_header(
742             curve => 21,
743             name => "Germanium",
744             SN => "selfmade",
745             format => 4, # log Ohm / Kelvin
746             limit => 300,
747             coefficient => 1, # negative
748             );
749            
750             my %header = $lakeshore->get_curve_header(curve => 21);
751              
752             =head2 set_curve_point/get_curve_point
753              
754             $lakeshore->set_curve_point(
755             curve => 21, # 21..59
756             index => 1, # sets first point (1..200)
757             units => 2, # R or log(R)
758             temp => 0.012345,
759             curvature => 0, # default: 0
760             );
761              
762             my %point = $lakeshore->get_curve_point(curve => 21, point => 1);
763              
764             =head2 set_input_name/get_input_name
765              
766             $lakeshore->set_input_name(channel => 1, value => 'RuOx_Sample');
767            
768             my $name = $lakeshore->get_input_name(channel => 1);
769              
770             =head2 set_ramp/get_ramp
771              
772             $lakeshore->set_ramp(
773             loop => 0,
774             on => 1, # 0 or 1
775             rate => 10e-3, # ramp rate in K/min
776             );
777              
778             my %rate = $lakeshore->get_ramp(loop => 0);
779              
780             =head2 set_display_field/get_display_field
781              
782             $lakeshore->set_display_field(
783             field => 1,
784             input => 1,
785             units => 1, # Kelvin
786             );
787              
788             my %field = $lakeshore->get_display_field(field => 1);
789              
790             =head2 set_display/get_display
791              
792             $lakeshore->set_display(
793             mode => 2,
794             num_fields => 2,
795             displayed_info => 1,
796             );
797              
798             my %display = $lakeshore->get_display();
799              
800             =head2 Consumed Roles
801              
802             This driver consumes the following roles:
803              
804             =over
805              
806             =item L<Lab::Moose::Instrument::Common>
807              
808             =back
809              
810             =head1 COPYRIGHT AND LICENSE
811              
812             This software is copyright (c) 2023 by the Lab::Measurement team; in detail:
813              
814             Copyright 2022-2023 Simon Reinhardt
815              
816              
817             This is free software; you can redistribute it and/or modify it under
818             the same terms as the Perl 5 programming language system itself.
819              
820             =cut