/*
* plugin for jsPsych based in Qisheng Li 11/2019. /// https://github.com/QishengLi/virtual_chinrest
Modified by Gustavo Juantorena 08/2020 // https://github.com/GEJ1
Contributions from Peter J. Kohler: https://github.com/pjkohler
*/
jsPsych.plugins["virtual-chinrest"] = (function () {
var plugin = {};
plugin.info = {
name: "virtual-chinrest",
parameters: {
resize_units: {
type: jsPsych.plugins.parameterType.STRING,
default: "none",
description:
'What units to resize to? ["none"/"cm"/"inch"/"deg"]. If "none", no resize will be done.',
},
pixels_per_unit: {
type: jsPsych.plugins.parameterType.INT,
pretty_name: "Pixels per unit",
default: 100,
description:
"After the scaling factor is applied, this many pixels will equal one unit of measurement.",
},
// mouse_adjustment: {
// type: jsPsych.plugins.parameterType.BOOL,
// pretty_name: "Adjust Using Mouse?",
// default: true,
// },
adjustment_prompt: {
type: jsPsych.plugins.parameterType.STRING,
default:
" Let’s find out how big your monitor is! " +
"
Please use any credit card that you have available. " +
"It can also be a grocery store membership card, " +
"your drivers license or anything else of the same format. " +
"Place your card flat onto the screen, and adjust the image below to match its size.
" +
"
If you do not have access to a real card " +
"you can use a ruler to measure the image width to 3.37 inches or 85.6 mm. ",
description:
" Any content here will be displayed above the card stimulus.",
},
adjustment_button_prompt: {
type: jsPsych.plugins.parameterType.STRING,
default: "Click here when the card has the right size!",
description:
" Content of the button displayed below the card stimulus.",
},
item_path: {
type: jsPsych.plugins.parameterType.STRING,
default: "img/card.png",
},
item_height_mm: {
type: jsPsych.plugins.parameterType.INT,
pretty_name: "Item height",
default: 53.98,
description: "The height of the item to be measured.",
},
item_width_mm: {
type: jsPsych.plugins.parameterType.INT,
pretty_name: "Item width",
default: 85.6,
description: "The width of the item to be measured.",
},
item_init_size: {
type: jsPsych.plugins.parameterType.INT,
pretty_name: "Initial Size",
default: 250,
description:
"The initial size of the card, in pixels, along the largest dimension.",
},
blindspot_reps: {
type: jsPsych.plugins.parameterType.INT,
pretty_name: "Blindspot measurement repetitions",
default: 5,
description:
"How many times to measure the blindspot location? If 0, blindspot will not detected and viewing distance not computed.",
},
blindspot_prompt: {
type: jsPsych.plugins.parameterType.STRING,
default:
"Now, let’s quickly test how far away you are sitting." +
"
You might know that vision tests at a doctor’s practice often involve chinrests. " +
"The doctor basically asks you to sit away from a screen in a specific distance. " +
"We do this here with a “virtual chinrest”.
" +
"Instructions" +
'
' +
"
Put your finger on space bar on the keyboard.
" +
"
Close your right eye. (Tips: it might be easier to cover your right eye by hand!)
" +
"
Using your left eye, focus on the black square.
" +
'
Click the button below to start the animation of the red ball. The red ball ' +
"will disappear as it moves from right to left. Press the “Space” key as soon as the ball disappears from your eye sight.
" +
"
Keep your right eye closed and hit the “Space” key fast! ",
},
blindspot_start_prompt: {
type: jsPsych.plugins.parameterType.STRING,
default: "Start",
description: "Content of the start button for the blindspot tasks.",
},
blindspot_done_prompt: {
type: jsPsych.plugins.parameterType.STRING,
default: "Done",
description: "Content of the done button for the blindspot tasks.",
},
blindspot_measurements_prompt: {
type: jsPsych.plugins.parameterType.STRING,
default: "Remaining measurements: ",
description: "Text accompanying the remaining measures counter",
},
viewing_distance_report: {
type: jsPsych.plugins.parameterType.STRING,
default: "Estimated viewing distance (cm):",
description:
'If "none" is given, viewing distance will not be reported to the participant',
},
},
};
// Get screen size
var w = window.innerWidth;
var h = window.innerHeight;
const screen_size_px = [];
screen_size_px.push(w);
screen_size_px.push("x");
screen_size_px.push(h);
let trial_data = {}; // declare trial data as empty so we have access to it across functions
let config_data = {
ball_pos: [],
slider_clck: false,
};
plugin.trial = function (display_element, trial) {
try {
if (
!(trial.blindspot_reps > 0) &&
(trial.resize_units == "deg" || trial.resize_units == "degrees")
) {
throw Error(
"Blindspot repetitions set to 0, so resizing to degrees of visual angle is not possible!"
);
} else {
const start_time = performance.now();
trial_data = {
item_width_mm: trial.item_width_mm,
item_height_mm: trial.item_height_mm, //card dimension: 85.60 × 53.98 mm (3.370 × 2.125 in)
};
let button_str = '