1198 lines
44 KiB
Matlab
1198 lines
44 KiB
Matlab
function varargout = IAD_v_2_3(varargin)
|
|
% IAD_V_2_3 MATLAB code for IAD_v_2_3.fig
|
|
% IAD_V_2_3, by itself, creates a new IAD_V_2_3 or raises the existing
|
|
% singleton*.
|
|
%
|
|
% H = IAD_V_2_3 returns the handle to a new IAD_V_2_3 or the handle to
|
|
% the existing singleton*.
|
|
%
|
|
% IAD_V_2_3('CALLBACK',hObject,eventData,handles,...) calls the local
|
|
% function named CALLBACK in IAD_V_2_3.M with the given input arguments.
|
|
%
|
|
% IAD_V_2_3('Property','Value',...) creates a new IAD_V_2_3 or raises the
|
|
% existing singleton*. Starting from the left, property value pairs are
|
|
% applied to the GUI before IAD_v_2_3_OpeningFcn gets called. An
|
|
% unrecognized property name or invalid value makes property application
|
|
% stop. All inputs are passed to IAD_v_2_3_OpeningFcn via varargin.
|
|
%
|
|
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
|
|
% instance to run (singleton)".
|
|
%
|
|
% See also: GUIDE, GUIDATA, GUIHANDLES
|
|
|
|
% Edit the above text to modify the response to help IAD_v_2_3
|
|
|
|
% Last Modified by GUIDE v2.5 12-Aug-2017 18:51:51
|
|
|
|
% Begin initialization code - DO NOT EDIT
|
|
gui_Singleton = 1;
|
|
gui_State = struct('gui_Name', mfilename, ...
|
|
'gui_Singleton', gui_Singleton, ...
|
|
'gui_OpeningFcn', @IAD_v_2_3_OpeningFcn, ...
|
|
'gui_OutputFcn', @IAD_v_2_3_OutputFcn, ...
|
|
'gui_LayoutFcn', [] , ...
|
|
'gui_Callback', []);
|
|
if nargin && ischar(varargin{1})
|
|
gui_State.gui_Callback = str2func(varargin{1});
|
|
end
|
|
|
|
if nargout
|
|
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
|
|
else
|
|
gui_mainfcn(gui_State, varargin{:});
|
|
end
|
|
% End initialization code - DO NOT EDIT
|
|
|
|
% --- Outputs from this function are returned to the command line.
|
|
function varargout = IAD_v_2_3_OutputFcn(hObject, eventdata, handles)
|
|
% varargout cell array for returning output args (see VARARGOUT);
|
|
% hObject handle to figure
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Get default command line output from handles structure
|
|
varargout{1} = handles.output;
|
|
|
|
|
|
|
|
% --- Executes just before IAD_v_2_3 is made visible.
|
|
function IAD_v_2_3_OpeningFcn(hObject, eventdata, handles, varargin)
|
|
% This function has no output args, see OutputFcn.
|
|
% hObject handle to figure
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
% varargin command line arguments to IAD_v_2_3 (see VARARGIN)
|
|
|
|
% Choose default command line output for IAD_v_2_3
|
|
handles.output = hObject;
|
|
|
|
% Update handles structure
|
|
guidata(hObject, handles);
|
|
|
|
|
|
% Choose default command line output for Cytocube_v1_4
|
|
handles.output = hObject;
|
|
disp('Booting.............');
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% Start serial port
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
s = serial('COM3');
|
|
set(s,'BaudRate',57600); set(s,'Terminator','#');
|
|
set(s,'Timeout',30); % s.RecordName = 'CytoSerialTxnLog.txt';
|
|
fopen(s); % record(s);
|
|
handles.s = s;
|
|
|
|
msg=strcat(datestr(clock,'yyyy-mm-dd-HHMM'),'m',datestr(clock,'ss'),'s');
|
|
fid = fopen(strcat(msg,'.txt'),'w');
|
|
handles.fid = fid;
|
|
if (fid == -1)
|
|
disp('could not open logging file. You probably need to change working directory to the one where the MATLAB file is located.');
|
|
return;
|
|
end
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% Start cam
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
tic
|
|
fprintf(fid, '\r\nStarting camera...');
|
|
% choose which webcam (winvideo-1) and which mode (YUY2_176x144)
|
|
%vid = videoinput('winvideo', 1, 'RGB32_744x480');
|
|
vid = videoinput('gentl', 1, 'BGRA8Packed');
|
|
% Configure the object for manual trigger mode.
|
|
triggerconfig(vid, 'manual');
|
|
% only capture one frame per trigger, we are not recording a video
|
|
vid.FramesPerTrigger = 1;
|
|
% output would image in RGB color space
|
|
vid.ReturnedColorspace = 'rgb';
|
|
% tell matlab to start the webcam on user request, not automatically
|
|
triggerconfig(vid, 'manual');
|
|
% we need this to know the image height and width
|
|
vidRes = get(vid, 'VideoResolution');
|
|
% image width
|
|
imWidth = vidRes(1);
|
|
% image height
|
|
imHeight = vidRes(2);
|
|
% number of bands of our image (should be 3 because it's RGB)
|
|
nBands = get(vid, 'NumberOfBands');
|
|
% create an empty image container and show it on axPreview
|
|
hImage = image(zeros(imHeight, imWidth, nBands), 'parent', handles.axPreview);
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% do auto white balance
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
src = getselectedsource(vid);
|
|
src.BalanceWhiteAuto = 'Continuous';
|
|
% begin the webcam preview
|
|
preview(vid, hImage);
|
|
% expose the objects so we can handle them in other functions
|
|
handles.vid = vid;
|
|
handles.src = src;
|
|
guidata(hObject,handles);
|
|
%start(vid);
|
|
drawnow;
|
|
|
|
% set and display the exposure
|
|
src.ExposureTime = 360;
|
|
set(handles.expDisp,'string', src.ExposureTime );
|
|
Time_to_init_cam = toc
|
|
|
|
% clear the message
|
|
set(handles.camwait,'string',' ');
|
|
|
|
% setup the timer for pos update
|
|
tmr = timer('ExecutionMode', 'fixedSpacing','Period',1,'TimerFcn', {@timerCallback,handles});
|
|
start(tmr); handles.tmr = tmr;
|
|
|
|
% this is the slide name
|
|
setslidename = 'Slide';
|
|
handles.setslidename = setslidename;
|
|
|
|
%start(vid);
|
|
|
|
% Update handles structure
|
|
guidata(hObject, handles);
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% The timer function
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
function timerCallback( ~,~,handles )%varargin) ~,struct2,~
|
|
try
|
|
query_X(handles); query_Y(handles); query_Z(handles);
|
|
catch
|
|
%disp('timer error');
|
|
end
|
|
|
|
|
|
% --- Executes on button press in pushbutton1.
|
|
function pushbutton1_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton1 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
fid=handles.fid; src = handles.src;
|
|
set(handles.camwait,'string','Updating exposure value...');
|
|
fprintf(fid, '\r\nUpdating exposure value...');
|
|
newExp = get(handles.camExpEdit,'string');
|
|
numVal = str2num(newExp); src.ExposureTime = numVal;
|
|
set(handles.expDisp,'string',newExp);
|
|
fprintf(fid, '\r\nExposure value updated to %d microsecond',numVal);
|
|
set(handles.camwait,'string','Camera exposure changed.');
|
|
|
|
|
|
function camExpEdit_Callback(hObject, eventdata, handles)
|
|
% hObject handle to camExpEdit (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hints: get(hObject,'String') returns contents of camExpEdit as text
|
|
% str2double(get(hObject,'String')) returns contents of camExpEdit as a double
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function camExpEdit_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to camExpEdit (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: edit controls usually have a white background on Windows.
|
|
% See ISPC and COMPUTER.
|
|
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
|
|
set(hObject,'BackgroundColor','white');
|
|
end
|
|
|
|
|
|
% --- Executes on button press in pushbutton2.
|
|
function pushbutton2_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton2 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
fullAFvar = fullAF(handles,6000);
|
|
|
|
% --- Executes on button press in pushbutton3.
|
|
function pushbutton3_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton3 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s; fprintf(s, 'B'); fprintf(s, '0000000');
|
|
|
|
|
|
function edit10_Callback(hObject, eventdata, handles)
|
|
% hObject handle to edit10 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hints: get(hObject,'String') returns contents of edit10 as text
|
|
% str2double(get(hObject,'String')) returns contents of edit10 as a double
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function edit10_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to edit10 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: edit controls usually have a white background on Windows.
|
|
% See ISPC and COMPUTER.
|
|
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
|
|
set(hObject,'BackgroundColor','white');
|
|
end
|
|
|
|
|
|
% --- Executes on button press in pushbutton4.
|
|
function pushbutton4_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton4 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s;
|
|
% format the number properly --------------------------------------------
|
|
str = get(handles.edit10,'string') ;
|
|
check = str2double(str);
|
|
% ensure that too big values dont go in
|
|
if (check < -250000)
|
|
check = -250000;
|
|
elseif (check > 250000)
|
|
check = 250000;
|
|
end;
|
|
|
|
str = sprintf('%06d',abs(check)); % abs needed so that no +&- in neg numbers
|
|
|
|
if(check < 0)
|
|
newstr = strcat('-',str);
|
|
else
|
|
newstr = strcat('+',str);
|
|
end;
|
|
% end formatting ---------- --------------------------------------------
|
|
fprintf(s,'B');
|
|
fprintf(s, newstr );
|
|
|
|
|
|
|
|
% --- Executes on slider movement.
|
|
function slider1_Callback(hObject, eventdata, handles)
|
|
% hObject handle to slider1 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
sliderVal = get(hObject,'Value'); set(handles.edit10,'string', sliderVal );
|
|
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function slider1_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to slider1 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: slider controls usually have a light gray background.
|
|
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
|
|
set(hObject,'BackgroundColor',[.9 .9 .9]);
|
|
end
|
|
set(hObject,'Max',250000,'Min',-250000)
|
|
|
|
|
|
% --- Executes on button press in pushbutton5.
|
|
function pushbutton5_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton5 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s; fprintf(s, 'N'); fprintf(s, '0000000');
|
|
|
|
|
|
function edit11_Callback(hObject, eventdata, handles)
|
|
% hObject handle to edit11 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hints: get(hObject,'String') returns contents of edit11 as text
|
|
% str2double(get(hObject,'String')) returns contents of edit11 as a double
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function edit11_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to edit11 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: edit controls usually have a white background on Windows.
|
|
% See ISPC and COMPUTER.
|
|
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
|
|
set(hObject,'BackgroundColor','white');
|
|
end
|
|
|
|
|
|
% --- Executes on button press in pushbutton6.
|
|
function pushbutton6_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton6 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s;
|
|
% format the number properly --------------------------------------------
|
|
str = get(handles.edit11,'string'); check = str2double(str);
|
|
% ensure that too big values dont go in
|
|
if (check < -250000)
|
|
check = -250000;
|
|
elseif (check > 250000)
|
|
check = 250000;
|
|
end;
|
|
|
|
str = sprintf('%06d',abs(check)); % abs needed so that no +&- in neg numbers
|
|
|
|
if(check < 0)
|
|
newstr = strcat('-',str);
|
|
else
|
|
newstr = strcat('+',str);
|
|
end;
|
|
% end formatting ---------- --------------------------------------------
|
|
fprintf(s,'N'); fprintf(s, newstr );
|
|
|
|
% --- Executes on slider movement.
|
|
function slider2_Callback(hObject, eventdata, handles)
|
|
% hObject handle to slider2 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
sliderVal = sprintf('%06d',get(hObject,'Value'));
|
|
set(handles.edit11,'string', sliderVal );
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function slider2_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to slider2 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: slider controls usually have a light gray background.
|
|
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
|
|
set(hObject,'BackgroundColor',[.9 .9 .9]);
|
|
end
|
|
|
|
|
|
% --- Executes on button press in pushbutton7.
|
|
function pushbutton7_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton7 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s; fprintf(s, 'M'); fprintf(s, '0000000');
|
|
|
|
|
|
function edit12_Callback(hObject, eventdata, handles)
|
|
% hObject handle to edit12 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hints: get(hObject,'String') returns contents of edit12 as text
|
|
% str2double(get(hObject,'String')) returns contents of edit12 as a double
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function edit12_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to edit12 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: edit controls usually have a white background on Windows.
|
|
% See ISPC and COMPUTER.
|
|
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
|
|
set(hObject,'BackgroundColor','white');
|
|
end
|
|
|
|
|
|
% --- Executes on button press in pushbutton8.
|
|
function pushbutton8_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton8 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s;
|
|
% format the number properly --------------------------------------------
|
|
str = get(handles.edit12,'string'); check = str2double(str);
|
|
% ensure that too big values dont go in
|
|
if (check < -50000)
|
|
check = -50000;
|
|
elseif (check > 250000)
|
|
check = 250000;
|
|
end;
|
|
|
|
str = sprintf('%06d',abs(check)); % abs needed so that no +&- in neg numbers
|
|
|
|
if(check < 0)
|
|
newstr = strcat('-',str);
|
|
else
|
|
newstr = strcat('+',str);
|
|
end;
|
|
% end formatting ---------- --------------------------------------------
|
|
fprintf(s,'M'); fprintf(s, newstr );
|
|
|
|
% --- Executes on slider movement.
|
|
function slider3_Callback(hObject, eventdata, handles)
|
|
% hObject handle to slider3 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
sliderVal = sprintf('%06d',get(hObject,'Value'));
|
|
set(handles.edit12,'string', sliderVal );
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function slider3_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to slider3 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: slider controls usually have a light gray background.
|
|
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
|
|
set(hObject,'BackgroundColor',[.9 .9 .9]);
|
|
end
|
|
|
|
|
|
% --- Executes on button press in pushbutton9.
|
|
function pushbutton9_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton9 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s; vid = handles.vid ; fid=handles.fid; resetbutton=handles.resetbutton;
|
|
set(handles.camwait,'string','Custom area scan started.');
|
|
|
|
tmr = handles.tmr; stop(tmr);
|
|
setslidename = handles.setslidename;
|
|
fprintf(fid, '\r\nStarting area scan...');
|
|
XFoVSize = 1823; YFoVSize = 2323;
|
|
XPulseRate = 38400; YPulseRate = 38400 ;
|
|
Xzadjustdelay = 0.002;
|
|
autoContrTime = 0.1;
|
|
|
|
XImDelay = (XFoVSize / XPulseRate) ;
|
|
YImDelay = (YFoVSize / YPulseRate) ;
|
|
|
|
% send command to Arduino
|
|
fprintf(s,'Z');
|
|
|
|
% get the co-ods
|
|
xA = str2double(handles.xA); xB = str2double(handles.xB);
|
|
yC = str2double(handles.yC); yB = str2double(handles.yB);
|
|
|
|
% logging co-ordinates
|
|
logline = strcat('\r\n Going from X co-od ',handles.xA,' to ',handles.xB);
|
|
fprintf(fid, logline);
|
|
logline = strcat('\r\n Going from Y co-od ',handles.yB,' to ',handles.yC);
|
|
fprintf(fid, logline);
|
|
|
|
% find num of FoV
|
|
numofX = (xB - xA) / XFoVSize;
|
|
numofY = (yC - yB) / YFoVSize;
|
|
|
|
% wait for the scan to begin
|
|
while fscanf(s) ~= 'S'
|
|
end;
|
|
% start counting time
|
|
tic;
|
|
|
|
% NOW TAKING PICTURES
|
|
rowcount = 0;
|
|
filecount = 0;
|
|
|
|
msg = '\r\n Starting image capture ...';
|
|
fprintf(fid, msg);
|
|
|
|
% Dircn = false; %We believe we start from top
|
|
while(rowcount <= numofY)
|
|
while(filecount <= numofX)
|
|
pause(XImDelay);
|
|
snapshot=getsnapshot(vid);
|
|
%enh_snapshot=autocontrast(snapshot);
|
|
filename = strcat(setslidename,'_',num2str(rowcount),'-',num2str(filecount), '.bmp');
|
|
%imwrite(enh_snapshot,filename);
|
|
imwrite(snapshot,filename);
|
|
filecount = filecount + 1;
|
|
end
|
|
% wait for shift by one FoV in Y direction
|
|
filecount = 0;
|
|
pause(YImDelay);
|
|
rowcount = rowcount + 1;
|
|
end
|
|
% display time elapsed
|
|
time_to_scan_area = toc
|
|
%numofY*numofX
|
|
msg = sprintf('\r\nImages captured : %d x %d', numofY,numofX);
|
|
fprintf(fid, msg);
|
|
start(tmr);
|
|
set(handles.camwait,'string','Custom area scan completed.');
|
|
|
|
% --- Executes on button press in pushbutton10.
|
|
function pushbutton10_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton10 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s; vid = handles.vid ; fid=handles.fid; resetbutton=handles.resetbutton;
|
|
tmr = handles.tmr; stop(tmr);
|
|
tic
|
|
setslidename = char(handles.setslidename);
|
|
|
|
set(handles.camwait,'string','Auto WSI started.');
|
|
fprintf(fid, '\r\nAuto WSI started.');
|
|
|
|
XFoVSize = 350; YFoVSize = 450;
|
|
XPulseRate = 3800 ; YPulseRate = 3800 ; % MICRO METER PER SEC
|
|
Xzadjustdelay = 0.002;
|
|
autoContrTime = 0.1;
|
|
XImDelay = (XFoVSize / XPulseRate) * 0.45; % reduction of 60% needed to compensate for MATLAB processing delays
|
|
YImDelay = (YFoVSize / YPulseRate) * 0.45;
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% go home first. Send command and wait for sync
|
|
fprintf(s,'Q');
|
|
while fscanf(s) ~= 'S'
|
|
end;
|
|
|
|
%Af at origin and set this z as zero
|
|
%fullAF(handles,16000); fprintf(s,'L');
|
|
disp('let go');
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% Locations of points :
|
|
% A:
|
|
% B:
|
|
% C:
|
|
% D:
|
|
% E:
|
|
% F:
|
|
% G:
|
|
% H:
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% GoTo POINTS, AF and Store var
|
|
gotoX(50505,handles); gotoY(25250,handles); handles.Avar = fullAF(handles,16000);
|
|
fprintf(s,'E');
|
|
gotoX(126260,handles); handles.Bvar = fullAF(handles,16000);
|
|
fprintf(s,'R');
|
|
gotoX(202020,handles); handles.Cvar = fullAF(handles,16000);
|
|
fprintf(s,'Y');
|
|
|
|
% Update handles structure
|
|
guidata(hObject,handles);
|
|
|
|
% Take another value and find if it is > the smallest of the three. If yes, replace it
|
|
gotoX(166670,handles); gotoY(50505,handles); Xvar = fullAF(handles,16000); YourImage=getsnapshot(vid);
|
|
if( mean(YourImage(:)) < 230)
|
|
bestpoints(hObject,handles, Xvar);
|
|
end
|
|
gotoX(90910,handles); Xvar = fullAF(handles,16000); YourImage=getsnapshot(vid);
|
|
if( mean(YourImage(:)) < 230)
|
|
bestpoints(hObject,handles, Xvar);
|
|
end
|
|
gotoX(50505,handles); gotoY(75750,handles); Xvar =fullAF(handles,16000); YourImage=getsnapshot(vid);
|
|
if( mean(YourImage(:)) < 230)
|
|
bestpoints(hObject,handles, Xvar);
|
|
end
|
|
gotoX(126260,handles); Xvar =fullAF(handles,16000); YourImage=getsnapshot(vid);
|
|
if( mean(YourImage(:)) < 230)
|
|
bestpoints(hObject,handles, Xvar);
|
|
end
|
|
gotoX(202020,handles); Xvar =fullAF(handles,16000); YourImage=getsnapshot(vid);
|
|
if( mean(YourImage(:)) < 230)
|
|
bestpoints(hObject,handles, Xvar);
|
|
end
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
disp('The time for 8 pt AF is');
|
|
toc
|
|
|
|
% now asking Arduino to do WSI
|
|
fprintf(s,'F');
|
|
|
|
% logging co-ordinates
|
|
fprintf(fid, '\r\n Going to Origin and starting WSI ');
|
|
|
|
% find num of FoV
|
|
numofX = 50000 / XFoVSize; numofY = 25000 / YFoVSize;
|
|
|
|
% wait for the scan to begin
|
|
while fscanf(s) ~= 'S'
|
|
disp('waiting');
|
|
end;
|
|
|
|
% NOW TAKING PICTURES
|
|
rowcount = 0;
|
|
filecount = 0;
|
|
|
|
msg = '\r\n Starting image capture ...';
|
|
fprintf(fid, msg);
|
|
|
|
while(rowcount <= numofY)
|
|
while(filecount <= numofX)
|
|
% take image and save
|
|
%pause(XImDelay+Xzadjustdelay+autoContrTime);
|
|
pause(XImDelay);
|
|
snapshot=getsnapshot(vid);
|
|
%enh_snapshot=autocontrast(snapshot);
|
|
filename = strcat(setslidename,'_',num2str(rowcount),'-',num2str(filecount), '.bmp');
|
|
imwrite(snapshot,filename);
|
|
filecount = filecount + 1;
|
|
end
|
|
% wait for shift by one FoV in Y direction
|
|
filecount = 0;
|
|
pause(YImDelay);
|
|
rowcount = rowcount + 1;
|
|
end
|
|
set(handles.camwait,'string','Auto WSI completed.');
|
|
msg = sprintf('\r\nImages captured : %d x %d', numofY,numofX);
|
|
fprintf(fid, msg);
|
|
toc
|
|
|
|
|
|
|
|
function pushtoimage_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushtoimage (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
disp('unused func');
|
|
|
|
% --- Executes on button press in pushbutton11.
|
|
function pushbutton11_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton11 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s;
|
|
xA = get(handles.currxpos,'string'); handles.xA = xA;
|
|
yA = get(handles.currypos,'string'); handles.yA = yA;
|
|
zA = get(handles.currzpos,'string'); handles.zA = zA;
|
|
data = strcat(xA,' , ',yA,' , ',zA); set(handles.xyzA,'string',data);
|
|
fprintf(s,'E');
|
|
guidata(hObject, handles);
|
|
|
|
|
|
% --- Executes on button press in pushbutton12.
|
|
function pushbutton12_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton12 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s;
|
|
|
|
xB = get(handles.currxpos,'string'); handles.xB = xB;
|
|
yB = get(handles.currypos,'string'); handles.yB = yB;
|
|
zB = get(handles.currzpos,'string'); handles.zB = zB;
|
|
|
|
data = strcat(xB,',',yB,',',zB); set(handles.xyzB,'string',data);
|
|
|
|
% send command that sets pt B in Arduino
|
|
fprintf(s,'R'); guidata(hObject, handles);
|
|
|
|
% --- Executes on button press in pushD.
|
|
function pushD_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushD (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s;
|
|
|
|
xD = get(handles.currxpos,'string'); handles.xD = xD;
|
|
yD = get(handles.currypos,'string'); handles.yD = yD;
|
|
zD = get(handles.currzpos,'string'); handles.zD = zD;
|
|
|
|
data = strcat(xD,',',yD,',',zD); set(handles.xyzD,'string',data);
|
|
|
|
% send command that sets pt D in Arduino
|
|
fprintf(s,'U'); guidata(hObject, handles);
|
|
|
|
% --- Executes on button press in pushC.
|
|
function pushC_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushC (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s;
|
|
|
|
xC = get(handles.currxpos,'string'); handles.xC = xC;
|
|
yC = get(handles.currypos,'string'); handles.yC = yC;
|
|
zC = get(handles.currzpos,'string'); handles.zC = zC;
|
|
|
|
data = strcat(xC,',',yC,',',zC); set(handles.xyzC,'string',data);
|
|
|
|
% send command that sets pt C in Arduino
|
|
fprintf(s,'Y'); guidata(hObject, handles);
|
|
|
|
|
|
function editboxslidename_Callback(hObject, eventdata, handles)
|
|
% hObject handle to editboxslidename (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hints: get(hObject,'String') returns contents of editboxslidename as text
|
|
% str2double(get(hObject,'String')) returns contents of editboxslidename as a double
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function editboxslidename_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to editboxslidename (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: edit controls usually have a white background on Windows.
|
|
% See ISPC and COMPUTER.
|
|
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
|
|
set(hObject,'BackgroundColor','white');
|
|
end
|
|
|
|
|
|
% --- Executes on button press in pushbutton15.
|
|
function pushbutton15_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton15 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
newName = get(handles.editboxslidename,'string');
|
|
handles.setslidename = newName;
|
|
|
|
% Update handles structure
|
|
guidata(hObject, handles);
|
|
|
|
% --- Executes on button press in pushbutton16.
|
|
function pushbutton16_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton16 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
vid = handles.vid;
|
|
% calc var
|
|
newimg = double(getsnapshot(vid)); newvar=var(newimg(:));
|
|
%disp on the window
|
|
set(handles.var_disp,'string',newvar);
|
|
|
|
% --- Executes on button press in pushbutton17.
|
|
function pushbutton17_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton17 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
vid = handles.vid; s = handles.s;
|
|
% Move Z up
|
|
fprintf(s,'T');
|
|
% calc var
|
|
newimg = double(getsnapshot(vid)); newvar=var(newimg(:));
|
|
%disp on the window
|
|
set(handles.var_disp,'string',newvar);
|
|
|
|
% --- Executes on button press in pushbutton18.
|
|
function pushbutton18_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton18 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
vid = handles.vid; s = handles.s;
|
|
% Move Z down
|
|
fprintf(s,'G');
|
|
% calc var
|
|
newimg = double(getsnapshot(vid)); newvar=var(newimg(:));
|
|
%disp on the window
|
|
set(handles.var_disp,'string',newvar);
|
|
|
|
% --- Executes on button press in pushbutton19.
|
|
function pushbutton19_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton19 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
vid=handles.vid;
|
|
snapshot=getsnapshot(vid);
|
|
% % enh_snapshot=autocontrast(snapshot);
|
|
imwrite(snapshot,'snap.jpg');
|
|
|
|
% --- Executes on button press in pushbutton20.
|
|
function pushbutton20_Callback(hObject, eventdata, handles)
|
|
% this is the debug code
|
|
% hObject handle to pushbutton20 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s; src = handles.src; vid=handles.vid; tmr = handles.tmr;
|
|
|
|
stop(tmr);
|
|
|
|
setslidename = '1kFS_point6_';
|
|
set(handles.camwait,'string','Starting Focal stack acquisition');
|
|
% take a focal stack
|
|
currzpos = str2double(get(handles.currzpos,'string'))
|
|
stackcount=500; filecount=0;
|
|
|
|
% take FS going -Z (down)
|
|
while(filecount <= stackcount)
|
|
snapshot=getsnapshot(vid);
|
|
filename = strcat(setslidename,'_down_',num2str(filecount), '.jpg');
|
|
imwrite(snapshot,filename);
|
|
filecount = filecount + 1;
|
|
|
|
newZ = currzpos - (10*filecount) ;
|
|
if(newZ < 0)
|
|
newZ = strcat('-',sprintf('%06d',abs(newZ )));
|
|
else
|
|
newZ = strcat('+',sprintf('%06d',abs(newZ )));
|
|
end;
|
|
fprintf(s,'M'); fprintf(s, newZ ); pause(0.1);
|
|
end
|
|
|
|
% return to home
|
|
newZ = currzpos
|
|
if(newZ < 0)
|
|
newZ = strcat('-',sprintf('%06d',abs(newZ )));
|
|
else
|
|
newZ = strcat('+',sprintf('%06d',abs(newZ )));
|
|
end;
|
|
fprintf(s,'M'); fprintf(s, newZ ); pause(1);
|
|
filecount=0;
|
|
|
|
% take FS going +Z (up)
|
|
while(filecount <= stackcount)
|
|
snapshot=getsnapshot(vid);
|
|
filename = strcat(setslidename,'_up_',num2str(filecount), '.jpg');
|
|
imwrite(snapshot,filename);
|
|
filecount = filecount + 1;
|
|
|
|
newZ = currzpos + (10*filecount) ;
|
|
if(newZ < 0)
|
|
newZ = strcat('-',sprintf('%06d',abs(newZ )));
|
|
else
|
|
newZ = strcat('+',sprintf('%06d',abs(newZ )));
|
|
end;
|
|
fprintf(s,'M'); fprintf(s, newZ ); pause(0.1);
|
|
end
|
|
|
|
set(handles.camwait,'string','Focal stack acquisition completed');
|
|
start(tmr);
|
|
return;
|
|
|
|
|
|
|
|
% --- Executes on button press in pushbutton21.
|
|
function pushbutton21_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton21 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s; fprintf(s,'W');
|
|
|
|
% --- Executes on button press in pushbutton22.
|
|
function pushbutton22_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton22 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s; fprintf(s,'S');
|
|
|
|
% --- Executes on button press in pushbutton23.
|
|
function pushbutton23_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton23 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s; fprintf(s,'D');
|
|
|
|
% --- Executes on button press in pushbutton24.
|
|
function pushbutton24_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pushbutton24 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s; fprintf(s,'A');
|
|
|
|
% --- Executes when user attempts to close figure1.
|
|
function figure1_CloseRequestFcn(hObject, eventdata, handles)
|
|
% hObject handle to figure1 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
% Hint: delete(hObject) closes the figure
|
|
delete(hObject);
|
|
|
|
|
|
function [] = query_X(handles)
|
|
s = handles.s; fwrite(s,'I'); data = fgetl(s);
|
|
|
|
if(data == 'X')
|
|
set(handles.currxpos,'string',fgetl(s));
|
|
else
|
|
data = fgetl(s); disp(sprintf('not X data - %s',data));
|
|
end
|
|
|
|
function [] = query_Y(handles)
|
|
s = handles.s; fwrite(s,'O'); data = fgetl(s);
|
|
|
|
if(data == 'Y')
|
|
set(handles.currypos,'string',fgetl(s));
|
|
else
|
|
data = fgetl(s); disp(sprintf('not Y data - %s',data));
|
|
end
|
|
|
|
function [] = query_Z(handles)
|
|
s = handles.s; fwrite(s,'P'); data = fgetl(s);
|
|
|
|
if(data == 'Z')
|
|
set(handles.currzpos,'string',fgetl(s));
|
|
else
|
|
data = fgetl(s); disp(sprintf('not Y data - %s',data));
|
|
end
|
|
|
|
|
|
|
|
% AUTOCONTRAST Automatically adjusts contrast of images to optimum level.
|
|
% e.g. autocontrast('Sunset.jpg','Output.jpg')
|
|
|
|
function output_img = autocontrast(input_img)
|
|
|
|
low_limit=0.004;
|
|
up_limit=0.995;
|
|
img=input_img;
|
|
[m1 n1 r1]=size(img);
|
|
img=double(img);
|
|
%--------------------calculation of vmin and vmax----------------------
|
|
for k=1:r1
|
|
arr=sort(reshape(img(:,:,k),m1*n1,1));
|
|
v_min(k)=arr(ceil(low_limit*m1*n1));
|
|
v_max(k)=arr(ceil(up_limit*m1*n1));
|
|
end
|
|
%----------------------------------------------------------------------
|
|
if r1==3
|
|
v_min=rgb2ntsc(v_min);
|
|
v_max=rgb2ntsc(v_max);
|
|
end
|
|
%----------------------------------------------------------------------
|
|
img=(img-v_min(1))/(v_max(1)-v_min(1));
|
|
output_img = uint8(img.*255);
|
|
|
|
|
|
|
|
function gotoX(check,handles)
|
|
s=handles.s;
|
|
%%%%%%% check if Arduino is responsive and if not, wait %%%%%%
|
|
fprintf(s,'7'); while fscanf(s) ~= '7'
|
|
end
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
str = sprintf('%06d',abs(check)); % abs needed so that no +&- in neg numbers
|
|
% ensure that too big values dont go in
|
|
if (check < -750000) check = -750000;
|
|
elseif (check > 750000) check = 750000;
|
|
end;
|
|
|
|
if(check < 0)
|
|
newstr = strcat('-',str);
|
|
else
|
|
newstr = strcat('+',str);
|
|
end;
|
|
% end formatting ---------- --------------------------------------------
|
|
fprintf(s,'B'); fprintf(s, newstr );
|
|
|
|
function gotoY(check,handles)
|
|
s=handles.s;
|
|
%%%%%%% check if Arduino is responsive and if not, wait %%%%%%
|
|
fprintf(s,'7'); while fscanf(s) ~= '7'
|
|
end
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
str = sprintf('%06d',abs(check)); % abs needed so that no +&- in neg numbers
|
|
% ensure that too big values dont go in
|
|
if (check < -750000) check = -750000;
|
|
elseif (check > 750000) check = 750000;
|
|
end;
|
|
|
|
if(check < 0)
|
|
newstr = strcat('-',str);
|
|
else
|
|
newstr = strcat('+',str);
|
|
end;
|
|
% end formatting ---------- --------------------------------------------
|
|
fprintf(s,'N'); fprintf(s, newstr );
|
|
|
|
function gotoZ(check,handles)
|
|
s=handles.s;
|
|
%%%%%%% check if Arduino is responsive and if not, wait %%%%%%
|
|
fprintf(s,'7'); while fscanf(s) ~= '7'
|
|
end
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
str = sprintf('%06d',abs(check)); % abs needed so that no +&- in neg numbers
|
|
% ensure that too big values dont go in
|
|
if (check < -30000) check = -30000;
|
|
elseif (check > 30000) check = 30000;
|
|
end;
|
|
|
|
if(check < 0)
|
|
newstr = strcat('-',str);
|
|
else
|
|
newstr = strcat('+',str);
|
|
end;
|
|
% end formatting ---------- --------------------------------------------
|
|
fprintf(s,'M'); fprintf(s, newstr ); pause(0.035);
|
|
|
|
|
|
function [currmaxvar] = fullAF(handles,travel)
|
|
tmr=handles.tmr;
|
|
toTurnOnOrNot=1;
|
|
if strcmp(get(tmr,'Running'),'off')
|
|
toTurnOnOrNot=0;
|
|
else
|
|
stop(tmr);
|
|
end
|
|
|
|
%tic
|
|
set(handles.camwait,'string','Autofocus in progress...');
|
|
vid=handles.vid; fid=handles.fid;
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% CRUDE AF.
|
|
Z_travel_for_crude = travel; crude_step_count = 200;
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
crude_pulse_count = Z_travel_for_crude / crude_step_count;
|
|
crude_curr_var=0; crude_max_var=0; crude_loc_max_var=0;
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% go to starting Z loc (we've hit limit switch via arduino already so its z=0)
|
|
crude_start_loc = str2double(get(handles.currzpos,'string')) - (Z_travel_for_crude/2);
|
|
gotoZ(crude_start_loc,handles); pause(0.2);
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% now keep going up and taking var
|
|
crude_curr_loc = crude_start_loc;
|
|
|
|
for i=1: crude_pulse_count
|
|
% variance
|
|
crude_img = double(getsnapshot(vid)); crude_curr_var=var(crude_img(:));
|
|
|
|
if (crude_curr_var > crude_max_var)
|
|
crude_max_var = crude_curr_var;
|
|
crude_loc_max_var = crude_curr_loc;
|
|
end
|
|
% update loc
|
|
crude_curr_loc = crude_curr_loc + crude_step_count ;
|
|
gotoZ(crude_curr_loc,handles);
|
|
end
|
|
gotoZ(crude_loc_max_var,handles);
|
|
pause(1);
|
|
%snapshot=getsnapshot(vid); imwrite(snapshot,'aftercrude.bmp');
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% fINECRUDE AF.
|
|
Z_travel_for_crude = 2000; crude_step_count = 50;
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
crude_pulse_count = Z_travel_for_crude / crude_step_count;
|
|
crude_curr_var=0; crude_max_var=0;
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% go to starting Z loc (we've hit limit switch via arduino already so its z=0)
|
|
crude_start_loc = crude_loc_max_var - (Z_travel_for_crude/2);
|
|
gotoZ(crude_start_loc,handles); pause(0.2);
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% now keep going up and taking var
|
|
crude_curr_loc = crude_start_loc;
|
|
|
|
for i=1: crude_pulse_count
|
|
% variance
|
|
crude_img = double(getsnapshot(vid)); crude_curr_var=var(crude_img(:));
|
|
|
|
if (crude_curr_var > crude_max_var)
|
|
crude_max_var = crude_curr_var;
|
|
crude_loc_max_var = crude_curr_loc;
|
|
end
|
|
% update loc
|
|
crude_curr_loc = crude_curr_loc + crude_step_count ;
|
|
gotoZ(crude_curr_loc,handles);
|
|
end
|
|
gotoZ(crude_loc_max_var,handles);
|
|
pause(1);
|
|
%snapshot=getsnapshot(vid); imwrite(snapshot,'afterfinecrude.bmp');
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% The fine AF begins here
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
Ztotaltravel = 200; final_go_backpulses = 0 ;
|
|
currZ = crude_loc_max_var;
|
|
|
|
% first go above
|
|
start_above_loc = currZ - (Ztotaltravel/2);
|
|
gotoZ(start_above_loc,handles);
|
|
pause(1);
|
|
% now build the var array
|
|
localAF_loc_array = zeros(1,Ztotaltravel); localAF_var_array = zeros(1,Ztotaltravel);
|
|
localAF_curr_loc = start_above_loc;
|
|
for q=1:(Ztotaltravel/5)
|
|
% location
|
|
localAF_loc_array(q) = localAF_curr_loc;
|
|
% variance
|
|
localAF_img = double(getsnapshot(vid)); localAF_var_array(q)=var(localAF_img(:));
|
|
|
|
% move and update loc
|
|
localAF_curr_loc = localAF_curr_loc + 5; gotoZ(localAF_curr_loc,handles);
|
|
end
|
|
|
|
% Finally go to the max var location
|
|
index_of_max_var = find(localAF_var_array == max(localAF_var_array));
|
|
loc_of_max_var = localAF_loc_array(index_of_max_var) - final_go_backpulses ;
|
|
|
|
gotoZ(loc_of_max_var,handles);
|
|
fprintf(fid,'\r\nCrude/Fine AF (var): %d / %d (%d)',crude_loc_max_var,loc_of_max_var,max(localAF_var_array));
|
|
currmaxvar = max(localAF_var_array) ;
|
|
% toc % loc_of_max_var
|
|
set(handles.camwait,'string','AF done.');
|
|
|
|
if toTurnOnOrNot ==1
|
|
start(tmr);
|
|
end
|
|
pause(1);
|
|
|
|
|
|
|
|
% --- Executes on button press in resetbutton.
|
|
function resetbutton_Callback(hObject, eventdata, handles)
|
|
% hObject handle to resetbutton (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
s = handles.s; tmr=handles.tmr; resetbutton=handles.resetbutton;
|
|
set(resetbutton,'enable','off');
|
|
set(handles.camwait,'string','System resetting...');
|
|
stop(tmr);
|
|
fclose(s); fopen(s);
|
|
pause(2);
|
|
fprintf(s,'Q');
|
|
while fscanf(s) ~= 'S'
|
|
end;
|
|
start(tmr);
|
|
set(handles.camwait,'string','system at home location.');
|
|
set(resetbutton,'enable','on');
|
|
return;
|
|
|
|
|
|
% --- Executes during object deletion, before destroying properties.
|
|
function figure1_DeleteFcn(hObject, eventdata, handles)
|
|
% hObject handle to figure1 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
if ~isempty(instrfind)
|
|
fclose(instrfind);
|
|
delete(instrfind);
|
|
end
|
|
|
|
try
|
|
stop(tmr);
|
|
fid=handles.fid; fclose(fid);
|
|
vid = handles.vid; stoppreview(vid); delete(vid);
|
|
catch
|
|
clear all;
|
|
clc;
|
|
end
|
|
|
|
%s=handles.s; fclose(s); delete(s);
|
|
disp('Killed all before exiting');
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function figure1_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to figure1 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
|
|
function [] = bestpoints(hObject,handles,Xvar)
|
|
handles = guidata(hObject);
|
|
s=handles.s;
|
|
Avar = handles.Avar; Bvar = handles.Bvar; Cvar = handles.Cvar;
|
|
if ((Cvar < Bvar) && (Cvar < Avar))
|
|
if ( Xvar > Cvar)
|
|
fprintf(s,'Y');
|
|
handles.Cvar = Xvar;
|
|
disp('changed C');
|
|
end
|
|
end
|
|
if ((Avar < Bvar) && (Avar < Cvar))
|
|
if ( Xvar > Avar)
|
|
fprintf(s,'E');
|
|
handles.Avar = Xvar;
|
|
disp('changed A');
|
|
end
|
|
end
|
|
if ((Bvar < Avar) && (Bvar < Cvar))
|
|
if ( Xvar > Bvar)
|
|
fprintf(s,'R');
|
|
handles.Bvar = Xvar;
|
|
handles.Bvar
|
|
disp('changed B');
|
|
end
|
|
end
|
|
|
|
%update handles
|
|
guidata(hObject, handles);
|