Matlab Class 2 - Rutgers University

Download Report

Transcript Matlab Class 2 - Rutgers University

Matlab Class 7
Hristiyan Kourtev &
Xiaotao Su, Ph.D.
Visual Psychophysicist & IT Group Leader
Rutgers Center for Cognitive Science (RuCCS)
RuCCS
Accurate Timing
• GetSecs is a psychtoolbox function that
provides highly accurate timing.
• It returns the number of seconds since
the machine has started up
• To test precision on your machine,
type:
GetSecsTick
Command Window:
a = GetSecs
GetSecs – a
GetSecs – a
GetSecs – a
GetSecs – a
RuCCS
KbCheck
• KbCheck is used to check if a key is being pressed and to find
out what key is being pressed.
• Returns three values
• [key_press, secs, key_code]=KbCheck
RuCCS
KbCheck
• KbCheck is used to check if a key is being pressed and to find
out what key is being pressed.
• Returns three values
• [key_press, secs, key_code]=KbCheck
1 or 0 depending
on if there was a
key press
Time that this
test took place
(This is from
GetSecs function)
Vector representing all
of the input keys.
Elements in the vector
are set to 1 if pressed or
0 if not
RuCCS
Speed Test Game
disp('NOW!');
%speed_test.m
timer = GetSecs;
%tests your reaction time
while 1
WaitSecs(1);
[key_is_down, secs, key_code] = KbCheck;
disp('Ready?');
if(key_is_down)
num_sec_to_start = rand*5+1;
break
WaitSecs(num_sec_to_start);
end
too_soon = 0;
end
timer = GetSecs;
elapsed_time = secs - timer;
while ((GetSecs-timer)<num_sec_to_start) ...
disp(['Your time was ', num2str(elapsed_time)]);
&& (~too_soon)
[too_soon, secs, keyCode] = KbCheck;
end
if(too_soon)
break;
end
end
if(too_soon)
disp('you pressed the key too early');
else
RuCCS
Task 1
• Make it so if someone presses a key too early, the
program give a message and exits.
(Tip:first remove WaitSecs
•
[key_press, secs, key_code]=KbCheck
1 or 0 depending on if
there was a key press
Time that this test took place
(This is from GetSecs
function)
Vector representing all of the
input keys.
Elements in the vector are set to
1 if pressed or 0 if not
RuCCS
Speed Test Game
disp('NOW!');
%speed_test.m
timer = GetSecs;
%tests your reaction time
while 1
WaitSecs(1);
[key_is_down, secs, key_code] = KbCheck;
disp('Ready?');
if(key_is_down)
num_sec_to_start = rand*5+1;
break
WaitSecs(num_sec_to_start);
end
too_soon = 0;
end
timer = GetSecs;
elapsed_time = secs - timer;
while ((GetSecs-timer)<num_sec_to_start) ...
disp(['Your time was ', num2str(elapsed_time)]);
&& (~too_soon)
[too_soon, secs, keyCode] = KbCheck;
end
if(too_soon)
break;
end
end
if(too_soon)
disp('you pressed the key too early');
else
RuCCS
What key was pressed?
• The third returned value is a vector representing all the keys
with 1’s for pressed keys and zeros for keys that aren’t
pressed
• To find the value of the key, use:
key_name = KbName(key_code);
This will return a string corresponding to that key_code
RuCCS
Simple program to find key mapping names
% get_key_name.m
%find out what the name of the key is
WaitSecs(1);
KbWait;
[key_is_down, secs, key_code] = KbCheck;
name = KbName(key_code);
disp(name);
RuCCS
KbName works the other way around as well
As you have seen:
• key_name = KbName(key_code);
You can also do the following:
• return_key = KbName(‘return’);
• esc_key = KbName(‘esc’);
• up_key = KbName(‘up’);
And this will get you the index of the element in the key_code vector
that corresponds to that key
RuCCS
key_code vector when esc is pressed
esc’s key code is 27
key_code vector:
Values:
Indexes
0
0
(1) (2)
….
0
….
(25) (26) (27) (28)
So, key_code(27) is 1
0
1
0
0
…..
(29) ….
RuCCS
Exit on esc
%exit_on_esc.m
esc_key = KbName('esc');
i = 0;
while 1
i = i+1
[key_is_down, secs, key_code] = KbCheck;
if(key_code(esc_key))
break;
end
end
disp('Good Bye');
RuCCS
Moving Dot
%moving_dot.m
clear all;
screen_setup;
up_key = KbName('up');
down_key = KbName('down');
left_key = KbName('left');
right_key = KbName('right');
esc_key = KbName('esc');
shape = [20, 20, 100, 100];
color = [255, 0, 255];
tic
while toc<10
Screen(window, ‘FillOval', …
color, shape);
flip;
[key_is_down, secs, key_code] …
= KbCheck;
if(key_code(esc_key))
break
end
end
clear screen;
RuCCS
Task 2
• Draw a circle
• Make it so the arrow keys will move the circle
• Make sure the circle cannot go outside of the boundaries of
the screen.
RuCCS
Task 3 - color differentiation (part 1)
1.
2.
Take subject name
screen_setup
–
trial loop (start with 5)
color = [rand*255, rand*255, rand*255]
–
put circles 1-4 on the screen
• one of the four circles will be slightly off (start with +/-50), color from
the others on one of the three color dimensions (randomly chose
dimension); careful that your deviation doesn’t go >255 or <0
• The subject will click on the circle they feel is different
• record data (whatever would be useful)
• if the subject was right in the last loop, the amount the color is off is
cut in half, otherwise, increase by half
3.
save trial data to csv
tip: make a function to determine if the cursor is in a
shape
RuCCS
Task 3 - color differentiation (part 2)
Further additions:
1. allow the subject to press 1 - 4 to select a circle (using
KbCheck)
2. put numbers in the circles
Hint: You need to use the following commands:
Screen('TextFont', window, fontName*);
Screen('TextSize', window, fontSize**);
Screen('DrawText', window, textString, x, y, textColor);
*fontName can be “Arial”, “Verdana” or other
*fontSize can be any number. Start with around 20 and adjust as needed
RuCCS
Deploying Matlab Programs on other machines
•
•
•
•
•
The Matlab Builder/Deploytool – ‘deploytool’
The Matlab Component Runtime (MCR)
Creating a standalone version of a Matlab program (Windows)
Creating a standalone version of a Matlab program (OSX)
The .NET Builder and deploying to the web