📄 viewedf.m
字号:
Data.Display.Plugin(ind).DisplayMin = Data.Plugin(ind).EDF.Head.PhysMin;
Data.Display.Plugin(ind).DisplayMax = Data.Plugin(ind).EDF.Head.PhysMax;
Data.Display.Plugin(ind).StairPlot = ...
zeros(1, Data.Plugin(ind).EDF.Head.NS);
Data.Display.Plugin(ind).UpDownPlot = ...
zeros(1, Data.Plugin(ind).EDF.Head.NS);
MaxDur = max(LocalGetEDFInfo('Dur', Data.EDF));
Data.Display.Plugin(ind).ShowRecords = [0 ...
round(Data.Plugin(ind).EDF.Head.Dur / MaxDur)];
% Add menu entry to options menu
Data.Display.PluginMenu.Sub(ind) = uimenu(Data.Display.PluginMenu.Main, ...
'Label', [pluglabel, ' (File ', upper(plugname), ')'], ...
'UserData', ind, ...
'Callback', 'viewedf PluginMenu');
set(findobj('Tag', 'ViewEDFFigure'), 'UserData', Data);
LocalRepaint(0);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% LocalRemovePlugin
% Remove plugin function
function LocalRemovePlugin(whichplugin)
Data = get(findobj('Tag', 'ViewEDFFigure'), 'UserData');
if nargin == 0
% determine which plugin to remove
if length(Data.EDF)==0
errordlg('No EDF-File is open!', 'Error');
return;
end
if length(Data.Plugin) == 0
errordlg('No Plugins are loaded!', 'Error');
return;
end
dlgh = dialog(...
'Name', 'Remove Plugin', ...
'CloseRequestFcn', 'set(gcf,''UserData'',''Cancel'');uiresume;');
dlgpos = get(dlgh, 'Position');
set(dlgh, 'Position', [dlgpos(1),dlgpos(2),200,100]);
PlugNames = {};
% get Plugin names
for i = 1:length(Data.Plugin)
PlugNames = {PlugNames{:}, [Data.Plugin(i).Label, ' (File ', ...
upper(Data.Plugin(i).Name), ')']};
end
poph = uicontrol(dlgh, ...
'Style', 'Popup', ...
'Units', 'Normalized', ...
'String', PlugNames, ...
'Value', 1, ...
'Position', [0.05, 0.5, 0.9, 0.35]);
% buttons
uicontrol(dlgh, ...
'Style', 'PushButton', ...
'Units', 'Normalized', ...
'String', 'Remove', ...
'Position', [0.1, 0.05, 0.3, 0.3], ...
'Callback', 'set(gco,''UserData'',''OK'');uiresume;');
uicontrol(dlgh, ...
'Style', 'PushButton', ...
'Units', 'Normalized', ...
'String', 'Cancel', ...
'Position', [0.6, 0.05, 0.3, 0.3], ...
'Callback', 'set(gco,''UserData'',''Cancel'');uiresume;');
drawnow;
uiwait(dlgh);
whichplugin = get(poph, 'Value');
selbutton = get(gco,'UserData');
delete(dlgh);
if strcmp(selbutton,'Cancel')
return
end
end
delete(Data.Display.PluginMenu.Sub(whichplugin));
for i = whichplugin:length(Data.Plugin)-1
Data.Display.PluginMenu.Sub(i) = Data.Display.PluginMenu.Sub(i+1);
set(Data.Display.PluginMenu.Sub(i), 'UserData', i);
Data.Display.Plugin(i) = Data.Display.Plugin(i+1);
Data.Plugin(i) = Data.Plugin(i+1);
end
ind = length(Data.Plugin) - 1;
if ind == 0
Data.Plugin = [];
Data.Display.Plugin = [];
Data.Display.PluginMenu.Sub = [];
else
Data.Plugin = Data.Plugin(1:ind);
Data.Display.Plugin = Data.Display.Plugin(1:ind);
Data.Display.PluginMenu.Sub = Data.Display.PluginMenu.Sub(1:ind);
end
set(findobj('Tag', 'ViewEDFFigure'), 'UserData', Data);
LocalRepaint;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% LocalPluginMenu
% Call plugin for setup
function LocalPluginMenu()
ind = get(gcbo, 'UserData');
Data = get(findobj('Tag', 'ViewEDFFigure'), 'UserData');
[Data.Plugin(ind).EDF, Data.Plugin(ind).UserData] = ...
feval(Data.Plugin(ind).Name, Data.EDF(Data.Plugin(ind).EDFFile), ...
Data.Plugin(ind).UserData, 'Menu');
% Uncomment to reset display properties after a call of the plugin-menu
%Data.Display.Plugin(ind).ShowSignals = 1:Data.Plugin(ind).EDF.Head.NS;
%Data.Display.Plugin(ind).DisplayMin = Data.Plugin(ind).EDF.Head.PhysMin;
%Data.Display.Plugin(ind).DisplayMax = Data.Plugin(ind).EDF.Head.PhysMax;
%Data.Display.Plugin(ind).StairPlot = ...
% zeros(1, Data.Plugin(ind).EDF.Head.NS);
%Data.Display.Plugin(ind).UpDownPlot = ...
% zeros(1, Data.Plugin(ind).EDF.Head.NS);
set(findobj('Tag', 'ViewEDFFigure'), 'UserData',Data);
LocalRepaint(0);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% LocalChangeRecord
% Change displayed page
function LocalChangeRecord(increment, changetype)
Data = get(findobj('Tag', 'ViewEDFFigure'), 'UserData');
if length(Data.EDF) == 0
errordlg('No EDF-File is open!', 'Error');
return;
end
Dur = LocalGetEDFInfo('Dur',Data.EDF);
[MDur, MDInd] = max(Dur);
FLen = max(LocalGetEDFInfo('FileDur', Data.EDF));
[MFLen, MFInd] = max(FLen);
RelInc = round(ones(size(Dur)) * max(Dur) ./ Dur);
Inc = increment * RelInc;
for i = 1:length(Data.EDF)
switch changetype
case 0 % incremental
Data.Display.EDF(i).ShowRecords(1) = Data.Display.EDF(i).ShowRecords(1) ...
+ Inc(i) * Data.Display.EDF(MDInd).ShowRecords(2);
case 1 % absolute
Data.Display.EDF(i).ShowRecords(1) = Inc(i);
end
end
% check whether we are moving to far
temp = Data.Display.EDF(MDInd).ShowRecords(1);
if temp < 0
for i = 1:length(Data.EDF)
Data.Display.EDF(i).ShowRecords(1) = Data.Display.EDF(i).ShowRecords(1) ...
- temp * RelInc(i);
end
end
temp = sum(Data.Display.EDF(MFInd).ShowRecords(1:2)) - ...
Data.EDF(MFInd).Head.NRec;
if temp > 0
temp = ceil(temp / RelInc(MFInd));
for i = 1:length(Data.EDF)
Data.Display.EDF(i).ShowRecords(1) = Data.Display.EDF(i).ShowRecords(1) - ...
temp * RelInc(i);
end
end
for i=1:length(Data.EDF)
temp = sum(Data.Display.EDF(i).ShowRecords(1:2)) - ...
Data.EDF(i).Head.NRec;
whichrec(1) = Data.Display.EDF(i).ShowRecords(1);
if temp > 0
% do not read to much data
whichrec(2) = Data.Display.EDF(i).ShowRecords(2) - temp;
if (whichrec(2) < 0)
whichrec(2) = 0;
end
[temp, Data.EDF(i).Head] = LocalEDFRead(Data.EDF(i).Head, whichrec);
for j = 1:Data.EDF(i).Head.NS
Data.EDF(i).Record{j} = zeros(Data.Display.EDF(i).ShowRecords(2) * ...
Data.EDF(i).Head.SPR(j));
if ~isempty(temp)
Data.EDF(i).Record{j}(1:length(temp{j})) = temp{j};
end
end
else
[Data.EDF(i).Record, Data.EDF(i).Head] = ...
LocalEDFRead(Data.EDF(i).Head, Data.Display.EDF(i).ShowRecords);
end
end
set(findobj('Tag', 'ViewEDFFigure'), 'UserData', Data);
LocalRepaint(1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% LocalHSroll
% Goto record
function LocalHScroll
Data = get(findobj('Tag', 'ViewEDFFigure'), 'UserData');
MaxVal = max(LocalGetEDFInfo('FileDur',Data.EDF));
MaxDur = max(LocalGetEDFInfo('Dur', Data.EDF));
pos = get(gcbo, 'Value');
LocalChangeRecord(round(pos*MaxVal/MaxDur), 1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% LocalGotoRecord
% Goto record
function LocalGotoRecord(Pos)
Data = get(findobj('Tag', 'ViewEDFFigure'), 'UserData');
if length(Data.EDF)==0
errordlg('No EDF-File is open!', 'Error');
return;
end
[temp, ind] = max(LocalGetEDFInfo('Dur', Data.EDF));
if (nargin == 0)
answer = inputdlg({'Select record'}, 'Change start record', 1, ...
{int2str(Data.Display.EDF(ind).ShowRecords(1))});
if (length(answer) ~= 0)
answer = str2num(answer{1});
if ~isempty(answer)
LocalChangeRecord(answer, 1);
end
end
else
Pos = round(Pos);
if Pos >= 0
LocalChangeRecord(Pos, 1);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% LocalGotoSecond
% Goto second
function LocalGotoSecond(Pos)
Data = get(findobj('Tag', 'ViewEDFFigure'), 'UserData');
if length(Data.EDF)==0
errordlg('No EDF-File is open!', 'Error');
return;
end
[temp, ind] = max(LocalGetEDFInfo('Dur', Data.EDF));
if (nargin == 0)
answer = inputdlg({'Select second'}, 'Change start time', 1, ...
{int2str(round(Data.Display.EDF(ind).ShowRecords(1) / ...
Data.EDF(ind).Head.Dur))});
if (length(answer) ~= 0)
answer = str2num(answer{1});
if ~isempty(answer)
LocalChangeRecord(answer / Data.EDF(ind).Head.Dur, 1);
end
end
else
Pos = round(Pos / Data.EDF(ind).Head.Dur);
if Pos >= 0
LocalChangeRecord(Pos, 1);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% LocalRecordProp
% display channel properties
function LocalRecordProp()
Data = get(findobj('Tag', 'ViewEDFFigure'), 'UserData');
if length(Data.EDF)==0
errordlg('No EDF-File is open!', 'Error');
return;
end
whichbut = get(gcbo, 'UserData');
Rec = whichbut{2};
Num = whichbut{3};
switch whichbut{1}
case 'EDF'
RecHead = Data.EDF(Num).Head;
RecDisp = Data.Display.EDF(Num);
DataType = 'EDF File';
TypeString = 'Filename :';
OptString = [Data.EDF(Num).Head.FILE.Name '.' Data.EDF(Num).Head.FILE.Ext];
case 'PLUGIN'
RecHead = Data.Plugin(Num).EDF.Head;
RecDisp = Data.Display.Plugin(Num);
DataType = 'Plugin';
TypeString = 'Name :';
OptString = Data.Plugin(Num).Label;
end
dlgh = dialog(...
'Name', 'Channel Information', ...
'CloseRequestFcn', 'set(gcf,''UserData'',''Cancel'');uiresume;');
dlgpos = get(dlgh, 'Position');
set(dlgh, 'Position', [dlgpos(1),dlgpos(2),350,300]);
Fnthgt = LocalGetFontHeight;
yinc = 0.085;
% general information
linenum=1;
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'FontWeight', 'bold', ...
'String', [ 'Record read from ' DataType], ...
'Position', [0.02, 1-linenum*yinc, 0.96, Fnthgt ]);
% filename
linenum=linenum+1;
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'String', TypeString, ...
'Position', [0.02, 1-linenum*yinc, 0.96, Fnthgt]);
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'FontWeight', 'bold', ...
'String', OptString, ...
'Position', [0.35, 1-linenum*yinc, 0.63, Fnthgt]);
% label
linenum=linenum+1;
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'String', 'Label : ', ...
'Position', [0.02, 1-linenum*yinc, 0.96, Fnthgt]);
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'FontWeight', 'bold', ...
'String', RecHead.Label(Rec,:), ...
'Position', [0.35, 1-linenum*yinc, 0.63, Fnthgt]);
% Transducer
linenum=linenum+1;
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'String', 'Transducer :', ...
'Position', [0.02, 1-linenum*yinc, 0.96, Fnthgt]);
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'FontWeight', 'bold', ...
'String', RecHead.Transducer(Rec, :), ...
'Position', [0.35, 1-linenum*yinc, 0.63, Fnthgt]);
% Prefilter
linenum=linenum+1;
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'String', 'Prefilter :', ...
'Position', [0.02, 1-linenum*yinc, 0.96, Fnthgt]);
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'FontWeight', 'bold', ...
'String', RecHead.PreFilt(Rec, :), ...
'Position', [0.35, 1-linenum*yinc, 0.63, Fnthgt]);
% samples per records
linenum=linenum+1;
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'String', 'Samples per record :', ...
'Position', [0.02, 1-linenum*yinc, 0.96, Fnthgt]);
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'FontWeight', 'bold', ...
'String', sprintf('%d', RecHead.SPR(Rec)), ...
'Position', [0.35, 1-linenum*yinc, 0.63, Fnthgt]);
% physical min
linenum=linenum+1;
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'String', 'Physical min :', ...
'Position', [0.02, 1-linenum*yinc, 0.45, Fnthgt]);
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
'HorizontalAlignment', 'left', ...
'FontWeight', 'bold', ...
'String', sprintf('%f', RecHead.PhysMin(Rec)), ...
'Position', [0.25, 1-linenum*yinc, 0.25, Fnthgt]);
% physical max
uicontrol(dlgh, ...
'Style', 'Text', ...
'Units', 'Normalized', ...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -