использование таймера в MATLAB для извлечения системного времени

введите здесь описание изображения!Я использую MATLAB для разработки аналоговых часов. В настоящее время мой код просто отображает (или, скорее, отображает) дизайн часов со стрелками (часы, минуты, секунды) и не тикает. Вот мой код:

function raviClock(h,m,s)
drawClockFace;


%TIMER begins-------
t = timer;
t.ExecutionMode = 'FixedSpacing';  %Use one of the repeating modes
t.Period = 1;                      %Fire on 1 second intervals
t.TimerFcn = @timer_setup;           %When fired, call this function
start(t);
set(gcf,'DeleteFcn',@(~,~)stop(t));
end

function timer_setup(varargin)

format shortg;
timenow = clock;
h = timenow(4);
m = timenow(5);
s = timenow(6);

% hour hand
hours= h + m/60 + s/3600;
hourAngle= 90 - hours*(360/12);

% compute coordinates for pointing end of hour hand and draw it
[xhour, yhour]= polar2xy(0.6, hourAngle);
plot([0 xhour], [0 yhour], 'k-','linewidth',7.4)

% minute hand
mins= m + s/60;
minsAngle= 90 - mins*(360/60);

% compute coordinates for pointing end of minute hand and draw it
[xmins, ymins]= polar2xy(0.75, minsAngle);
plot([0 xmins], [0 ymins], 'r-','linewidth',4)


%second's hand
second = s;
secAngle = 90- second*(360/60);

[xsec, ysec]= polar2xy(0.85, secAngle);
plot([0 xsec], [0 ysec], 'm:','linewidth',2)
%end   % while ends
end

%--------------------------------------------------------

function drawClockFace

%close all          
axis([-1.2 1.2 -1.2 1.2])  
axis square equal
hold on            


theta= 0;
for k= 0:59
    [xX,yY]= polar2xy(1.05,theta);
        plot(xX,yY,'k*')

        [x,y]= polar2xy(0.9,theta);
    if ( mod(k,5)==0 )  % hour mark
        plot(x,y,'<')
    else                % minute mark
        plot(x,y,'r*')
    end
    theta= theta + 360/60;
    end
end

%-----------------------------------------------------------------
function [x, y] = polar2xy(r,theta)

rads= theta*pi/180;  
x= r*cos(rads);
y= r*sin(rads);
end

Это просто получение статических данных значений для аргументов HOUR, MINUTE и SECOND, когда я первоначально вызываю свою функцию. Я попытался использовать следующее в цикле while, но это не очень помогло

format shortg
c=clock
clockData = fix(c)
h = clockData(4)
m = clockData(5)
s = clockData(6)

и передачу h, m и s соответствующим разделам. Я хочу знать, как я могу использовать объекты TIMER и обратные вызовы для извлечения информации [часы, минуты, секунды], чтобы я мог вычислять соответствующие координаты точки в реальном времени, когда часы тикают.


person noobcoder    schedule 31.07.2013    source источник


Ответы (1)


Я бы сделал пару вещей здесь.

Во-первых, вам, вероятно, не нужно передавать входные данные h, m, s, если вы отображаете текущее время. Добавьте это в начало своей функции, чтобы автоматически установить эти переменные.

if nargin == 0
    [~,~,~,h,m,s] = datevec(now);
end

Затем довольно легко использовать время для периодического вызова этой функции. Что-то вроде этого.

t = timer;
t.ExecutionMode = 'FixedSpacing';  %Use one of the repeating modes
t.Period = 1;                      %Fire on 1 second intervals
t.TimerFcn = @(~,~)raviClock;      %When fired, call this function (ignoring 2 inputs)
start(t);                          %GO!

Используйте docsearch timer для подробной документации по объектам таймера. Но приведенный выше код должен помочь вам начать.

Чтобы остановить таймер, запустите

stop(t);

Чтобы остановить таймер при закрытии окна, поместите команду остановки в обратный вызов удаления окна:

set(gcf,'DeleteFcn',@(~,~)stop(t));  %NOte:  Better to explicitly use a figure number, rather than gcf.
person Pursuit    schedule 31.07.2013
comment
Выглядит хорошо. Но есть ли способ остановить таймер, когда окно графика закрыто? Я думаю, если я не остановлю таймер, я, вероятно, буду получать графики снова и снова. - person noobcoder; 01.08.2013
comment
Это, безусловно, дает мне текущее время, но я получаю странное сообщение в MATLAB как «Ошибка при оценке TimerFcn для таймера «таймер-18». Слишком много входных аргументов. ' И это дает мне только текущее время и выдает ошибку, как мне постоянно фиксировать время каждую секунду, чтобы я мог вызывать свою функцию для изменения графика каждую секунду? Обратите внимание, теперь я не передаю никаких аргументов при вызове функции - person noobcoder; 01.08.2013
comment
Попробуй это сейчас. Я немного изменил обратный вызов timerFcn. - person Pursuit; 01.08.2013
comment
Это изменение не сработало. Предыдущий работал и отображал мой график. это изменение, к сожалению, не отображает мой график. Я покажу вам, как выглядит моя фигура, чтобы вы лучше поняли. Я редактирую свой вопрос, чтобы добавить фигуру. Код уже есть. - person noobcoder; 01.08.2013
comment
Я внес следующие изменения в ваш код, чтобы заставить его работать. 1) Добавьте блок if nargin == 0 выше. 2) Настройка таймера должна происходить в отдельной функции (я проверял из командной строки). Как и вы создаете новый таймер каждый раз. 3) Замените исходное timerFcn на t.TimerFcn = @(~,~)raviClock;. Это создает сюжет с часами, которые тикают. - person Pursuit; 01.08.2013
comment
Кроме того, вам необходимо внести дополнительные изменения. 2) Исправьте окно, в котором это происходит, а не перезаписывайте любое окно. 2) Добавьте функцию остановки таймера при закрытии окна (код выше). 3) Удалите объекты рисования из предыдущего вызова. Так как это приводит к тому, что все положения секундной стрелки отображаются одновременно. - person Pursuit; 01.08.2013
comment
Почему-то при изменении таймера call back @(~,~)raviClock; не работает. Можете ли вы внести изменения в мой вопрос, чтобы я лучше его понял? Я пробовал разные способы, чтобы уйти от него, но все напрасно. - person noobcoder; 02.08.2013
comment
Хорошо, я сделал некоторые изменения и сделал другую функцию для установки данных для рук. Но теперь, когда моя вторая рука движется, предыдущее положение руки все еще существует. Есть ли способ стереть предыдущую позицию моей второй руки? Я обновляю свой код в вопросе по мере редактирования - person noobcoder; 02.08.2013
comment
Удалось ли вам изменить время на часах на предыдущее время после использования функции таймера? Я не могу этого сделать. - person Spooferman; 03.08.2013