Error using second . Invalid date/time class. (I am working on guide)

5 views (last 30 days)
I am trying to record time everytime the mouse cursor crosses a certain region but i am experiencing issues.
function varargout = Hapticfinal(varargin)
% HAPTICFINAL MATLAB code for Hapticfinal.fig
% HAPTICFINAL, by itself, creates a new HAPTICFINAL or raises the existing
% singleton*.
%
% H = HAPTICFINAL returns the handle to a new HAPTICFINAL or the handle to
% the existing singleton*.
%
% HAPTICFINAL('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in HAPTICFINAL.M with the given input arguments.
%
% HAPTICFINAL('Property','Value',...) creates a new HAPTICFINAL or raises the
% existing singleton*. Starting from the left, property value pairs are
% handleslied to the GUI before Hapticfinal_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property handleslication
% stop. All inputs are passed to Hapticfinal_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 Hapticfinal
% Last Modified by GUIDE v2.5 17-Feb-2022 21:51:18
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @Hapticfinal_OpeningFcn, ...
'gui_OutputFcn', @Hapticfinal_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
% --- Executes just before Hapticfinal is made visible.
function Hapticfinal_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 Hapticfinal (see VARARGIN)
% Choose default command line output for Hapticfinal
handles.output = hObject;
% Plot patch on uiaxes
%hold on
% Read experiment data from a CSV file
load_folder = "C:\Users\Hp\Desktop\thesis\excel_data\";
load_name = "excel_data.xlsx";
load_addr = load_folder + load_name;
handles.T = readtable(load_addr,'NumHeaderLines',1);
handles.exp_counter = 1;
handles.v_thickness_1 = handles.T.Var1;
handles.v_thickness_2 = handles.T.Var2;
handles.h_thickness_1 = handles.T.Var3;
handles.h_thickness_2 = handles.T.Var4;
handles.amplitude_array = handles.T.Var5;
handles.v_or_h_array = handles.T.Var6;
handles.v_thick1 = handles.v_thickness_1(handles.exp_counter);
handles.v_thick2 = handles.v_thickness_2(handles.exp_counter);
handles.h_thick1 = handles.h_thickness_1(handles.exp_counter);
handles.h_thick2 = handles.h_thickness_2(handles.exp_counter);
handles.v_or_h = handles.v_or_h_array(handles.exp_counter);
handles.region1 = [];
%
% % Create the Arduino serial object
% handles.arduinoObj = serialport("COM6", 9600);
% configureTerminator(handles.arduinoObj,"CR/LF");
% %flush(handles.arduinoObj);
% %
% for i=1:8
% handles.message = readline(handles.arduinoObj);
% disp(handles.message)
% end
create_patch(handles);
% Update handles structure
%guidata(hObject, handles);
% UIWAIT makes Hapticfinal wait for user response (see UIRESUME)
% uiwait(handles.finger);
function create_patch(handles)
if ishandle(handles.region1)
delete(handles.region1);
end
v_or_h = handles.v_or_h_array(handles.exp_counter);
if v_or_h == 0 % Vertical line
v_thick1 = handles.v_thickness_1(handles.exp_counter);
v_thick2 = handles.v_thickness_2(handles.exp_counter);
handles.region1 = patch( ...
'Parent',handles.axes1, ...
'XData',[v_thick1 v_thick2 v_thick2 v_thick1], ...
'YData',[-10 -10 10 10], ...
'FaceColor','red');
set(handles.axes1,'XLim',[-5 0],'YLim',[-10 10]);
else % Horizontal line
h_thick1 = handles.h_thickness_1(handles.exp_counter);
h_thick2 = handles.h_thickness_2(handles.exp_counter);
handles.region1 = patch( ...
'Parent',handles.axes1, ...
'XData',[-10 10 10 -10], ...
'YData',[h_thick1 h_thick1 h_thick2 h_thick2], ...
'FaceColor','red');
set(handles.axes1,'XLim',[0 5],'XLim',[-10 10]);
end
set(handles.axes1,'XGrid','on','YGrid','on');
axis(handles.axes1,'equal');
% Update handles structure
guidata(handles.finger,handles);
% call the button motion fcn to update the new patch's color:
finger_WindowButtonMotionFcn(handles.finger);
% --- Outputs from this function are returned to the command line.
function varargout = Hapticfinal_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 on mouse motion over figure - except title and menu.
function finger_WindowButtonMotionFcn(hObject,~, handles)
% hObject handle to finger (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles = guidata(hObject);
pos = get(hObject, 'currentpoint'); % get mouse location on figure
global x;
global y;
x = pos(1);
y = pos(2); % assign locations to x and y
set(handles.xloc, 'string', ['x loc:' num2str(x)]); % update text for x loc
set(handles.yloc, 'string', ['y loc:' num2str(y)]); % update text for y loc
% Determine if mouse is within the region
p_x = get(handles.region1,'XData');
p_x = p_x([1 2]);
p_y = get(handles.region1,'YData');
p_y = p_y([1 3]);
ax_xl = get(handles.axes1,'XLim');
ax_yl = get(handles.axes1,'YLim');
ax_units = get(handles.axes1,'Units');
if ~strcmp(ax_units,'pixels')
set(handles.axes1,'Units','pixels')
end
ax_pos = get(handles.axes1,'Position'); % axes1 position in pixels
if ~strcmp(ax_units,'pixels')
set(handles.axes1,'Units',ax_units);
end
% convert the patch XData and YData from axes coordinates to figure coordinates in pixels
p_x = (p_x-ax_xl(1))/(ax_xl(2)-ax_xl(1))*ax_pos(3)+ax_pos(1);
p_y = (p_y-ax_yl(1))/(ax_yl(2)-ax_yl(1))*ax_pos(4)+ax_pos(2);
persistent timein
if x >= p_x(1) && x <= p_x(2) && y >= p_y(1) && y <= p_y(2)
timein = datetime('now');
set(handles.region1,'FaceColor','g');
%writeline(handles.arduinoObj, "4&MOTOR_1_2_3_4&0!");
else
timeInPatch = second(datetime('now')-timein); %%THE iSSUE SEEMS TO COME FROM THIS LINE
ax = ancestor(handles.region1, 'axes');
cp = ax.CurrentPoint;
text(ax, 0.52, cp(1,2), sprintf('%.3f sec.', timeInPatch), ...
'HorizontalAlignment','Left', ...
'VerticalAlignment','bottom', ...
'FontSize', 12, ...
'FontWeight', 'bold', ...
'Color', 'b')
set(handles.region1,'FaceColor','r');
%writeline(handles.arduinoObj, "0&MOTOR_1_2_3_4&0!");
end
% Create the Arduino serial object
%handles.arduinoObj = serialport("COM3", 9600);
%configureTerminator(handles.arduinoObj,"CR/LF");
%flush(handles.arduinoObj);
%
%%for i=1:8
%handles.message = readline(handles.arduinoObj);
%disp(handles.message)
%end
% --- Executes on button press in Start_button.
%function Start_button_Callback(hObject, eventdata, handles)
% --- Executes on button press in Start_button.
function Start_button_Callback(hObject, eventdata, handles)
% hObject handle to Start_button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%clear
%clc
handles.fileID = fopen('exp.txt','w');
handles.t = timer('ExecutionMode', 'fixedRate', ...
'Period', 0.5, ...
'TasksToExecute', Inf, ...
'TimerFcn', {@timerCallback, handles.fileID});
start(handles.t);
set(handles.Start_button,'Enable','off'); % -> Disable the button
guidata(hObject,handles);% -----> do this to save the updated handles object
function timerCallback(~,~,fileID)
fprintf(fileID,'(X, Y, time) = (%g, %g, %s)\n', get(0, 'PointerLocation'), datetime('now'));
fprintf('calling timer callback\n');
% --- Executes on button press in Stop_button.
function Stop_button_Callback(hObject, eventdata, handles)
% hObject handle to Stop_button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles = guidata(hObject);
stop(handles.t) %whenever we want to stop.
fclose(handles.fileID);
set(handles.Start_button,'Enable','on'); % -> Enable the button
guidata(hObject,handles);
% --- Executes on button press in Yes_button.
function Yes_button_Callback(hObject, eventdata, handles)
% hObject handle to Yes_button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
answer = questdlg('ARE YOU SURE?','Confirm close',...
'OK',@(src,event)mycallback(handles,src,event));
clear
clc
fileID= fopen('exp.txt2','a');
YES = "I FEEL IT";
fprintf (fileID, "%s\n",YES);
fclose(fileID);
% --- Executes on button press in NO_button.
function NO_button_Callback(hObject, ~, handles)
% hObject handle to NO_button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
answer1= questdlg('ARE YOU SURE?','Confirm Close',...
'OK',@(src,event)mycallback(handles,src,event));
clear
clc
fileID= fopen('exp.txt2','a');
NO = "I DON'T FEEL IT";
fprintf (fileID, "%s\n",NO);
fclose(fileID);
% --- Executes on button press in Next_button.
function Next_button_Callback(hObject, eventdata, handles)
% hObject handle to Next_button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)uiconfirm(handles.UIFigure,'Are You sure?','Confirm Close',...
handles = guidata(hObject);
f = msgbox('Operation Completed','NEXT');
% Read experiment data from a CSV file
% region1 = patch(axes1,[-10 10 10 -10],[-5 -5 -4.4 -4.4],'r','FaceAlpha',1,...
%'LineWidth',0.01,'LineStyle','-','tag','region1');
handles.exp_counter = handles.exp_counter + 1;
if handles.exp_counter > numel(handles.v_thickness_1)
return
end
%if ishandle(handles.region1)
%delete(handles.region1);
%end
% delete the old patch and create a new one:
create_patch(handles);
% Create the Arduino serial object
% handles.arduinoObj = serialport("COM3", 9600);
%configureTerminator(handles.arduinoObj,"CR/LF");
%flush(arduinoObj);
%
%for i=1:8
% message = readline(arduinoObj);
%disp(message)
%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)
% --- Executes during object creation, after setting all properties.
function finger_CreateFcn(hObject, eventdata, handles)
% hObject handle to finger (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
  4 Comments
Jan
Jan on 24 Feb 2022
:-) This is a pile of error message. The first one would be enough.
Franck paulin Ludovig pehn Mayo
@Jan yeah...My mistake was not to mention that i commented the error in the code i posted first.

Sign in to comment.

Answers (2)

Jan
Jan on 24 Feb 2022
A bold guess:
persistent timein
if x >= p_x(1) && x <= p_x(2) && y >= p_y(1) && y <= p_y(2)
timein = datetime('now');
set(handles.region1,'FaceColor','g');
else
timeInPatch = second(datetime('now')-timein);
When this function runs the first time and x or y are outside the range defined in the if condition, the value or timein is the empty matrix. datetime('now')-[] is not defined and therefore seconds() cannot work.
What should the value of timein be, if the former condition was not met before? Maybe:
persistent timein;
if isempty(timein)
timein = datetime('now');
end
if x >= ...
  5 Comments
Rik
Rik on 24 Feb 2022
The point is this:
You want to execute timeInPatch = second(datetime('now')-timein);. Unless you really messed things up by defining a variable or custom function with the name datetime, the problem will not be there. It probably is when the output of datetime interacts with timein.
With the dbstop command you have started the debugger. Now you need to find out the value and class of timein at the time of the error. Then you can execute datetime('now')-timein in the command window to see if that matches your expectations.
Franck paulin Ludovig pehn Mayo
@Rik actually , using seconds (with " s") solve the error....But the output it is not what i was expecting. I only want to have the "time in " whenever i cross the region.
See attached file to see the issues.

Sign in to comment.


Stephen23
Stephen23 on 24 Feb 2022
Edited: Stephen23 on 24 Feb 2022
Subtracting a DATETIME object from a DATETIME object, as you do on that line, returns a DURATION object.
However the function SECOND is defined for DATETIME objects only. Thus the error.
The solution is to use SECONDS, which is defined for DURATION objects.
  2 Comments
Franck paulin Ludovig pehn Mayo
@Stephen it worked partially (I am not longer having errors in the command window).... When i was expecting is a lil bit far from the outputs now. See attached...the outputs is all vertical even though i am crossing the region.
I would like just to record the time in seconds whenever i am crossing the region.
Franck paulin Ludovig pehn Mayo
@Adam Danz I am trying to reproduce what you did last year in guide instead of appdesigner see link below.(Show sampling interval). Unfortunateley, i am having another output. see attached please

Sign in to comment.

Categories

Find more on Graphics Object Programming in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!