Info

This question is closed. Reopen it to edit or answer.

How do I make a portion of a GUI code run again even though it is nested in a while loop?

1 view (last 30 days)
I made a code to handle a micro controller unit connected to a conveyor set-up. Most of it works fine but a part of it only activates at the beginning when i press the GUI's "START" button. Although it is nested in a while loop already it doesn't run again and the conveyor it controls stops after the condition is met the first time... here is my code:
if queueSensor == 0
if numel(eggQueue) <= 4
cRamp = 1;
else
cRamp = 0;
end
end
-----------------------------------------------------------------------------
here is the complete START button coding:
while procStat == 1
%send serial data command/request
sReq = sprintf('DCOM_%d%d%d%d',cRamp, cQueue, cSeg, cBlower);
fprintf(s,sReq);
cBlower = 0;
%read serial data
[dummy,count] = fscanf(s,'%c');
if count >= 8
sIdx = strfind(dummy,'DATA_');
if sIdx == 1
%valid data
uRead = sscanf(dummy(6:8),'%u');
queueSensor = uRead(2);
segregatorSensor = uRead(1);
end
end
%process serial data
%get snapshot
data = step(videoDevReader);
lab_Image2 = applycform(im2double(data),cform2);
imshow(data); drawnow;
b = lab_Image2(:,:,3);
bw_image = im2bw(b,0.15);
bw_image = imcomplement(bw_image);
bw_image = imfill(bw_image, 'holes');
bw_labeled = bwlabel(bw_image, 8); % Label each blob so we can make measurements of it
blobMeasurements = regionprops(bw_labeled, bw_image, 'Area');
allBlobAreas = [blobMeasurements.Area]; %get areas
allowableAreaIndexes = (allBlobAreas > 9000) & (allBlobAreas < 30000); % Take the small objects.
keeperIndexes = find(allowableAreaIndexes);
keeperBlobsImage = ismember(bw_labeled, keeperIndexes);
bw_image(~keeperBlobsImage) = 0; % Set all non-keeper pixels to zero.
if numel(keeperIndexes) > 0
if detectionFlag == 0
bw_labeled = bwlabel(bw_image, 8); % Label each blob so we can make measurements of it
blobMeasurements = regionprops(bw_labeled, bw_image, 'Eccentricity');
foundE = [blobMeasurements.Eccentricity];
if numel(foundE) > 0
detectionFlag = 1;
if foundE(1) < eThreshold
eggMatrix = [eggMatrix 2]; %female
eggQueue = [eggQueue 2];
else
eggMatrix = [eggMatrix 1]; %male
eggQueue = [eggQueue 1];
end
end
end
else
detectionFlag = 0;
end
if queueSensor == 0
if numel(eggQueue) <= 4
cRamp = 1;
else
cRamp = 0;
end
end
if segregatorSensor == 0
procQueue = 1;
end
if procQueue == 1
%process queue
procQueue = 0;
cSeg = 0;
sReq = sprintf('DCOM_%d%d%d%d',cRamp, cQueue, cSeg, cBlower);
fprintf(s,sReq);
fscanf(s);
if numel(eggQueue) > 0
if eggQueue(1) == 1
cSeg = 1;
cBlower = 0;
sReq = sprintf('DCOM_%d%d%d%d',cRamp, cQueue, cSeg, cBlower);
fprintf(s,sReq);
fscanf(s);
pause(0.5);
else
cSeg = 0;
cBlower = 1;
sReq = sprintf('DCOM_%d%d%d%d',cRamp, cQueue, cSeg, cBlower);
fprintf(s,sReq);
fscanf(s);
pause(0.5);
cSeg = 1;
end
eggQueue = eggQueue(2:numel(eggQueue));
end
end
maleDuck_idx = find(eggMatrix == 1);
femaleDuck_idx = find(eggMatrix == 2);
maleDuck = numel(maleDuck_idx);
femaleDuck = numel(femaleDuck_idx);
tTimer = toc(handles.start);
set(handles.txtTimer, 'String', sprintf('Total Elapsed Time: %02d:%07.4f',floor(tTimer/60),rem(tTimer,60)));
set(handles.txtCounter_Male,'String', sprintf('Male: %d', maleDuck));
set(handles.txtCounter_Female,'String', sprintf('Female: %d', femaleDuck));
set(handles.txtCounter_Total,'String', sprintf('Total Duck Eggs: %d', maleDuck + femaleDuck));
set(handles.txtCounter_Queue,'String', sprintf('Eggs in Queue: %d', numel(eggQueue)));
drawnow;
end
set(handles.btnStart,'Enable', 'on');
set(handles.btnStop,'Enable', 'off');
sReq = sprintf('DCOM_0000');
fprintf(s,sReq);
pause(1);
fclose(s);
delete(instrfindall);
imaqreset;

Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!