package Lab::Moose::Instrument::Synctek_MCL1_540; $Lab::Moose::Instrument::Synctek_MCL1_540::VERSION = '3.930'; #ABSTRACT: Synctek MCL1-540 Lock-in Amplifier use v5.20; use strict; 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 Carp; use namespace::autoclean; use Time::HiRes qw/time usleep/; extends 'Lab::Moose::Instrument'; # TODO # ==== # - how is ip address and port configured? # --> port 8002 is fixed # --> ip is required for init # - type checks for write arguments - done # - URL structure - done # - names of outputs # - which functions to implement? # default connection options: around default_connection_options => sub { my $orig = shift; my $self = shift; my $options = $self->$orig(); $options->{WWW}{port} = 8002; return $options; }; # html escape sequences sub request { my ( $self, %args ) = validated_getter( \@_, type => { isa => enum( [qw/config data/] ) }, id => { isa => 'Str' }, action => { isa => enum( [qw/get set/] ) }, path => { isa => 'Str' }, ); my $type = delete $args{'type'}; my $id = delete $args{'id'}; my $action = delete $args{'action'}; my $path = delete $args{'path'}; return query( command => "/MCL/api?type=$type&id=$id&action=$action&path=$path" ); } # Configuration dump and write todo # WTF is das System mit dem Array? # TODO: - use a single function to return all DC voltages # => use hash to match A_V1->id=L1,DC[0] etc sub get_A_V1_DC { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[0]/" ); } sub get_A_V2_DC { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[1]/" ); } sub get_B_V1_DC { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[2]/" ); } sub get_B_V2_DC { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[3]/" ); } sub get_C_V1_DC { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[4]/" ); } sub get_C_V2_DC { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[5]/" ); } sub get_D_V1_DC { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[6]/" ); } sub get_D_V2_DC { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[7]/" ); } sub get_E_V1_DC { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[8]/" ); } sub get_E_V2_DC { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[9]/" ); } sub get_AI { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[10]/" ); } sub get_BI { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[11]/" ); } sub get_CI { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[12]/" ); } sub get_DI { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[13]/" ); } sub get_EI { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/DC[14]/" ); } sub get_L1_X_0 { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/X[0]/" ); } sub get_L1_Y_0 { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/Y[0]/" ); } sub get_L1_X_10 { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/X[10]/" ); } sub get_L1_Y_10 { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/DataReadings/Y[10]/" ); } sub get_L1_frq { my $self = shift; return $self->request( type => "data", id => "L1", action => "get", path => "/output_cluster/GeneralReadings/Lock-in_f_(Hz)" ); } sub set_L1_frq { my $self = shift; return $self->request( type => "config", id => "Freq_1", action => "set", path => "/FrequencyCtrl/Frequency_(Hz)&value=..." ); } sub get_Offset_1 { my $self = shift; return $self->request( type => "config", id => "Offset_1", action => "get", path => "/OffsetCtrl/Offset_(V)" ); } sub set_Offset_1 { my $self = shift; return $self->request( type => "config", id => "Offset_1", action => "set", path => "/OffsetCtrl/Offset_(V)&value=..." ); } sub get_Amplitude_1 { my $self = shift; return $self->request( type => "config", id => "Amplitude_1", action => "get", path => "/AmplitudeCtrl/Amplitude:Amplitude" ); } sub set_Amplitude_1 { my $self = shift; return $self->request( type => "config", id => "Amplitude_1", action => "set", path => "/AmplitudeCtrl/Amplitude:Amplitude&value=..." ); } sub get_time_constant_1 { my $self = shift; return $self->request( type => "config", id => "Lockin_L1", action => "get", path => "/LockinCtrl/Time_constant_(s)" ); } sub set_time_constant_1 { my $self = shift; return $self->request( type => "config", id => "Lockin_L1", action => "set", path => "/LockinCtrl/Time_constant_(s)&value=..." ); } __PACKAGE__->meta()->make_immutable(); 1; __END__ =pod =encoding UTF-8 =head1 NAME Lab::Moose::Instrument::Synctek_MCL1_540 - Synctek MCL1-540 Lock-in Amplifier =head1 VERSION version 3.930 =head1 SYNOPSIS use Lab::Moose; my $lockin = instrument(...); TODO =head2 Consumed Roles This driver consumes the following roles: =over =item TODO =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2025 by the Lab::Measurement team; in detail: Copyright 2022 Jonas Schambeck, Mia Schambeck, Simon Reinhardt 2023 Mia Schambeck This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut