123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646 |
- function saveNEV(NEV, varargin)
- %%
- % Save an .NEV file from an NEV structure (gained by using openNEV)
- % Works with file spec 2.3
- %
- % Use saveNEV(NEV, filename, noreport)
- % All input arguments are optional. Input arguments can be in any order.
- %
- % NEV: Name of the NEV structure to be saved.
- % DEFAULT: The workspace NEV structure in the workspace will
- % be saved.
- %
- % filename: Name of the new NEV file name.
- % DEFAULT: -out.nev will be added to the end of the current
- % file name.
- %
- % 'noreport': Will not display status reports or warnings.
- % DEFAULT: will display status reports and warnings.
- %
- %
- % OUTPUT: None
- %
- % Example 1:
- % saveNEV
- %
- % In the example above, a new file containing the NEV structure in the
- % workspace will be saved. The file name will have -out.NEV added to its
- % name. Statuses of the progress of saveNEV and also warnings about the
- % risks of saving will be displayed.
- %
- % Example 2:
- % openNSx(NEV, 'myNewNEVFile.nev', 'noreport');
- %
- % In the example above, a new file containing the NEV structure in the
- % workspace will be saved. The file name will be myNewNEVFile.nev.
- % Statuses of the progress of saveNEV and also warnings about the
- % risks of saving will be not be displayed.
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % Nick Halper
- % support@blackrockmicro.com
- % Blackrock Microsystems
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % Version History
- %
- % 1.0.0.0: Nick Halper
- % - Initial release.
- %
- % 1.1.0.0: Kian Torab
- % - Added the ability to suppress the fiel saving warning with
- % 'noreport' input parameter.
- % - Re-structured help to better match the suite's style. Added examples.
- % - Added the 'noreport' key to supress statuses and warnings.
- % - Improved error checking for input arguments.
- %
- % 1.2.0.0: Nick Halper - 19/8/29
- % - Allows saveNEV to dynamically determine header offset and total
- % number of extended headers instead of relying on info in MetaTags/Raw
- % Data of NEV structure.
- % - Fixed a bug where choosing to overwrite would crash the script
- % - Fixed an issue where bank letters were not being written correctly, writing
- % blank values
- % - Modified the script to work with 256 channel files
- %
- % 1.3.0.0: Stephen hou - 19/8/30
- % - Implemented saving of files that contain NeuroMotive/tracking data
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % Verify FilePath and establish overwrite paramaters
- if not(NEV.MetaTags.FileSpec == '2.3')
- disp(strcat('This function only functions on file spec 2.3,;this is your file spec:',NEV.MetaTags.FileSpec));
- return
- end
- if nargin > 1
- for idx = 1:nargin-1
- if strcmpi(varargin{idx}, 'noreport')
- reportFlag = 0;
- elseif length(varargin{idx})>3 && ...
- (strcmpi(varargin{idx}(3),'\') || ...
- strcmpi(varargin{idx}(1),'/') || ...
- strcmpi(varargin{idx}(2),'/') || ...
- strcmpi(varargin{idx}(1:2), '\\'))
- FilePath = varargin{1};
- end
- end
- end
- % Validating input arguments
- if ~exist('FilePath', 'var'); FilePath = [fullfile(NEV.MetaTags.FilePath,NEV.MetaTags.Filename) '-out.nev']; end
- if ~exist('reportFlag', 'var'); reportFlag = 1; end;
- % Warning user about the consequences of the modified NEV file
- if reportFlag
- Accept = input('This script will save a new file with the .NEV extensions, but you should retain the previous file. Do you acknowledge the risk inherent in saving modified versions of data files? (Y/N)','s');
- if ~strcmpi(Accept,'y')
- disp('Ending Script...');
- return
- end
- end
- % Validating and opening the writable file
- if exist(FilePath)
-
- if exist(FilePath)
-
- disp('File already exists!');
- OverwritePrompt = input('Would you like to overwrite? (Y/N)','s');
- if strcmpi(OverwritePrompt,'y')
- Overwrite = 1;
- delete(FilePath);
- else
- while exist(FilePath)
- ExistCount = ExistCount + 1;
- FilePath = fullfile(NEV.MetaTags.FilePath,[NEV.MetaTags.Filename '-Aligned-',num2str(ExistCount),NEV.MetaTags.FileExt]);
- end
-
- end
-
- end
- end
- FileID = fopen(FilePath, 'w', 'ieee-le');
-
- if (FileID <= 0)
- disp('No file was selected.');
- return;
- end
- %% Write the basic header into the file
- % General warining about the length of time it takes to save a NEV file so
- % the user does not abort the process
- disp(['Saving NEV file ' FilePath '. This can take a long time. Please be patient.']);
- if reportFlag; disp('Writing Basic Header...'); end
- fwrite(FileID,NEV.MetaTags.FileTypeID(1:8));
- fwrite(FileID, [str2double(NEV.MetaTags.FileSpec(1)) str2double(NEV.MetaTags.FileSpec(3))], 'uint8');
- fwrite(FileID,str2double(NEV.MetaTags.Flags),'uint16');
- fwrite(FileID,NEV.MetaTags.HeaderOffset,'uint32');
- fwrite(FileID,NEV.MetaTags.PacketBytes,'uint32');
- fwrite(FileID,NEV.MetaTags.SampleRes,'uint32');
- fwrite(FileID,NEV.MetaTags.TimeRes,'uint32');
- fwrite(FileID,NEV.MetaTags.DateTimeRaw,'uint16');
- fwrite(FileID,'saveNEV$version1001$$$$$$$$$$$$$');
- fwrite(FileID,NEV.MetaTags.Comment);
- ExtendedHeaderBytes = NEV.MetaTags.HeaderOffset-ftell(FileID)+4;
- fwrite(FileID,ExtendedHeaderBytes/32,'uint32');
- EndOfBasicHeader = ftell(FileID);
- %%
- % Write the extended header into the file.
- %Handling packets with array information
- if isfield(NEV,'ArrayInfo')
- if reportFlag; disp('Writing Array Header...'); end
- if isfield(NEV.ArrayInfo,'ElectrodeName')
- fwrite(FileID,'ARRAYNME');
- fwrite(FileID,NEV.ArrayInfo.ElectrodeName); %Must null terminate
- end
- if isfield(NEV.ArrayInfo,'ArrayComment')
- fwrite(FileID,'ECOMMENT');
- fwrite(FileID,NEV.ArrayInfo.ArrayComment); %Must null terminate
- end
- if isfield(NEV.ArrayInfo,'ArrayCommentCont')
- fwrite(FileID,'CCOMMENT');
- fwrite(FileID,NEV.ArrayInfo.ArrayCommentCont); %Must null terminate
- end
- if isfield(NEV.ArrayInfo,'MapFile')
- fwrite(FileID,'MAPFILE'); %+NULL
- fwrite(FileID,NEV.ArrayInfo.MapFile); %Must null terminate
- end
- end
- if isfield(NEV,'ElectrodesInfo')
- if reportFlag; disp('Writing Electrode Header...'); end
- if (isfield(NEV.ElectrodesInfo(1),'ElectrodeID'))
-
- %Find length of electrode count, loop through for that count and fill
- %in NEUEVWAV packets.
- for IDX = 1:length(NEV.ElectrodesInfo)
- Before = ftell(FileID);
- fwrite(FileID,'NEUEVWAV');
- fwrite(FileID,NEV.ElectrodesInfo(IDX).ElectrodeID,'uint16');
-
- %fwrite(FileID,NEV.ElectrodesInfo(IDX).ConnectorBank);
- switch NEV.ElectrodesInfo(IDX).ConnectorBank
- case 'A'
- fwrite(FileID,1,'uint8');
- case 'B'
- fwrite(FileID,2,'uint8');
- case 'C'
- fwrite(FileID,3,'uint8');
- case 'D'
- fwrite(FileID,4,'uint8');
- case 'E'
- fwrite(FileID,5,'uint8');
- case 'F'
- fwrite(FileID,6,'uint8');
- case 'G'
- fwrite(FileID,7,'uint8');
- case 'H'
- fwrite(FileID,8,'uint8');
- case 'I'
- fwrite(FileID,9,'uint8');
- end
-
- fwrite(FileID,NEV.ElectrodesInfo(IDX).ConnectorPin,'uint8');
- fwrite(FileID,NEV.ElectrodesInfo(IDX).DigitalFactor,'uint16');
- fwrite(FileID,NEV.ElectrodesInfo(IDX).EnergyThreshold,'uint16');
- fwrite(FileID,NEV.ElectrodesInfo(IDX).HighThreshold,'int16');
- fwrite(FileID,NEV.ElectrodesInfo(IDX).LowThreshold,'int16');
- fwrite(FileID,NEV.ElectrodesInfo(IDX).Units,'uint8');
- fwrite(FileID,NEV.ElectrodesInfo(IDX).WaveformBytes,'uint8');
- if isempty(NEV.Data.Spikes.Waveform)
- fwrite(FileID,48,'uint16');
- SpikeLength = 48;
- else
- fwrite(FileID,length(NEV.Data.Spikes.Waveform(:,1)),'uint16');
- SpikeLength = length(NEV.Data.Spikes.Waveform(:,1));
- end
- %if file type is 2.2, don't need previous field and end in 10
- %zeros
- fwrite(FileID,zeros(8,1),'uint8');
- After = ftell(FileID);
- if After-Before ~= 32
- disp('Broken Electrode Info')
- NEV.ElectrodesInfo(IDX).ConnectorBank
- end
- end
- end
- if (isfield(NEV.ElectrodesInfo(1),'ElectrodeLabel'))
- for IDX = 1:length(NEV.ElectrodesInfo)
- Before = ftell(FileID);
- fwrite(FileID,'NEUEVLBL');
- fwrite(FileID, NEV.ElectrodesInfo(IDX).ElectrodeID,'uint16');
- fwrite(FileID, NEV.ElectrodesInfo(IDX).ElectrodeLabel);%Must be nulll terminated
- fwrite(FileID, zeros(6,1),'uint8');
- After = ftell(FileID);
- if After-Before ~= 32
- disp('Broken Electrode Label')
- end
- end
- end
- if (isfield(NEV.ElectrodesInfo(1),'HighFreqCorner'))
- for IDX = 1:length(NEV.ElectrodesInfo)
- Before = ftell(FileID);
- fwrite(FileID,'NEUEVFLT');
- fwrite(FileID, NEV.ElectrodesInfo(IDX).ElectrodeID,'uint16');
- fwrite(FileID, NEV.ElectrodesInfo(IDX).HighFreqCorner,'uint32');
- fwrite(FileID, NEV.ElectrodesInfo(IDX).HighFreqOrder,'uint32');
- fwrite(FileID, NEV.ElectrodesInfo(IDX).HighFilterType,'uint16');
- fwrite(FileID, NEV.ElectrodesInfo(IDX).LowFreqCorner,'uint32');
- fwrite(FileID, NEV.ElectrodesInfo(IDX).LowFreqOrder,'uint32');
- fwrite(FileID, NEV.ElectrodesInfo(IDX).LowFilterType,'uint16');
- fwrite(FileID, zeros(2,1), 'uint8');
- After = ftell(FileID);
- if After-Before ~= 32
- disp('Broken High Freq Corner');
- end
- end
- end
- end
- %Digital inputs
- if isfield(NEV,'IOLabels')
- if reportFlag; disp('Writing IOLabels Header...'); end
- for IDX = 1:length(NEV.IOLabels)
- Before = ftell(FileID);
- fwrite(FileID,'DIGLABEL');
- fwrite(FileID,'Serial1XXXXXXXXX','uint8');
- fwrite(FileID, IDX - 1, 'uint8');
- fwrite(FileID, zeros(7,1),'uint8');
- After = ftell(FileID);
- if After-Before ~= 32
- disp('Broken IO Labels');
- end
- end
- end
-
- %Video Packets
- if isfield(NEV,'VideoSyncInfo')
- if reportFlag; disp('Writing Video Header...'); end
- for IDX = 1:length(NEV.VideoSyncInfo)
- Before = ftell(FileID);
- fwrite(FileID,'VIDEOSYN');
- fwrite(FileID, NEV.VideoSyncInfo(IDX).SourceID, 'uint16');
- fwrite(FileID, NEV.VideoSyncInfo(IDX).SourceName(1:16));
- fwrite(FileID, NEV.VideoSyncInfo(IDX).FrameRateFPS,'single');
- fwrite(FileID, zeros(2,1),'uint8');
- After = ftell(FileID);
- if After-Before ~= 32
- disp('Broken Video Sync Info');
- PacketNumber = IDX;
- TotalPackets = length(NEV.VideoSyncInfo);
- end
- end
- end
- if isfield(NEV,'NSAS')
- %This might exist in a future version of Central
- end
- if isfield(NEV,'ObjTrackInfo')
- if reportFlag; disp('Writing Tracking Header...'); end
- for IDX = 1:length(NEV.ObjTrackInfo)
- Before = ftell(FileID);
- fwrite(FileID,'TRACKOBJ');
- fwrite(FileID, NEV.ObjTrackInfo(IDX).TrackableType,'uint16');
- fwrite(FileID, NEV.ObjTrackInfo(IDX).TrackableID,'uint32');%This is an error and should be two different uint16 values, but we can read it back into file this way.
- NEV.ObjTrackInfo(IDX).TrackableName = pad(NEV.ObjTrackInfo(IDX).TrackableName,16,'X');
- fwrite(FileID, NEV.ObjTrackInfo(IDX).TrackableName);
- fwrite(FileID, zeros(2,1),'uint8');
- After = ftell(FileID);
- if After-Before ~= 32
- disp('Broken Obj Track Info');
- end
- end
- end
- if isfield(NEV,'Rabbits')
- %Fill in the details about Rabbits at some point in the future.
- end
- EndOfExtendedHeader = ftell(FileID);
- %% Edit the Basic Header to Account for Number of Extended Headers
- fseek(FileID,12,'bof');
- fwrite(FileID,EndOfExtendedHeader,'uint32');
- fseek(FileID,322,'bof');
- fwrite(FileID,(EndOfExtendedHeader-EndOfBasicHeader)/32,'uint32');
- fseek(FileID,EndOfExtendedHeader,'bof');
- %%
- % Write Data
- BytesInPackets = NEV.MetaTags.PacketBytes;
- Broken = 0;
- %SerialDigitalIO CHECK
- if ~isempty(NEV.Data.SerialDigitalIO.TimeStamp)
- if reportFlag; disp('Writing Serial/Digital Data...'); end
- for IDX = 1:length(NEV.Data.SerialDigitalIO.TimeStamp)
- Before = ftell(FileID);
- fwrite(FileID, NEV.Data.SerialDigitalIO.TimeStamp(IDX),'uint32');
- %ftell(FileID)-Before
- fwrite(FileID, 0,'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.SerialDigitalIO.InsertionReason(IDX));
- %ftell(FileID)-Before
- fwrite(FileID, '0');
- %ftell(FileID)-Before
- if ~isempty(NEV.Data.SerialDigitalIO.Value)
- fwrite(FileID, NEV.Data.SerialDigitalIO.Value(IDX),'uint16');
- else
- fwrite(FileID, NEV.Data.SerialDigitalIO.UnparsedData(IDX),'uint16');
- end
- %ftell(FileID)-Before
- fwrite(FileID, zeros(BytesInPackets-10,1),'uint8');
- %ftell(FileID)-Before
- After = ftell(FileID);
- if After-Before ~= BytesInPackets
- Broken = 1;
- %After-Before
- %CurrentPacket = IDX
- %TotalPackets = length(NEV.Data.SerialDigitalIO.TimeStamp)
- end
- end
- if Broken == 1
- disp('Serial Digital Packet Corrupted');
- Broken = 0;
- end
- end
- %Spikes CHECK
- if ~isempty(NEV.Data.Spikes.TimeStamp)
- if reportFlag; disp('Writing Spike Data...'); end
- for IDX = 1:length(NEV.Data.Spikes.TimeStamp)
- Before = ftell(FileID);
- fwrite(FileID, NEV.Data.Spikes.TimeStamp(IDX),'uint32');
- fwrite(FileID, NEV.Data.Spikes.Electrode(IDX),'uint16');
- fwrite(FileID, NEV.Data.Spikes.Unit(IDX),'uchar');
- fwrite(FileID, 0,'uchar');
- fwrite(FileID, NEV.Data.Spikes.Waveform(:,IDX)','int16');
-
-
-
- %for Value = 1:SpikeLength
- % fwrite(FileID, NEV.Data.Spikes.Waveform(Value,IDX),'int16');
- %end
-
- After = ftell(FileID);
- if After-Before ~= BytesInPackets
- Broken = 1;
- end
- end
- if Broken == 1
- disp('Spike Packet Corrupted')
- Broken = 0;
- end
- end
- %disp('done')
- %Comments CHECK
- if ~isempty(NEV.Data.Comments.TimeStamp)
- if reportFlag; disp('Writing Comment Data...'); end
- for IDX = 1:length(NEV.Data.Comments.TimeStamp)
- Before = ftell(FileID);
- fwrite(FileID, NEV.Data.Comments.TimeStamp(IDX),'uint32');
- %ftell(FileID)-Before
- fwrite(FileID, 65535, 'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.Comments.CharSet(IDX),'uint8');
- %ftell(FileID)-Before
- fwrite(FileID, 0,'uint8');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.Comments.Color(IDX),'uint32');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.Comments.Text(IDX,:));
- %ftell(FileID)-Before
- %Need to handle extra characters here etc
- fwrite(FileID, zeros(BytesInPackets-(ftell(FileID)-Before),1),'uint8');
- After = ftell(FileID);
- if After-Before ~= BytesInPackets
- Broken = 1;
- %After-Before
- %CurrentPacket = IDX
- %TotalPackets = length(NEV.Data.Comments.TimeStamp)
- end
- end
- if Broken == 1
- disp('Comment Packet Corrupted')
- Broken = 0;
- end
- end
- if ~isempty(NEV.Data.TrackingEvents.TimeStamp)
- if reportFlag; disp('Writing Tracking Event Data'); end
- for IDX = 1:length(NEV.Data.TrackingEvents.TimeStamp)
- Before = ftell(FileID);
- fwrite(FileID, NEV.Data.TrackingEvents.TimeStamp(IDX),'uint32');
- fwrite(FileID, 65535,'uint16');
- fwrite(FileID, 255, 'uint8');
- %fwrite(FileID, 2, 'uint8');
- fwrite(FileID, 0, 'uint8'); %placeholder until I ask hyrum what the Nreuromotive flag is
- fwrite(FileID, int2str(NEV.Data.TrackingEvents.ROINum(IDX)),'uint8');
- %byte 1 is ROI #, byte 2 is enter or exit -- is it 1 and 2?
- if strcmp(NEV.Data.TrackingEvents.Event(IDX),'Enter')
- fwrite(FileID, 1,'uint8');
- elseif strcmp(NEV.Data.TrackingEvents.Event(IDX),'Exit')
- fwrite(FileID, 2,'uint8');
- end
- fwrite(FileID, zeros(2,1), 'uint8');
- fwrite(FileID, strcat(NEV.Data.TrackingEvents.ROIName{IDX},':',int2str(NEV.Data.TrackingEvents.ROINum(IDX)),':',NEV.Data.TrackingEvents.Event{IDX},':',int2str(NEV.Data.TrackingEvents.Frame(IDX)),':','placeholder until i figure out wtf this is'));
- fwrite(FileID, zeros(BytesInPackets-(ftell(FileID)-Before),1),'uint8');
- After = ftell(FileID);
- if After-Before ~= BytesInPackets
- Broken = 1;
- %After-Before
- %CurrentPacket = IDX
- %TotalPackets = length(NEV.Data.Comments.TimeStamp)
- end
- end
- if Broken == 1
- disp('Tracking Event Packet Corrupted')
- Broken = 0;
- end
- end
- if ~isempty(NEV.Data.VideoSync.TimeStamp)
- if reportFlag; disp('Writing VideoSync Data...'); end
- for IDX = 1:length(NEV.Data.VideoSync.TimeStamp)
- Before = ftell(FileID);
- fwrite(FileID, NEV.Data.VideoSync.TimeStamp(IDX),'uint32');
- %ftell(FileID)-Before
- fwrite(FileID, 65534, 'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.VideoSync.FileNumber(IDX),'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.VideoSync.FrameNumber(IDX),'uint32');%Wrong Size
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.VideoSync.ElapsedTime(IDX),'uint32');%Wrong Size
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.VideoSync.SourceID(IDX),'uint32');
- %ftell(FileID)-Before
- fwrite(FileID, zeros(BytesInPackets - 20,1),'uint8');
- %ftell(FileID)-Before
- After = ftell(FileID);
- if After-Before ~= BytesInPackets
- Broken = 1;
- %After-Before
- %CurrentPacket = IDX
- %TotalPackets = length(NEV.Data.VideoSync.TimeStamp)
- end
-
- end
- if Broken == 1
- disp('Video Sync Packet Corrupted')
- Broken = 0;
- end
- end
- if ~isempty(NEV.Data.Tracking)
- if reportFlag; disp('Writing Tracking Data...'); end
- TrackingFieldNames = fieldnames(NEV.Data.Tracking);
- for TrackingField = 1:numel(TrackingFieldNames)
- for IDX = 1:length(NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).TimeStamp)
- Before = ftell(FileID);
- if NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).MarkerCount == 0
-
- fwrite(FileID, NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).TimeStamp(IDX),'uint32');
- %ftell(FileID)-Before
- fwrite(FileID, 65533, 'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).ParentID(IDX),'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, TrackingField-1,'uint16'); %Node ID
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).NodeCount(IDX),'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).MarkerCount(IDX),'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, zeros(2,1),'uint8');
- %ftell(FileID)-Before
- fwrite(FileID, zeros(BytesInPackets - 16,1),'uint8');
-
- else
- fwrite(FileID, NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).TimeStamp(IDX),'uint32');
- %ftell(FileID)-Before
- fwrite(FileID, 65533, 'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).ParentID(IDX),'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, TrackingField-1,'uint16'); %Node ID
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).NodeCount(IDX),'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).MarkerCount(IDX),'uint16');
- %ftell(FileID)-Before
- MarkerCoordinatesBytes = length(NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).MarkerCoordinates(IDX).X);
- fwrite(FileID, NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).MarkerCoordinates(IDX).X,'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.Tracking.(TrackingFieldNames{TrackingField}).MarkerCoordinates(IDX).Y,'uint16');
- %ftell(FileID)-Before
- if MarkerCoordinatesBytes == 1
- fwrite(FileID, zeros(BytesInPackets - 14-MarkerCoordinatesBytes*4,1),'uint8');
- else
- fwrite(FileID, zeros(BytesInPackets - 14-MarkerCoordinatesBytes*4,1),'uint8');
- end
- end
-
- After = ftell(FileID);
- if After-Before ~= BytesInPackets
- Broken = 1;
- %After-Before
- %CurrentPacket = IDX
- %TotalPackets = length(NEV.Data.VideoSync.TimeStamp)
- end
- %Must somehow terminate in correct number of zeros
- end
- if Broken == 1
- disp('Tracking Packet Corrupted')
- disp(After - Before)
- Broken = 0;
- end
- end
- end
- if ~isempty(NEV.Data.PatientTrigger.TimeStamp)
- if reportFlag; disp('Writing Patient Trigger Data...'); end
- for IDX = 1:length(NEV.Data.PatientTrigger.TimeStamp)
- Before = ftell(FileID);
- fwrite(FileID, NEV.Data.PatientTrigger.TimeStamp(IDX),'uint32');
- %ftell(FileID)-Before
- fwrite(FileID, 65532, 'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.PatientTrigger.TriggerType(IDX),'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, zeros(BytesInPackets - 8, 1),'uint8');
- %ftell(FileID)-Before
- After = ftell(FileID);
- if After-Before ~= BytesInPackets
- Broken = 1;
- %After-Before
- %CurrentPacket = IDX
- %TotalPackets = length(NEV.Data.PatientTrigger.TimeStamp)
- end
- end
- if Broken == 1
- disp('Patient Trigger Packet Corrupted')
- Broken = 0;
- end
-
- end
- if ~isempty(NEV.Data.Reconfig.TimeStamp)
- if reportFlag; disp('Writing Reconfig Data...'); end
- for IDX = 1:length(NEV.Data.Reconfig.TimeStamp)
- Before = ftell(FileID);
- fwrite(FileID, NEV.Data.Reconfig.TimeStamp(IDX),'uint32');
- %ftell(FileID)-Before
- fwrite(FileID, 65531, 'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, NEV.Data.Reconfig.ChangeType(IDX),'uint16');
- %ftell(FileID)-Before
- fwrite(FileID, zeros(BytesInPackets - 8,1),'uint8');
- %ftell(FileID)-Before
- After = ftell(FileID);
- if After-Before ~= BytesInPackets
- Broken = 1;
- %After-Before
- %CurrentPacket = IDX
- %TotalPackets = length(NEV.Data.Reconfig.TimeStamp)
- end
- end
- if Broken == 1
- disp('Reconfig Packet Corrupted')
- Broken = 0;
- end
- end
- if reportFlag; disp('Finished!'); end
- clear After
- clear Before
- clear Broken
- clear BytesInPackeets
- clear ExtendedHederBytes
- clear FilePath
- clear IDX
- clear SpikeLength
- clear Value
- fclose('all');
|