function wavedesc = LCGetWaveDescBlock(OBJ, CH)
%
% GETWAVEDESCBLOCK Query the wave descriptor block from the oscilloscope.
%
% GetWaveDescBlock requests a wave descriptor block from the Lecroy 9450
% oscilloscope for channel/memory CH using instrument object OBJ. The
% decoded information is returned in structure wavedesc.
%
fprintf(OBJ, '%s:WF? DESC', CH);
% Read the appropriate types as specified in the manual. Updating the LeCroy
% firmware may change this layout. Read the Lecroy Remote Control for details
% about how to request template information from the scope and update this
% deciphering of the block.
%
% Strings are converting from individual characters and trailing blanks are
% removed.
wavedesc.HEADER = deblank(char(fread(OBJ, 22, 'int8'))');
wavedesc.DESCRIPTOR_NAME = deblank(char(fread(OBJ, 16, 'int8'))');
wavedesc.TEMPLATE_NAME = deblank(char(fread(OBJ, 16, 'int8'))');
wavedesc.COMM_TYPE = fread(OBJ, 1, 'int16');
wavedesc.COMM_ORDER = fread(OBJ, 1, 'int16');
wavedesc.WAVE_DESCRIPTOR_LENGTH = fread(OBJ, 1, 'int32');
wavedesc.USER_TEXT_LENGTH = fread(OBJ, 1, 'int32');
wavedesc.RES_DESC1_LENGTH = fread(OBJ, 1, 'int32');
wavedesc.TRIG_TIME_ARRAY = fread(OBJ, 1, 'int32');
wavedesc.RIS_TIME_ARRAY = fread(OBJ, 1, 'int32');
wavedesc.RES_ARRAY1 = fread(OBJ, 1, 'int32');
wavedesc.WAVE_ARRAY_1 = fread(OBJ, 1, 'int32');
wavedesc.WAVE_ARRAY_2 = fread(OBJ, 1, 'int32');
wavedesc.RES_ARRAY2 = fread(OBJ, 1, 'int32');
wavedesc.RES_ARRAY3 = fread(OBJ, 1, 'int32');
wavedesc.INSTRUMENT_NAME = deblank(char(fread(OBJ, 16, 'int8'))');
wavedesc.INSTRUMENT_NUMBER = fread(OBJ, 1, 'int32');
wavedesc.TRACE_LABEL = deblank(char(fread(OBJ, 16, 'int8'))');
fread(OBJ, 1, 'int16'); % RESERVED1
fread(OBJ, 1, 'int16'); % RESERVED2
wavedesc.WAVE_ARRAY_COUNT = fread(OBJ, 1, 'int32');
wavedesc.PNTS_PER_SCREEN = fread(OBJ, 1, 'int32');
wavedesc.FIRST_VALID_PNT = fread(OBJ, 1, 'int32');
wavedesc.LAST_VALID_PNT = fread(OBJ, 1, 'int32');
wavedesc.FIRST_POINT = fread(OBJ, 1, 'int32');
wavedesc.SPARSING_FACTOR = fread(OBJ, 1, 'int32');
wavedesc.SEGMENT_INDEX = fread(OBJ, 1, 'int32');
wavedesc.SUBARRAY_COUNT = fread(OBJ, 1, 'int32');
wavedesc.SWEEPS_PER_ACQ = fread(OBJ, 1, 'int32');
wavedesc.NUMBER_REJECTED = fread(OBJ, 1, 'int32');
wavedesc.VERTICAL_GAIN = fread(OBJ, 1, 'float32');
wavedesc.VERTICAL_OFFSET = fread(OBJ, 1, 'float32');
wavedesc.MAX_VALUE = fread(OBJ, 1, 'float32');
wavedesc.MIN_VALUE = fread(OBJ, 1, 'float32');
wavedesc.NOMINAL_BITS = fread(OBJ, 1, 'int16');
fread(OBJ, 1, 'int16'); % RESERVED7
wavedesc.HORIZ_INTERVAL = fread(OBJ, 1, 'float32');
wavedesc.HORIZ_OFFSET = fread(OBJ, 1, 'float64');
wavedesc.PIXEL_OFFSET = fread(OBJ, 1, 'float64');
wavedesc.VERTUNIT = deblank(char(fread(OBJ, 48, 'int8'))');
wavedesc.HORUNIT = deblank(char(fread(OBJ, 48, 'int8'))');
fread(OBJ, 1, 'int16'); % RESERVED3
fread(OBJ, 1, 'int16'); % RESERVED4
wavedesc.TRIGGER_TIME_SECONDS = fread(OBJ, 1, 'float64');
wavedesc.TRIGGER_TIME_MINUTES = fread(OBJ, 1, 'int8');
wavedesc.TRIGGER_TIME_HOURS = fread(OBJ, 1, 'int8');
wavedesc.TRIGGER_TIME_DAYS = fread(OBJ, 1, 'int8');
wavedesc.TRIGGER_TIME_MONTHS = fread(OBJ, 1, 'int8');
wavedesc.TRIGGER_TIME_YEARS = fread(OBJ, 1, 'int16');
fread(OBJ, 1, 'int16'); % UNUSED TIME STAMP
wavedesc.ACQ_DURATION = fread(OBJ, 1, 'float32');
wavedesc.RECORD_TYPE = fread(OBJ, 1, 'int16');
wavedesc.PROCESSING_DONE = fread(OBJ, 1, 'int16');
fread(OBJ, 1, 'int16'); % RESERVED5
fread(OBJ, 1, 'int16'); % RESERVED6
wavedesc.TIMEBASE = fread(OBJ, 1, 'int16');
wavedesc.VERT_COUPLING = fread(OBJ, 1, 'int16');
wavedesc.PROBE_ATT = fread(OBJ, 1, 'float32');
wavedesc.FIXED_VERT_GAIN = fread(OBJ, 1, 'int16');
wavedesc.BANDWIDTH_LIMIT = fread(OBJ, 1, 'int16');
wavedesc.VERTICAL_VERNIER = fread(OBJ, 1, 'float32');
wavedesc.ACQ_VERT_OFFSET = fread(OBJ, 1, 'float32');
wavedesc.WAVE_SOURCE = fread(OBJ, 1, 'int16');
% The trailing end-of-block character. Must remove so the the read does not
% receive any leftovers to start.
fread(OBJ, 1);