function [spd,S] = MeasMonSpd(window, settings, S, syncMode, whichMeterType, theClut)
% [spd,S] = MeasMonSpd(window, settings, [S], [syncMode], [whichMeterType], [theClut])
%
% Measure the Spd of a series of monitor settings.
%
% This routine is specific to go with CalibrateMon,
% as it depends on the action of SetMon. 
%
% If whichMeterType is passed and set to 0, then the routine
% returns random spectra.  This is useful for testing when
% you don't have a meter.
%
% Other valid types: See list in 'help CMCheckInit' for various Photo Research
% PR-xxx colormeters.
%

% 10/26/93  dhb   Wrote it based on ccc code.
% 11/12/93  dhb   Modified to use SetColor.
% 8/11/94   dhb   Sync mode.
% 8/15/94   dhb   Sync mode as argument, allow S to be [] for default.
% 4/12/97   dhb   New toolbox compatibility, take window and bits args.
% 8/26/97   dhb   pbe Add noMeterAvail arg.
% 4/7/99    dhb   Add argument for radius board. Compact default arg code.
% 8/14/00   dhb   Call to CMETER('SetParams') conditional on OS9.
% 8/20/00   dhb   Remove bits arg to SetColor.
% 8/21/00   dhb   Remove dependence on RADIUS flag.  This is now handled inside of SetColor.
%           dhb   Change calling conventions to remove unused args.
% 9/14/00   dhb   Sync mode is not actually used.  Arg still passed for backwards compat.
% 2/27/02   dhb   Change noMeterAvail to whichMeterType.
% 8/19/12   mk    Rewrite g_usebitspp path to use PTB imaging pipeline for higher robustness 
%                 and to support more display devices.
% 6/30/23   mk    Use new clut mapping to fix this mess on standard gpus.

% Declare Bits++ box global
global g_usebitspp;

% If the global flag for using Bits++ is empty, then it hasn't been
% initialized and default it to 0.
if isempty(g_usebitspp)
    g_usebitspp = 0;
end

% Check args and make sure window is passed right.
usageStr = 'Usage: [spd,S] = MeasMonSpd(window, settings, [S], [syncMode], [whichMeterType])';
if nargin < 2 || nargin > 6 || nargout > 2
    error(usageStr);
end
if size(window,1) ~= 1 || size(window,2) ~= 1
    error(usageStr);
end

% Set defaults
defaultS = [380 5 81];
defaultSync = 'on';
defaultWhichMeterType = 1;

% Check args and set defaults
if nargin < 5 || isempty(whichMeterType)
    whichMeterType = defaultWhichMeterType;
end
if nargin < 4 || isempty(syncMode)
    syncMode = defaultSync;
end
if nargin < 3 || isempty(S)
    S = defaultS;
end

[null, nMeas] = size(settings); %#ok<*ASGLU>
spd = zeros(S(3), nMeas);
for i = 1:nMeas
    % Set the color.
    theClut(2,:) = settings(:, i)';
    Screen('LoadNormalizedGammaTable', window, theClut, 2);
    Screen('Flip', window, 0, 1);

    % Measure spectrum
    switch whichMeterType
        case 0
            spd(:,i) = sum(settings(:, i)) * ones(S(3), 1);
            WaitSecs(0.1);
        case 2
            error('CVI interface not yet ported to PTB-3.');
            % cviCal = LoadCVICalFile;
            % spd(:,i) =  CVICalibratedDarkMeasurement(cviCal, S, [], [], [], window, 1, settings(:,i));
        otherwise
            spd(:,i) = MeasSpd(S, whichMeterType, syncMode);
    end
end
