function XYZ = MeasMonXYZ(window, settings, whichMeterType)
% XYZ = MeasMonXYZ(window, settings [, whichMeterType=1])
%
% Measure the XYZ of a series of monitor settings.
%
% Usage:
%
% 'window' Onscreen window handle for window to present into.
% 'settings' a 3-rows by nMeas columns matrix with each column defining one
% [r,g,b]' color value to measure.
%
% 'whichMeterType' type of Colorimeter to use:
%
%   0 - Return random spectra. This is useful for testing when you don't have a meter.
% > 0 - Use MeasXYZ(whichMeterType) to measure. See "help MeasXYZ" for available meter types.
%

% History:
%
% 10/26/93  dhb     Wrote it based on ccc code.
% 11/12/93  dhb     Modified to use SetColor.
%  6/23/94  ccc     Modified it from MeasMonSpd.m for
%                   the purpose of measuring XYZ
%  8/9/94   dhb     Added code to go into sync mode
%                   And then commented it out.
% 8/11/94   dhb     Sync mode back in
% 8/15/94   dhb     Sync mode as argument.
% 4/12/97   dhb     New toolbox compatibility, take window and bits args.
% 8/26/97   dhb, pbe Add noMeterAvail option.
% 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 from call 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 no longer used.  Arg passed for backwards compatibility.
% 2/27/02   dhb, ly Pass whichMeterType rather than noMeterAvail.
% 5/19/20   mk      Fix this disastrous mess somewhat. Still untested.
% 9/02/20   mk      Formatting fixes.

% Check args and make sure window is passed right.
usageStr = 'XYZ = MeasMonXYZ(window, settings [, whichMeterType=1])';
if (nargin < 2 || nargin > 3 || nargout > 1)
    error(usageStr);
end

if ~isscalar(window) || ~isreal(window) || (Screen('WindowKind', window) ~= 1)
    error(usageStr);
end

% Default to PR-650:
if (nargin < 3 || isempty(whichMeterType))
    whichMeterType = 1;
end

[~, nMeas] = size(settings);
XYZ = zeros(3, nMeas);
for i=1:nMeas
    % Set color:
    Screen('FillRect', window, settings(:,i)');
    Screen('Flip', window);

    % Make the measurement:
    switch (whichMeterType)
        case 0
            XYZ(:,i) = sum(settings(:,i))*ones(3,1);
            WaitSecs(0.1);
        otherwise
            XYZ(:,i) = MeasXYZ(whichMeterType);
    end
end