-
Notifications
You must be signed in to change notification settings - Fork 54
/
Copy pathtimebar.m
195 lines (174 loc) · 12.1 KB
/
timebar.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
function h = timebar(message,name,update_rate)
% TIMEBAR Progress bar with estimated time remaining
% H = TIMEBAR('message','name') creates and displays a progress
% bar with alphanumeric progress percentage and estimated time
% time remaining. A user input message ('message') is displayed,
% typically to distinguish what process is being monitored, and
% 'name' is an optional figure name. The figure handle H is
% returned.
%
% TIMEBAR(H,X) will update the length of the progress bar, the
% percentage complete, and the estimated time remaining, where
% X is a fractional progress between 0 (initial) and 1 (complete).
% (Note that the order of H,X is opposite to waitbar.)
%
% TIMEBAR(H,X,RATE) will update the progress bar and information
% at a rate given by RATE in seconds. Default is 0.1 seconds.
%
% The estimated time remaining is linear using the initial time
% (when TIMEBAR is first opened), the current time, and the percent
% complete.
%
% TIMEBAR is typically used inside a FOR loop or during numerical
% simulation. A sample for loop is shown below:
%
% h = timebar('Loop counter','Progress')
% for i = 1:100
% % computation here %
% timebar(h,1/100)
% end
% close(h)
%
% A sample for numerical integration is shown below:
%
% % script file
% t0 = 0;
% tf = 60;
% h = timebar('Simulation integration','Progress')
% [tt,xx] = ode45('states.m',[t0 tf],initial_conditions);
% close(h)
%
% % states.m
% function xdot = states(t,x)
% xdot(1) = ...;
% xdot(2) = ...;
% ...
% timebar(h,(t-t0)/(tf-t0))
%
% Version: 2.0
% Version History:
% 1.0 2002-01-18 Initial release
% 2.0 2002-01-21 Added update rate option
%
% Copyright 2002, Chad English
% cenglish@myrealbox.com
if nargin < 3 % If update rate is not input
update_rate = 0.1; % set it to 0.1 seconds
end
if ~ishandle(message) % If first input is not a timebar handle,
% treat as new timebar
%%%%%%%%%% SET WINDOW SIZE AND POSITION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
winwidth = 300; % Width of timebar window
winheight = 75; % Height of timebar window
screensize = get(0,'screensize'); % User's screen size [1 1 width height]
screenwidth = screensize(3); % User's screen width
screenheight = screensize(4); % User's screen height
winpos = [0.5*(screenwidth-winwidth), ...
0.5*(screenheight-winheight), winwidth, winheight]; % Position of timebar window origin
%%%%%%%% END SET WINDOW SIZE AND POSITION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% OPEN FIGURE AND SET PROPERTIES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if nargin < 2
name = ''; % If timebar name not input, set blank
end
wincolor = 0.75*[1 1 1]; % Define window color
est_text = 'Estimated time remaining: '; % Set static estimated time text
h = figure('menubar','none',... % Turn figure menu display off
'numbertitle','off',... % Turn figure numbering off
'name',name,... % Set the figure name to input name
'position',winpos,... % Set the position of the figure as above
'color',wincolor,... % Set the figure color
'resize','off',... % Turn of figure resizing
'tag','timebar'); % Tag the figure for later checking
userdata.text(1) = uicontrol(h,'style','text',... % Prepare message text (set the style to text)
'pos',[10 winheight-30 winwidth-20 20],... % Set the textbox position and size
'hor','center',... % Center the text in the textbox
'backgroundcolor',wincolor,... % Set the textbox background color
'foregroundcolor',0*[1 1 1],... % Set the text color
'string',message); % Set the text to the input message
userdata.text(2) = uicontrol(h,'style','text',... % Prepare static estimated time text
'pos',[10 5 winwidth-20 20],... % Set the textbox position and size
'hor','left',... % Left align the text in the textbox
'backgroundcolor',wincolor,... % Set the textbox background color
'foregroundcolor',0*[1 1 1],... % Set the text color
'string',est_text); % Set the static text for estimated time
userdata.text(3) = uicontrol(h,'style','text',... % Prepare estimated time
'pos',[135 5 winwidth-145 20],... % Set the textbox position and size
'hor','left',... % Left align the text in the textbox
'backgroundcolor',wincolor,... % Set the textbox background color
'foregroundcolor',0*[1 1 1],... % Set the text color
'string',''); % Initialize the estimated time as blank
userdata.text(4) = uicontrol(h,'style','text',... % Prepare the percentage progress
'pos',[winwidth-35 winheight-50 25 20],... % Set the textbox position and size
'hor','right',... % Left align the text in the textbox
'backgroundcolor',wincolor,... % Set the textbox background color
'foregroundcolor',0*[1 1 1],... % Set the textbox foreground color
'string',''); % Initialize the progress text as blank
userdata.axes = axes('parent',h,... % Set the progress bar parent to the figure
'units','pixels',... % Provide axes units in pixels
'pos',[10 winheight-45 winwidth-50 15],... % Set the progress bar position and size
'xlim',[0 1],... % Set the range from 0 to 1
'box','on',... % Turn on axes box (to see where 100% is)
'color',[1 1 1],... % Set plot background color to white
'xtick',[],'ytick',[]); % Turn off axes tick marks and labels
userdata.bar = patch([0 0 0 0 0],[0 1 1 0 0],'r'); % Initialize progress bar to zero area
userdata.time = clock; % Record the current time
userdata.inc = clock; % Set incremental clock to current time
set(h, 'userdata', userdata) % Allow access to the text and axes settings
% by including them with the timebar data
%%%%%%%% END OPEN FIGURE AND SET PROPERTIES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
else % If first input is a timebar handle, update
% the window
%%%%%%%%%% GET HANDLE AND PROGRESS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pause(10e-100) % Message, bar, and static text won't display
% without arbitrary pause (don't know why)
h = message; % Set handle to first input
progress = name; % Set progress to second input
if ~strcmp(get(h,'tag'), 'timebar') % Check object tag to see if it is a timebar
error('Handle is not to a timebar window') % If not a timebar, report error and stop
end
%%%%%%%% END GET HANGLE AND PROGRESS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%% CALCULATE ESTIMATED TIME REMAINING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
userdata = get(h,'userdata'); % Get the userdata included with the timebar
inc = clock-userdata.inc; % Calculate time increment since last update
inc_secs = inc(3)*3600*24 + inc(4)*3600 + ...
inc(5)*60 + inc(6); % Convert the increment to seconds
if [inc_secs > update_rate] | [progress == 1] % Only update at update rate or 100% complete
userdata.inc = clock; % If updating, reset the increment clock
set(h,'userdata',userdata) % Update userdata with the new clock setting
tpast = clock-userdata.time; % Calculate time since timebar initialized
seconds_past = tpast(3)*3600*24 + tpast(4)*3600 + ...
tpast(5)*60 + tpast(6); % Transform passed time into seconds
estimated_seconds = seconds_past*(1/progress-1); % Estimate the time remaining in seconds
hours = floor(estimated_seconds/3600); % Calculate integer hours of estimated time
minutes = floor((estimated_seconds-3600*hours)/60); % Calculate integer minutes of estimated time
seconds = floor(estimated_seconds-3600*hours- ...
60*minutes); % Calculate integer seconds of estimated time
tenths = floor(10*(estimated_seconds - ...
floor(estimated_seconds))); % Calculate tenths of seconds (as integer)
%%%%%%%% END CALCULATE ESTIMATED TIME REMAINING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% UPDATE ESTIMATED TIME AND PROGRESS TO TIMEBAR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if progress > 1 % Check if input progress is > 1
time_message = ' Error! Progress > 1!'; % If >1, print error to estimated time
time_color = 'r'; % in red
else
if hours < 10; h0 = '0'; else h0 = '';end % Put leading zero on hours if < 10
if minutes < 10; m0 = '0'; else m0 = '';end % Put leading zero on minutes if < 10
if seconds < 10; s0 = '0'; else s0 = '';end % Put leading zero on seconds if < 10
time_message = strcat(h0,num2str(hours),':',m0,...
num2str(minutes),':',s0,num2str(seconds),...
'.',num2str(tenths),' (hh:mm:ss.t)'); % Format estimated time as hh:mm:ss.t
time_color = 'k'; % Format estimated time text as black
end
set(userdata.bar,'xdata',[0 0 progress progress 0]) % Update progress bar
set(userdata.text(3),'string',time_message,...
'foregroundcolor',time_color); % Update estimated time
set(userdata.text(4),'string',...
strcat(num2str(floor(100*progress)),'%')); % Update progress percentage
end
%%%%%%%% END UPDATE ESTIMATED TIME AND PROGRESS TO TIMEBAR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
%%%%%%%%%% TIMEBAR HANDLE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if nargout == 0 % If handle not asked for
clear h % do not output it
end
%%%%%%%% END TIMEBAR HANDLE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%