function [spd, qual] = PR670measspd(S, syncMode)
% PR670measspd - Make a measurement measurement.
%
% Syntax:
% [spd, qual] = PR670measspd(S)
% [spd, qual] = PR670measspd(S, syncMode)
%
% Input:
% S (1x3) - Desired wavelength sampling. Default: [380 5 81]
% syncMode (string) - Toggles syncronization with the light source.  Set
%     using the strings 'on' or 'off'.  Default: 'on'
%
% Output:
% spd (Mx1) - Light source spectrum.
% qual (scalar) - Measurement quality code.  See the PR-670 manual.

% Handle defaults
if nargin < 2 || isempty(syncMode)
    syncMode = 'on';
end

% Set wavelength sampling if passed.
if nargin < 1 || isempty(S)
   S = [380 5 81];
end

% Initialize
timeout = 300;

% See if we can sync to the source and set sync mode appropriately.
if strcmp(syncMode, 'on')
    syncFreq = PR670getsyncfreq;
    if ~isempty(syncFreq)
        PR670setsyncfreq(1);
    else
        PR670setsyncfreq(0);
    end
else
    PR670setsyncfreq(0);
end

% Get the meter response.
readStr = PR670rawspd(timeout);

% Extract the result code.
qual = sscanf(readStr, '%f', 1);
if (~isnumeric(qual))
    fprintf('The returned value of qual should be numeric, but it is not.\n');
    fprintf('Dumping both qual and the string it was read from, then exiting.\n');
    qual
    readStr
    error('Exiting because do not know what to do with a totally unexpected value of qual');
end
try
switch qual
	% Measurement OK
	case 0
		spd = PR670parsespdstr(readStr, S);
		
	% Too dark
	case -8
		spd = zeros(S(3), 1);
		
	% Light source sync failure
	case {-1, -10}
		disp('Could not sync to source, turning off sync mode and remeasuring');
		PR670write('SS0');
		readStr = PR670rawspd(timeout);
		qual = sscanf(readStr,'%f',1);
		if qual == -8
			spd = zeros(S(3), 1);
		elseif qual == 0
			spd = PR670parsespdstr(readStr, S);
		else
			error('Received unhandled error code %d\n', qual);
		end
	
	otherwise
		error('Bad return code %g from meter', qual);
end
catch e
    fprintf('The returned value of qual should be numeric, but it is not.\n');
    fprintf('Dumping both qual and the string it was read from, then rethrowing the error.\n');
    qual
    readStr
    rethrow(e); 
end