mirror of
https://github.com/jspsych/jsPsych.git
synced 2025-05-11 16:18:11 +00:00
siphon plugins into .plugins namespace (#184)
This commit is contained in:
parent
fbc1fa2a9c
commit
77a29acfd7
@ -7,7 +7,7 @@ Creating new plugins is the way to add new kinds of tasks to jsPsych. A task can
|
||||
Plugin files follow a specific template. Adherence to the template is what allows jsPsych to run a plugin without knowing anything about what the plugin is doing. What makes plugins so flexible is that the template imposes very few requirements on the code. Here's what an empty plugin template looks like:
|
||||
|
||||
```
|
||||
jsPsych['plugin-name'] = (function(){
|
||||
jsPsych.plugins['plugin-name'] = (function(){
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -263,7 +263,7 @@ var jsPsych = (function() {
|
||||
var trial_type = parameters.type;
|
||||
if (typeof trial_type == 'undefined') {
|
||||
console.error('Trial level node is missing the "type" parameter. The parameters for the node are: ' + JSON.stringify(parameters));
|
||||
} else if (typeof jsPsych[trial_type] == 'undefined') {
|
||||
} else if (typeof jsPsych.plugins[trial_type] == 'undefined') {
|
||||
console.error('No plugin loaded for trials of type "' + trial_type + '"');
|
||||
}
|
||||
// create a deep copy of the parameters for the trial
|
||||
@ -555,7 +555,7 @@ var jsPsych = (function() {
|
||||
opts.on_trial_start();
|
||||
|
||||
// execute trial method
|
||||
jsPsych[trial.type].trial(DOM_target, trial);
|
||||
jsPsych.plugins[trial.type].trial(DOM_target, trial);
|
||||
}
|
||||
|
||||
function drawProgressBar() {
|
||||
@ -576,6 +576,8 @@ var jsPsych = (function() {
|
||||
return core;
|
||||
})();
|
||||
|
||||
jsPsych.plugins = {};
|
||||
|
||||
jsPsych.data = (function() {
|
||||
|
||||
var module = {};
|
||||
|
@ -5,7 +5,7 @@
|
||||
* documentation: docs.jspsych.org
|
||||
*/
|
||||
|
||||
jsPsych.animation = (function() {
|
||||
jsPsych.plugins.animation = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
**/
|
||||
|
||||
jsPsych["button-response"] = (function() {
|
||||
jsPsych.plugins["button-response"] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
*
|
||||
**/
|
||||
|
||||
jsPsych['call-function'] = (function() {
|
||||
jsPsych.plugins['call-function'] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
**/
|
||||
|
||||
|
||||
jsPsych["categorize-animation"] = (function() {
|
||||
jsPsych.plugins["categorize-animation"] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
**/
|
||||
|
||||
|
||||
jsPsych.categorize = (function() {
|
||||
jsPsych.plugins.categorize = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
*/
|
||||
|
||||
|
||||
jsPsych['free-sort'] = (function() {
|
||||
jsPsych.plugins['free-sort'] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -6,7 +6,7 @@ the plugin will wait of a specified time before it proceeds.
|
||||
documentation: docs.jspsych.org
|
||||
*/
|
||||
|
||||
jsPsych.html = (function() {
|
||||
jsPsych.plugins.html = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
jsPsych.instructions = (function() {
|
||||
jsPsych.plugins.instructions = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
**/
|
||||
|
||||
|
||||
jsPsych["multi-stim-multi-response"] = (function() {
|
||||
jsPsych.plugins["multi-stim-multi-response"] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
|
||||
jsPsych.palmer = (function() {
|
||||
jsPsych.plugins.palmer = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
*/
|
||||
|
||||
|
||||
jsPsych['reconstruction'] = (function() {
|
||||
jsPsych.plugins['reconstruction'] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
jsPsych['same-different'] = (function() {
|
||||
jsPsych.plugins['same-different'] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
|
||||
jsPsych.similarity = (function() {
|
||||
jsPsych.plugins.similarity = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
**/
|
||||
|
||||
jsPsych["single-audio"] = (function() {
|
||||
jsPsych.plugins["single-audio"] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
**/
|
||||
|
||||
|
||||
jsPsych["single-stim"] = (function() {
|
||||
jsPsych.plugins["single-stim"] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
jsPsych['survey-likert'] = (function() {
|
||||
jsPsych.plugins['survey-likert'] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
|
||||
jsPsych['survey-multi-choice'] = (function() {
|
||||
jsPsych.plugins['survey-multi-choice'] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
|
||||
jsPsych['survey-text'] = (function() {
|
||||
jsPsych.plugins['survey-text'] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
jsPsych.text = (function() {
|
||||
jsPsych.plugins.text = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -14,144 +14,162 @@
|
||||
*
|
||||
**/
|
||||
|
||||
jsPsych["visual-search-circle"] = (function() {
|
||||
jsPsych.plugins["visual-search-circle"] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
var plugin = {};
|
||||
|
||||
jsPsych.pluginAPI.registerPreload('visual-search-circle', 'target', 'image');
|
||||
jsPsych.pluginAPI.registerPreload('visual-search-circle', 'foil', 'image');
|
||||
jsPsych.pluginAPI.registerPreload('visual-search-circle', 'fixation_image', 'image');
|
||||
jsPsych.pluginAPI.registerPreload('visual-search-circle', 'target', 'image');
|
||||
jsPsych.pluginAPI.registerPreload('visual-search-circle', 'foil', 'image');
|
||||
jsPsych.pluginAPI.registerPreload('visual-search-circle', 'fixation_image', 'image');
|
||||
|
||||
plugin.create = function(params) {
|
||||
plugin.create = function(params) {
|
||||
|
||||
var trials = new Array(params.target_present.length);
|
||||
var trials = new Array(params.target_present.length);
|
||||
|
||||
for (var i = 0; i < trials.length; i++) {
|
||||
trials[i] = {};
|
||||
trials[i].target_present = params.target_present[i];
|
||||
trials[i].set_size = params.set_size[i];
|
||||
trials[i].target = params.target;
|
||||
trials[i].foil = params.foil;
|
||||
trials[i].fixation_image = params.fixation_image;
|
||||
trials[i].target_size = params.target_size || [50, 50];
|
||||
trials[i].fixation_size = params.fixation_size || [16, 16];
|
||||
trials[i].circle_diameter = params.circle_diameter || 250;
|
||||
trials[i].target_present_key = params.target_present_key || 74;
|
||||
trials[i].target_absent_key = params.target_absent_key || 70;
|
||||
trials[i].timing_max_search = (typeof params.timing_max_search === 'undefined') ? -1 : params.timing_max_search;
|
||||
trials[i].timing_fixation = (typeof params.timing_fixation === 'undefined') ? 1000 : params.timing_fixation;
|
||||
}
|
||||
|
||||
return trials;
|
||||
};
|
||||
|
||||
plugin.trial = function(display_element, trial) {
|
||||
|
||||
// default values
|
||||
trial.target_size = trial.target_size || [50, 50];
|
||||
trial.fixation_size = trial.fixation_size || [16, 16];
|
||||
trial.circle_diameter = trial.circle_diameter || 250;
|
||||
trial.target_present_key = trial.target_present_key || 74;
|
||||
trial.target_absent_key = trial.target_absent_key || 70;
|
||||
trial.timing_max_search = (typeof trial.timing_max_search === 'undefined') ? -1 : trial.timing_max_search;
|
||||
trial.timing_fixation = (typeof trial.timing_fixation === 'undefined') ? 1000 : trial.timing_fixation;
|
||||
|
||||
trial = jsPsych.pluginAPI.evaluateFunctionParameters(trial);
|
||||
|
||||
// screen information
|
||||
var screenw = display_element.width();
|
||||
var screenh = display_element.height();
|
||||
var centerx = screenw / 2;
|
||||
var centery = screenh / 2;
|
||||
|
||||
// circle params
|
||||
var diam = trial.circle_diameter; // pixels
|
||||
var radi = diam / 2;
|
||||
var paper_size = diam + trial.target_size[0];
|
||||
|
||||
// stimuli width, height
|
||||
var stimh = trial.target_size[0];
|
||||
var stimw = trial.target_size[1];
|
||||
var hstimh = stimh / 2;
|
||||
var hstimw = stimw / 2;
|
||||
|
||||
// fixation location
|
||||
var fix_loc = [Math.floor(paper_size / 2 - trial.fixation_size[0] / 2), Math.floor(paper_size / 2 - trial.fixation_size[1] / 2)];
|
||||
|
||||
// possible stimulus locations on the circle
|
||||
var display_locs = [];
|
||||
var possible_display_locs = trial.set_size;
|
||||
var random_offset = Math.floor(Math.random() * 360);
|
||||
for (var i = 0; i < possible_display_locs; i++) {
|
||||
display_locs.push([
|
||||
Math.floor(paper_size / 2 + (cosd(random_offset + (i * (360 / possible_display_locs))) * radi) - hstimw),
|
||||
Math.floor(paper_size / 2 - (sind(random_offset + (i * (360 / possible_display_locs))) * radi) - hstimh)
|
||||
]);
|
||||
}
|
||||
|
||||
// get target to draw on
|
||||
display_element.append($('<svg id="jspsych-visual-search-circle-svg" width=' + paper_size + ' height=' + paper_size + '></svg>'));
|
||||
var paper = Snap('#jspsych-visual-search-circle-svg');
|
||||
|
||||
show_fixation();
|
||||
|
||||
function show_fixation() {
|
||||
// show fixation
|
||||
var fixation = paper.image(trial.fixation_image, fix_loc[0], fix_loc[1], trial.fixation_size[0], trial.fixation_size[1]);
|
||||
|
||||
// wait
|
||||
setTimeout(function() {
|
||||
// after wait is over
|
||||
show_search_array();
|
||||
}, trial.timing_fixation);
|
||||
}
|
||||
|
||||
function show_search_array() {
|
||||
|
||||
var search_array_images = [];
|
||||
|
||||
for (var i = 0; i < display_locs.length; i++) {
|
||||
|
||||
var which_image = (i == 0 && trial.target_present) ? trial.target : trial.foil;
|
||||
|
||||
var img = paper.image(which_image, display_locs[i][0], display_locs[i][1], trial.target_size[0], trial.target_size[1]);
|
||||
|
||||
search_array_images.push(img);
|
||||
|
||||
for (var i = 0; i < trials.length; i++) {
|
||||
trials[i] = {};
|
||||
trials[i].target_present = params.target_present[i];
|
||||
trials[i].set_size = params.set_size[i];
|
||||
trials[i].target = params.target;
|
||||
trials[i].foil = params.foil;
|
||||
trials[i].fixation_image = params.fixation_image;
|
||||
trials[i].target_size = params.target_size || [50, 50];
|
||||
trials[i].fixation_size = params.fixation_size || [16, 16];
|
||||
trials[i].circle_diameter = params.circle_diameter || 250;
|
||||
trials[i].target_present_key = params.target_present_key || 74;
|
||||
trials[i].target_absent_key = params.target_absent_key || 70;
|
||||
trials[i].timing_max_search = (typeof params.timing_max_search === 'undefined') ? -1 : params.timing_max_search;
|
||||
trials[i].timing_fixation = (typeof params.timing_fixation === 'undefined') ? 1000 : params.timing_fixation;
|
||||
}
|
||||
|
||||
return trials;
|
||||
};
|
||||
var trial_over = false;
|
||||
|
||||
plugin.trial = function(display_element, trial) {
|
||||
var after_response = function(info) {
|
||||
|
||||
// default values
|
||||
trial.target_size = trial.target_size || [50, 50];
|
||||
trial.fixation_size = trial.fixation_size || [16, 16];
|
||||
trial.circle_diameter = trial.circle_diameter || 250;
|
||||
trial.target_present_key = trial.target_present_key || 74;
|
||||
trial.target_absent_key = trial.target_absent_key || 70;
|
||||
trial.timing_max_search = (typeof trial.timing_max_search === 'undefined') ? -1 : trial.timing_max_search;
|
||||
trial.timing_fixation = (typeof trial.timing_fixation === 'undefined') ? 1000 : trial.timing_fixation;
|
||||
trial_over = true;
|
||||
|
||||
trial = jsPsych.pluginAPI.evaluateFunctionParameters(trial);
|
||||
|
||||
// screen information
|
||||
var screenw = display_element.width();
|
||||
var screenh = display_element.height();
|
||||
var centerx = screenw / 2;
|
||||
var centery = screenh / 2;
|
||||
|
||||
// circle params
|
||||
var diam = trial.circle_diameter; // pixels
|
||||
var radi = diam / 2;
|
||||
var paper_size = diam + trial.target_size[0];
|
||||
|
||||
// stimuli width, height
|
||||
var stimh = trial.target_size[0];
|
||||
var stimw = trial.target_size[1];
|
||||
var hstimh = stimh / 2;
|
||||
var hstimw = stimw / 2;
|
||||
|
||||
// fixation location
|
||||
var fix_loc = [Math.floor(paper_size / 2 - trial.fixation_size[0] / 2), Math.floor(paper_size / 2 - trial.fixation_size[1] / 2)];
|
||||
|
||||
// possible stimulus locations on the circle
|
||||
var display_locs = [];
|
||||
var possible_display_locs = trial.set_size;
|
||||
var random_offset = Math.floor(Math.random() * 360);
|
||||
for (var i = 0; i < possible_display_locs; i++) {
|
||||
display_locs.push([
|
||||
Math.floor(paper_size / 2 + (cosd(random_offset + (i * (360 / possible_display_locs))) * radi) - hstimw),
|
||||
Math.floor(paper_size / 2 - (sind(random_offset + (i * (360 / possible_display_locs))) * radi) - hstimh)
|
||||
]);
|
||||
}
|
||||
|
||||
// get target to draw on
|
||||
display_element.append($('<svg id="jspsych-visual-search-circle-svg" width=' + paper_size + ' height=' + paper_size + '></svg>'));
|
||||
var paper = Snap('#jspsych-visual-search-circle-svg');
|
||||
|
||||
show_fixation();
|
||||
|
||||
function show_fixation() {
|
||||
// show fixation
|
||||
var fixation = paper.image(trial.fixation_image, fix_loc[0], fix_loc[1], trial.fixation_size[0], trial.fixation_size[1]);
|
||||
|
||||
// wait
|
||||
setTimeout(function() {
|
||||
// after wait is over
|
||||
show_search_array();
|
||||
}, trial.timing_fixation);
|
||||
}
|
||||
|
||||
function show_search_array() {
|
||||
|
||||
var search_array_images = [];
|
||||
|
||||
for (var i = 0; i < display_locs.length; i++) {
|
||||
|
||||
var which_image = (i == 0 && trial.target_present) ? trial.target : trial.foil;
|
||||
|
||||
var img = paper.image(which_image, display_locs[i][0], display_locs[i][1], trial.target_size[0], trial.target_size[1]);
|
||||
|
||||
search_array_images.push(img);
|
||||
var correct = 0;
|
||||
|
||||
if (info.key == trial.target_present_key && trial.target_present ||
|
||||
info.key == trial.target_absent_key && !trial.target_present) {
|
||||
correct = 1;
|
||||
}
|
||||
|
||||
var trial_over = false;
|
||||
clear_display();
|
||||
|
||||
var after_response = function(info) {
|
||||
end_trial(info.rt, correct, info.key);
|
||||
|
||||
trial_over = true;
|
||||
}
|
||||
|
||||
var correct = 0;
|
||||
var valid_keys = [trial.target_present_key, trial.target_absent_key];
|
||||
|
||||
if (info.key == trial.target_present_key && trial.target_present ||
|
||||
info.key == trial.target_absent_key && !trial.target_present) {
|
||||
correct = 1;
|
||||
key_listener = jsPsych.pluginAPI.getKeyboardResponse({
|
||||
callback_function: after_response,
|
||||
valid_responses: valid_keys,
|
||||
rt_method: 'date',
|
||||
persist: false,
|
||||
allow_held_key: false
|
||||
});
|
||||
|
||||
if (trial.timing_max_search > -1) {
|
||||
|
||||
if (trial.timing_max_search == 0) {
|
||||
if (!trial_over) {
|
||||
|
||||
jsPsych.pluginAPI.cancelKeyboardResponse(key_listener);
|
||||
|
||||
trial_over = true;
|
||||
|
||||
var rt = -1;
|
||||
var correct = 0;
|
||||
var key_press = -1;
|
||||
|
||||
clear_display();
|
||||
|
||||
end_trial(rt, correct, key_press);
|
||||
}
|
||||
} else {
|
||||
|
||||
clear_display();
|
||||
setTimeout(function() {
|
||||
|
||||
end_trial(info.rt, correct, info.key);
|
||||
|
||||
}
|
||||
|
||||
var valid_keys = [trial.target_present_key, trial.target_absent_key];
|
||||
|
||||
key_listener = jsPsych.pluginAPI.getKeyboardResponse({
|
||||
callback_function: after_response,
|
||||
valid_responses: valid_keys,
|
||||
rt_method: 'date',
|
||||
persist: false,
|
||||
allow_held_key: false
|
||||
});
|
||||
|
||||
if (trial.timing_max_search > -1) {
|
||||
|
||||
if (trial.timing_max_search == 0) {
|
||||
if (!trial_over) {
|
||||
|
||||
jsPsych.pluginAPI.cancelKeyboardResponse(key_listener);
|
||||
@ -166,60 +184,42 @@
|
||||
|
||||
end_trial(rt, correct, key_press);
|
||||
}
|
||||
} else {
|
||||
|
||||
setTimeout(function() {
|
||||
|
||||
if (!trial_over) {
|
||||
|
||||
jsPsych.pluginAPI.cancelKeyboardResponse(key_listener);
|
||||
|
||||
trial_over = true;
|
||||
|
||||
var rt = -1;
|
||||
var correct = 0;
|
||||
var key_press = -1;
|
||||
|
||||
clear_display();
|
||||
|
||||
end_trial(rt, correct, key_press);
|
||||
}
|
||||
}, trial.timing_max_search);
|
||||
}
|
||||
}
|
||||
|
||||
function clear_display() {
|
||||
display_element.html('');
|
||||
}, trial.timing_max_search);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function end_trial(rt, correct, key_press) {
|
||||
|
||||
// data saving
|
||||
var trial_data = {
|
||||
correct: correct,
|
||||
rt: rt,
|
||||
key_press: key_press,
|
||||
locations: JSON.stringify(display_locs),
|
||||
target_present: trial.target_present,
|
||||
set_size: trial.set_size
|
||||
};
|
||||
|
||||
// go to next trial
|
||||
jsPsych.finishTrial(trial_data);
|
||||
function clear_display() {
|
||||
display_element.html('');
|
||||
}
|
||||
};
|
||||
|
||||
// helper function for determining stimulus locations
|
||||
|
||||
function cosd(num) {
|
||||
return Math.cos(num / 180 * Math.PI);
|
||||
}
|
||||
|
||||
function sind(num) {
|
||||
return Math.sin(num / 180 * Math.PI);
|
||||
}
|
||||
|
||||
return plugin;
|
||||
})();
|
||||
function end_trial(rt, correct, key_press) {
|
||||
|
||||
// data saving
|
||||
var trial_data = {
|
||||
correct: correct,
|
||||
rt: rt,
|
||||
key_press: key_press,
|
||||
locations: JSON.stringify(display_locs),
|
||||
target_present: trial.target_present,
|
||||
set_size: trial.set_size
|
||||
};
|
||||
|
||||
// go to next trial
|
||||
jsPsych.finishTrial(trial_data);
|
||||
}
|
||||
};
|
||||
|
||||
// helper function for determining stimulus locations
|
||||
|
||||
function cosd(num) {
|
||||
return Math.cos(num / 180 * Math.PI);
|
||||
}
|
||||
|
||||
function sind(num) {
|
||||
return Math.sin(num / 180 * Math.PI);
|
||||
}
|
||||
|
||||
return plugin;
|
||||
})();
|
||||
|
@ -11,7 +11,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
jsPsych['vsl-animate-occlusion'] = (function() {
|
||||
jsPsych.plugins['vsl-animate-occlusion'] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
jsPsych['vsl-grid-scene'] = (function() {
|
||||
jsPsych.plugins['vsl-grid-scene'] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
jsPsych.xab = (function() {
|
||||
jsPsych.plugins.xab = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
* Example plugin template
|
||||
*/
|
||||
|
||||
jsPsych["PLUGIN-NAME"] = (function() {
|
||||
jsPsych.plugins["PLUGIN-NAME"] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user