Mercurial > hg > mep
diff ExperimentController.java @ 0:4031cbb02f08
Initial import.
Ignore-this: 87317e384f22bde48db996355191fa5f
author | Marcus Pearce <m.pearce@gold.ac.uk> |
---|---|
date | Tue, 18 May 2010 11:37:10 +0100 |
parents | |
children | 1fe7ac28a3ca |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExperimentController.java Tue May 18 11:37:10 2010 +0100 @@ -0,0 +1,179 @@ +/*============================================================================= + * File: ExperimentController.java + * Author: Marcus Pearce <m.pearce@gold.ac.uk> + * Created: <2007-12-14 12:06:10 marcusp> + * Time-stamp: <2010-05-18 10:51:31 marcusp> + *============================================================================= + */ + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; + +public class ExperimentController implements ActionListener, KeyListener { + + /* variables */ + ExperimentGui gui; + + Experiment exp; + SubjectResults results; + + InstructionsPanel ip; + StimulusPanel sp; + SubjectDataPanel sdp; + InterBlockPanel ibp; + + /* constructor */ + public ExperimentController(ExperimentGui eg) { + gui = eg; + exp = gui.getExperiment(); + results = exp.getSubjectResults(); + + ip = gui.getInstructionsPanel(); + ibp = gui.getInterBlockPanel(); + sp = gui.getStimulusPanel(); + sdp = gui.getSubjectDataPanel(); + + ip.addNextButtonListener(this); + sp.addAllListeners(this); + sdp.addFinishButtonListener(this); + ibp.addContinueButtonListener(this); + + sp.setFocusable(true); + sp.addKeyListener(this); + sp.addAllKeyListeners(this); + gui.setFocusable(true); + gui.addKeyListener(this); + } + + /* report erroneous input */ + protected void reportError (String msg) { + JOptionPane.showMessageDialog (gui, msg); + } + + /* actionPerformed */ + public void actionPerformed(ActionEvent e) { + long time = System.nanoTime(); + Object source = e.getSource(); + + ip = gui.getInstructionsPanel(); + ibp = gui.getInterBlockPanel(); + sp = gui.getStimulusPanel(); + sdp = gui.getSubjectDataPanel(); + + Block block = exp.getCurrentBlock(); + + // InstructionsPanel + if (source == ip.getNextButton()) { + int subjID = ip.getSubjectID(); + if (subjID == ip.INVALID_SUBJECT_ID || subjID < 1) + reportError("The Participant ID should be a positive integer."); + // TODO: check that subjID doesn't already exist + else { + exp.setSubjectID(subjID); + gui.showCard("stimulus"); + exp.runExperiment(); + } + } + + // InterBlockPanel + else if (source == ibp.getContinueButton()) { + block.initialiseBlock(); + sp.setSongNumberText(); + sp.defaultAnswers(); + gui.setAcceptingResponses(false); + gui.showCard("stimulus"); + exp.runExperiment(); + } + + // SubjectDataPanel + else if (e.getSource() == sdp.getFinishButton()) { + if (sdp.allDataEntered()) { + sdp.storeData(); + results.writeSubjectData(); + System.exit(0); + } else + reportError("You have not filled in all the information."); + } + + // StimulusPanel + else if (source == sp.getPlayButton()) { +// if (!exp.isRunning() && !exp.hasRun()) +// exp.runExperiment(); +// else +// reportError("You have already played the melody."); + } else if (source == sp.getNextButton()) { + if (!exp.hasRun() || exp.isRunning()) + reportError("You haven't finished playing the melody yet."); + else if (sp.unansweredQuestions()) + reportError("There are unanswered questions."); + else { + // store results + String answer1 = (String)(sp.getQ1Box().getSelectedItem()); + String answer2 = (String)(sp.getQ2Box().getSelectedItem()); + block.addMelodyQA("known", answer1); + block.addMelodyQA("liked", answer2); + block.storeMelodyResult(); + // proceed to ... + String nextFile = block.nextFile(); + if (nextFile == null) { + boolean nb = exp.nextBlock(); + if (nb) { + // ... next block of trials + gui.getInterBlockPanel().setText(); + gui.getInterBlockPanel().updateMessageDisplay(); + gui.showCard("interblock"); + } else { + // ... write results and subject questionnaire + results.writeResults(); + gui.showCard("subject"); + } + } else { + // ... next melody within block + sp.setSongNumberText(); + sp.defaultAnswers(); + gui.setAcceptingResponses(false); + block.initialiseBlock(); + exp.runExperiment(); + } + } + } else { + JButton[] rButtons = sp.getResponseButtons(); + for (int i = 0; i < rButtons.length; i++) { + if (source == rButtons[i] && (exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) { + block.addResponse(i+1, time); + gui.setAcceptingResponses(false); + } + } + } + } + + public void keyPressed(KeyEvent e) { + //System.out.println("Key pressed: " + e.getKeyChar()); + long time = System.nanoTime(); + + Block block = exp.getCurrentBlock(); + sp = gui.getStimulusPanel(); + JButton[] rButtons = sp.getResponseButtons(); + + for (int i = 0; i < rButtons.length; i++) { + if ((exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) { + //System.out.println("Char = " + Character.forDigit(i+1, 10)); + if (e.getKeyChar() == Character.forDigit(i+1, 10)) { + //System.out.println("Got rating: " + (i + 1)); + block.addResponse(i+1, time); + gui.setAcceptingResponses(false); + } + //else + // block.addResponse(0, time); + } + } + } + + public void keyReleased(KeyEvent e) { + // System.out.println("Key released: " + e.getKeyChar()); + } + public void keyTyped(KeyEvent e) { + //System.out.println("Key typed: " + e.getKeyChar()); + } +}