%% Set and Measure DAC (Data Acquisition) Channel Voltage on Keysight(R) 34970A Switch using the IVI-C Driver
% This example shows how to initialize the driver, read a few properties of 
% the driver, identify installed cards, set DAC channel output voltage and
% measure DC voltage using Agilent Technologies 34970A data
% acquisition/switch unit and output the result in MATLAB(R).

%%
% Copyright 2015 The MathWorks, Inc.

%% Requirements
% This example requires the following to be installed on the computer:
%
% * Keysight IO libraries version 17.1 or newer 
% * Keysight 34970A, 34972A Data Acquisition Switch Unit IVI driver version
% 1.0.3.0 or newer
%

%% Enumerate Available IVI-C Drivers On The Computer
% This enumerates the IVI drivers that have been installed on the computer.
IviInfo = instrhwinfo('ivi');
IviInfo.Modules

%% Create MATLAB Instrument Driver And Connect To The Instrument

% Create the MATLAB instrument driver
makemid('Ag34970','Ag34970.mdd')

% Use icdevice with the MATLAB instrument driver name and instrument's 
% resource name to create a device object. In this example the instrument 
% is connected by GPIB at board index 0 and primary address 1.
myInstrument = icdevice('Ag34970.mdd', 'GPIB0::01::INSTR','optionstring','simulate=true');

% Connect driver instance
connect(myInstrument);

%% Get General Device Properties
% Query information about the driver and instrument
Utility = get(myInstrument, 'Utility');
DriverIdentification = get(myInstrument,'Inherentiviattributesdriveridentification');
InstrumentIdentification = get(myInstrument,'Inherentiviattributesinstrumentidentification');
Revision = invoke(Utility, 'revisionquery');
Vendor = get(DriverIdentification, 'Specific_Driver_Vendor');
Description = get(DriverIdentification, 'Specific_Driver_Description');
InstrumentModel = get(InstrumentIdentification, 'Instrument_Model');
FirmwareRev = get(InstrumentIdentification, 'Instrument_Firmware_Revision');

% Print the queried driver properties
fprintf('Revision:        %s\n', Revision);
fprintf('Vendor:          %s\n', Vendor);
fprintf('Description:     %s\n', Description);
fprintf('InstrumentModel: %s\n', InstrumentModel);
fprintf('FirmwareRev:     %s\n', FirmwareRev);
fprintf(' \n');

%% Identify Installed Cards

System = get(myInstrument, 'System');
for iLoop = 100:100:300   
    CardType = invoke(System, 'systemgetcardtype', iLoop, 127);
    fprintf('Slot: %d  CardType: %s\n', iLoop, CardType);
    if regexp(CardType, ',34907A,') 
        DacSlot = iLoop;
    end
    if regexp(CardType, ',34908A,')     % Single ended -- 40 channels
        MuxSlot = iLoop;
    end
    if regexp(CardType, ',34902A,')     % 16 channel Mux
        MuxSlot = iLoop;
    end
    if regexp(CardType, ',34901A,')             
        MuxSlot = iLoop;
    end
end      
fprintf('\n');

%% Set and Measure DAC Channel 5 Output Voltage

% set DAC voltage to 2.345 V and Select channel 5 on the DAC card
DacVoltage = 2.345;
DacChannel = DacSlot+5; 
if DacSlot ~= 0
    % Sets the output voltage level on the DAC channel 5
    Dac = get(myInstrument, 'Dac');
    invoke(Dac, 'dacsetvoltage', DacChannel,DacVoltage);
    % Gets the output voltage level on the DAC channel 5
    DacVoltage = invoke(Dac, 'dacgetvoltage', DacChannel);
    fprintf('DAC channel %d set to %.3f volts\n\n', DacChannel, DacVoltage);
else
    fprintf('34907A Multifunction Module not found\n\n');
end



%% Display Errors

% If there are any errors, query the driver to retrieve and display them.
ErrorNum = 1;
while (ErrorNum ~= 0)
    [ErrorNum, ErrorMsg] = invoke(Utility, 'errorquery');
    fprintf('ErrorQuery: %d, %s\n', ErrorNum, ErrorMsg);
end

%% Disconnect Device Object And Clean Up
disconnect(myInstrument);
% Remove instrument objects from memory.
delete(myInstrument);
%%



%% Additional Information:
% This example shows the set and measure DAC channel voltage from an Switch
% using the IVI driver. Once the measured voltage data is retrieved from
% the instrument, MATLAB can be used to visualize and perform analyses on
% the data using the rich library of functions in the Signal Processing
% Toolbox(TM) and Communications Systems Toolbox(TM). Using Instrument Control
% Toolbox(TM), it is possible to automate control of instruments, and, build
% test systems that use MATLAB to perform analyses that may not be possible 
% using the built-in capability of the hardware.
