function [Out] = MicroPulse5Read(Port) %% File Description % % Copyright © 2014 Phillip Petcher. % All rights reserved. % % Name: MicroPulse5Read.m % Author: Phillip Petcher % Creation date: 17/02/2014 % Revision date: 17/02/2014 % Version: 0.1 % Description: Reads the data from a MicroPulse5 as it is output from the TCPIP connection. % Inputs: [Port = The TCPIP object for the MicroPulse connection]. % Outputs: [Out = The message as a structure, with each field of the message split into a field of the structure]. % %% Default output Out=[]; % Default output. %% Read data if get(Port,'BytesAvailable') > 0 IsData = false; Out.Header = fread(Port,1,'uint8'); switch Out.Header case 26 % Data message - A-scan. IsData = true; Out.Message = 'A-scan'; case 28 % Data message - Normal indications. IsData = true; Out.Message = 'Normal indications'; case 29 % Data message - Gain reduced indications. IsData = true; Out.Message = 'Gain reduced indications'; case 30 % Data message - LWL/GPL (coupling failure). IsData = true; Out.Message = 'LWL/GPL (coupling failure)'; case 38 % Auto-CAL. if Port.BytesAvailable >= 9 Message = fread(Port,9,'uint8'); Out.Test = Message(1) + mod(Message(2),8) * 256; Out.Sweep = (Message(2) - mod(Message(2),8)) / 8; Out.DataFormat = mod(Message(3),32); Out.GateNumber = (Message(3) - mod(Message(3),32)) / 32; Out.Amplitudes = Message(4) + Message(5) * 256; Out.Times = Message(6) + Message(7) * 256; Out.Gain = Message(8) + Message(9) * 256; else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end case 37 % GPL grass coupling. if Port.BytesAvailable >= 9 Message = fread(Port,9,'uint8'); Out.Test = Message(1) + mod(Message(2),8) * 256; Out.Sweep = (Message(2) - mod(Message(2),8)) / 8; Out.DataFormat = mod(Message(3),32); Out.GateNumber = (Message(3) - mod(Message(3),32)) / 32; Out.WaveformIntegral = Message(4) + Message(5) * 256 + Message(6) * 65536 + Message(7) * 16777216; Out.Amplitudes = Message(8) + Message(9) * 256; else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end case 36 % GPH grass coupling. if Port.BytesAvailable >= 9 Message = fread(Port,9,'uint8'); Out.Test = Message(1) + mod(Message(2),8) * 256; Out.Sweep = (Message(2) - mod(Message(2),8)) / 8; Out.DataFormat = mod(Message(3),32); Out.GateNumber = (Message(3) - mod(Message(3),32)) / 32; Out.WaveformIntegral = Message(4) + Message(5) * 256 + Message(6) * 65536 + Message(7) * 16777216; Out.Amplitudes = Message(8) + Message(9) * 256; else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end case 40 % LWL coupling failure. if Port.BytesAvailable >= 3 Message = fread(Port,3,'uint8'); Out.Test = Message(1) + mod(Message(2),8) * 256; Out.Sweep = (Message(2) - mod(Message(2),8)) / 8; Out.DataFormat = mod(Message(3),32); Out.GateNumber = (Message(3) - mod(Message(3),32)) / 32; else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end case 39 % Echo trigger failure. if Port.BytesAvailable >= 3 Message = fread(Port,3,'uint8'); Out.Test = Message(1) + mod(Message(2),8) * 256; Out.Sweep = (Message(2) - mod(Message(2),8)) / 8; Out.Channel = Message(3); else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end case 41 % Overload failure (1). if Port.BytesAvailable >= 3 Message = fread(Port,3,'uint8'); Out.Test = Message(1) + mod(Message(2),8) * 256; Out.Sweep = (Message(2) - mod(Message(2),8)) / 8; Out.ElementsSaturating = Message(3); else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end case 42 % Overload failure (2). if Port.BytesAvailable >= 3 Message = fread(Port,3,'uint8'); Out.Count = Message(1); Out.Test = Message(2) + mod(Message(3),8) * 256; Out.Sweep = (Message(3) - mod(Message(3),8)) / 8; if Port.BytesAvailable >= (Out.Count - 4) Out.ElementsSaturating = fread(Port,Out.Count - 4,'uint8'); else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end case 35 % RST. --CHECKED-- if Port.BytesAvailable >= 31 Message = fread(Port,31,'uint8'); Out.Message = 'RST'; Out.SystemNumber = Message(1); Out.PhasedArrayChannels = Message(2) + (mod(Message(17),16) - 1) * 256; Out.ConventionalChannels = Message(3); Out.Zero = Message(4); Out.HardwareVersion = sprintf('%u.%u',Message(5),Message(6)); Out.DataFormat = Message(7); Out.SampleFrequencyDefault = Message(8); Out.SampleFrequency = Message(9); Out.DataFormatDefault = Message(10); Out.ConventionalChannelsPerCuifAdc = Message(11); Out.ProcessorSoftwareVersion = sprintf('%u.%u.%u.%u',Message(12),Message(13),Message(14),Message(15)); Out.MasterControl = Message(16); Out.ExtraTransmit = Message(17) >= 64; Out.RfSlot1 = Message(18); Out.RfSlot2 = Message(19); Out.RfSlot3 = Message(20); Out.RfSlot4 = Message(21); Out.RfSlot5 = Message(22); Out.RfSlot6 = Message(23); Out.RfSlot7 = Message(24); Out.RfSlot8 = Message(25); Out.RfSlot9 = Message(26); Out.Spare = Message(27); Out.EthernetProcessorVersion = sprintf('%u.%u.%u.%u',Message(28),Message(29),Message(30),Message(31)); else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end case 32 % XXA. --CHECKED-- if Port.BytesAvailable >= 39 Message = fread(Port,39,'uint8'); Out.Test = Message(1) + Message(2) * 256; Out.TxFocalLaw = Message(3) + Message (4) * 256; Out.GainDecibels = (Message(5) + Message(6) * 256) / 4.0; Out.Filter = mod(Message(7),16); Out.Smoothing = (Message(7) - mod(Message(7),16)) / 16; Out.AmpReportingMode = Message(8) + Message(9) * 256 + Message(10) * 65536 + Message(11) * 16777216; Out.GateStart = Message(12) + Message(13) * 256; Out.GateEnd = Message(14) + Message(15) * 256; Out.Delay = Message(16) + Message(17) * 256; Out.Upl = Message(18) + Message(19) * 256; Out.EchoGateStart = Message(20) + Message(21) * 256; Out.EchoGateEnd = Message(22) + Message(23) * 256; Out.InspectionGateStart = Message(24) + Message(25) * 256; Out.InspectionGateEnd = Message(26) + Message(27) * 256; Out.Hysteresis = Message(28); Out.TestDacDtg = Message(29); Out.DacNumber = Message(30); Out.SampleFrequency = Message(31); Out.Velocity = Message(32) + Message(33) * 256; Out.EchoGateEupl = Message(34) + Message(35) * 256; Out.RxFocalLaw = Message(36) + Message (37) * 256; Out.Spare1 = Message(38); Out.Spare2 = Message(39); else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end case 33 % XXAS. --CHECKED-- if Port.BytesAvailable >= 7 Message = fread(Port,7,'uint8'); Out.Count = Message(1) + Message(2) * 256; Out.Sweep = Message(3); Out.SweepEnabled = Message(4); Out.Spare = Message(5); Out.Tests = Message(6) + Message(7) * 256; if Port.BytesAvailable >= (Out.Tests * 2) Message = fread(Port,Out.Tests * 2,'uint8'); Out.Test = Message(1:2:end) + Message(2:2:end) * 256; else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end case 34 % XXT / XXR. --CHECKED-- if Port.BytesAvailable >= 519 Message = fread(Port,519,'uint8'); Out.Count = Message(1) + Message(2) * 256; if Message(3) == 1 Out.FocalLaw = 'Tx'; elseif Message(3) == 0 Out.FocalLaw = 'Rx'; else Out.FocalLaw = Message(3); end Out.FocalLawNumber = Message(4) + Message(5) * 256; Out.Spare1 = Message(6); Out.Spare2 = Message(7); Out.Delay = Message(8:4:end) + Message(9:4:end) * 256; Out.Enable = Message(10:4:end); Out.TrimOrApodization = Message(11:4:end); else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end case 21 % STA. --CHECKED-- if Port.BytesAvailable >= 17 Message = fread(Port,17,'uint8'); Out.Status = Message(1); Out.Axes1 = Message(2) + Message(3) * 256 + Message(4) * 65536; Out.Axes2 = Message(5) + Message(6) * 256 + Message(7) * 65536; Out.Axes3 = Message(8) + Message(9) * 256 + Message(10) * 65536; Out.Axes4 = Message(11) + Message(12) * 256 + Message(13) * 65536; Out.Spare = Message(14) + Message(15) * 256 + Message(16) * 65536 + Message(17) * 16777216; else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end case 45 % Other message using universal header. warning('MicroPulse5:IncompleteImplementation','A failure has occurred due to the incomplete implementation of the MicroPulse5 class.'); otherwise warning('MicroPulse5:ReadFailure','Message format not as expected.'); end if IsData % Data message. --CHECKED-- % if Port.BytesAvailable >= 7 Message = fread(Port,7,'uint8'); Out.Count = Message(1) + Message(2) * 256 + Message(3) * 65536; Out.Test = Message(4) + mod(Message(5),8) * 256; Out.Sweep = (Message(5) - mod(Message(5),8)) / 8; Out.DataFormat = mod(Message(6),32); Out.GateNumber = (Message(6) - mod(Message(6),32)) / 32; Out.Channel = Message(7); if Out.Count > 0 if Out.Header == 26 if (Out.DataFormat == 0) || (Out.DataFormat == 1) || (Out.DataFormat == 5) Out.DataPoints = Out.Count - 8; % if Port.BytesAvailable >= Out.DataPoints Out.Amplitudes(:,1) = fread(Port,Out.DataPoints,'uint8'); % else % warning('MicroPulse5:ReadFailure','Message format not as expected.'); % end elseif (Out.DataFormat == 2) || (Out.DataFormat == 3) || (Out.DataFormat == 4) Out.DataPoints = (Out.Count - 8) / 2; % if Port.BytesAvailable >= (Out.DataPoints * 2) Out.Amplitudes(:,1) = fread(Port,Out.DataPoints,'int16'); % else % warning('MicroPulse5:ReadFailure','Message format not as expected.'); % end elseif Out.DataFormat == 6 warning('MicroPulse5:IncompleteImplementation','A failure has occurred due to the incomplete implementation of the MicroPulse5 class.'); else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end elseif (Out.Header == 28) || (Out.Header == 29) if (Out.DataFormat == 0) || (Out.DataFormat == 1) || (Out.DataFormat == 5) Out.DataPoints = (Out.Count - 8) / 3; % if Port.BytesAvailable >= (Out.DataPoints * 3) Message = fread(Port,Out.DataPoints * 3,'uint8'); Out.Amplitudes(:,1) = Message(1:3:end); Out.Times(:,1) = Message(2:3:end) + Message(3:3:end) * 256; % else % warning('MicroPulse5:ReadFailure','Message format not as expected.'); % end elseif (Out.DataFormat == 2) || (Out.DataFormat == 3) || (Out.DataFormat == 4) Out.DataPoints = (Out.Count - 8) / 4; % if Port.BytesAvailable >= (Out.DataPoints * 4) Message = fread(Port,Out.DataPoints * 2,'uint16'); Out.Amplitudes(:,1) = Message(1:2:end); Out.Times(:,1) = Message(2:2:end); % else % warning('MicroPulse5:ReadFailure','Message format not as expected.'); % end elseif Out.DataFormat == 6 warning('MicroPulse5:IncompleteImplementation','A failure has occurred due to the incomplete implementation of the MicroPulse5 class.'); else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end else warning('MicroPulse5:IncompleteImplementation','A failure has occurred due to the incomplete implementation of the MicroPulse5 class.'); end end % else % warning('MicroPulse5:ReadFailure','Message format not as expected.'); % end end else warning('MicroPulse5:ReadFailure','Message format not as expected.'); end