m@0: /*============================================================================= m@0: * File: ExperimentController.java m@0: * Author: Marcus Pearce m@0: * Created: <2007-12-14 12:06:10 marcusp> m@8: * Time-stamp: <2011-07-19 15:26:30 marcusp> m@0: *============================================================================= m@0: */ m@0: m@0: import java.awt.*; m@0: import java.awt.event.*; m@0: import javax.swing.*; m@0: m@0: public class ExperimentController implements ActionListener, KeyListener { m@0: m@0: /* variables */ m@0: ExperimentGui gui; m@0: m@0: Experiment exp; m@0: SubjectResults results; m@0: m@0: InstructionsPanel ip; m@0: StimulusPanel sp; m@0: SubjectDataPanel sdp; m@0: InterBlockPanel ibp; m@0: m@0: /* constructor */ m@0: public ExperimentController(ExperimentGui eg) { m@0: gui = eg; m@0: exp = gui.getExperiment(); m@0: results = exp.getSubjectResults(); m@0: m@0: ip = gui.getInstructionsPanel(); m@0: ibp = gui.getInterBlockPanel(); m@0: sp = gui.getStimulusPanel(); m@0: sdp = gui.getSubjectDataPanel(); m@0: m@0: ip.addNextButtonListener(this); m@0: sp.addAllListeners(this); m@0: sdp.addFinishButtonListener(this); m@0: ibp.addContinueButtonListener(this); m@0: m@0: sp.setFocusable(true); m@0: sp.addKeyListener(this); m@0: sp.addAllKeyListeners(this); m@0: gui.setFocusable(true); m@0: gui.addKeyListener(this); m@0: } m@0: m@0: /* report erroneous input */ m@0: protected void reportError (String msg) { m@0: JOptionPane.showMessageDialog (gui, msg); m@0: } m@0: m@0: /* actionPerformed */ m@0: public void actionPerformed(ActionEvent e) { m@0: long time = System.nanoTime(); m@0: Object source = e.getSource(); m@0: m@0: ip = gui.getInstructionsPanel(); m@0: ibp = gui.getInterBlockPanel(); m@0: sp = gui.getStimulusPanel(); m@0: sdp = gui.getSubjectDataPanel(); m@0: m@0: Block block = exp.getCurrentBlock(); m@0: m@0: // InstructionsPanel m@0: if (source == ip.getNextButton()) { m@0: int subjID = ip.getSubjectID(); m@0: if (subjID == ip.INVALID_SUBJECT_ID || subjID < 1) m@0: reportError("The Participant ID should be a positive integer."); m@0: // TODO: check that subjID doesn't already exist m@0: else { m@0: exp.setSubjectID(subjID); m@0: gui.showCard("stimulus"); m@0: exp.runExperiment(); m@0: } m@0: } m@0: m@0: // InterBlockPanel m@0: else if (source == ibp.getContinueButton()) { m@0: block.initialiseBlock(); m@0: sp.setSongNumberText(); m@0: sp.defaultAnswers(); m@0: gui.setAcceptingResponses(false); m@0: gui.showCard("stimulus"); m@0: exp.runExperiment(); m@0: } m@0: m@0: // SubjectDataPanel m@0: else if (e.getSource() == sdp.getFinishButton()) { m@8: if (exp.getFinalQuestionnaire()) { m@8: if (sdp.allDataEntered()) { m@8: sdp.storeData(); m@8: results.writeSubjectData(); m@8: System.exit(0); m@8: } else m@8: reportError("You have not filled in all the information."); m@8: } else m@0: System.exit(0); m@0: } m@0: m@0: // StimulusPanel m@0: else if (source == sp.getPlayButton()) { m@0: // if (!exp.isRunning() && !exp.hasRun()) m@0: // exp.runExperiment(); m@0: // else m@0: // reportError("You have already played the melody."); m@0: } else if (source == sp.getNextButton()) { m@0: if (!exp.hasRun() || exp.isRunning()) m@0: reportError("You haven't finished playing the melody yet."); m@0: else if (sp.unansweredQuestions()) m@0: reportError("There are unanswered questions."); m@0: else { m@2: // store results (and write to file) m@8: if (exp.getAskFamiliarity()) { m@8: String answer1 = (String)(sp.getQ1Box().getSelectedItem()); m@8: block.addMelodyQA("known", answer1); m@8: } else m@8: block.addMelodyQA("known", "-1"); m@8: m@8: if (exp.getAskLiking()) { m@8: String answer2 = (String)(sp.getQ2Box().getSelectedItem()); m@8: block.addMelodyQA("liked", answer2); m@8: } else m@8: block.addMelodyQA("liked", "-1"); m@8: m@2: block.storeMelodyResult(); m@2: results.writeResults(); m@4: // close the midi player m@4: block.getMidiPlayer().stop(); m@0: // proceed to ... m@0: String nextFile = block.nextFile(); m@0: if (nextFile == null) { m@0: boolean nb = exp.nextBlock(); m@0: if (nb) { m@0: // ... next block of trials m@0: gui.getInterBlockPanel().setText(); m@0: gui.getInterBlockPanel().updateMessageDisplay(); m@0: gui.showCard("interblock"); m@0: } else { m@0: // ... write results and subject questionnaire m@0: results.writeResults(); m@0: gui.showCard("subject"); m@0: } m@0: } else { m@0: // ... next melody within block m@0: sp.setSongNumberText(); m@0: sp.defaultAnswers(); m@0: gui.setAcceptingResponses(false); m@0: block.initialiseBlock(); m@0: exp.runExperiment(); m@0: } m@0: } m@0: } else { m@0: JButton[] rButtons = sp.getResponseButtons(); m@0: for (int i = 0; i < rButtons.length; i++) { m@0: if (source == rButtons[i] && (exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) { m@0: block.addResponse(i+1, time); m@0: gui.setAcceptingResponses(false); m@0: } m@0: } m@0: } m@0: } m@0: m@0: public void keyPressed(KeyEvent e) { m@0: //System.out.println("Key pressed: " + e.getKeyChar()); m@0: long time = System.nanoTime(); m@0: m@0: Block block = exp.getCurrentBlock(); m@0: sp = gui.getStimulusPanel(); m@0: JButton[] rButtons = sp.getResponseButtons(); m@0: m@5: if ((exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) { m@5: if (exp.getScaleLength() == 2) { m@5: char key = e.getKeyChar(); m@5: switch(key) { m@5: case 'q': block.addResponse(1, time); break; m@5: case 'p': block.addResponse(2, time); break; m@5: default: System.out.println("No Response at " + time); break; m@0: } m@5: } else { m@5: for (int i = 0; i < rButtons.length; i++) { m@5: //System.out.println("Char = " + Character.forDigit(i+1, 10)); m@5: if (e.getKeyChar() == Character.forDigit(i+1, 10)) { m@5: //System.out.println("Got rating: " + (i + 1)); m@5: block.addResponse(i+1, time); m@5: gui.setAcceptingResponses(false); m@5: } m@5: //else m@5: // block.addResponse(0, time); m@5: } m@0: } m@0: } m@0: } m@0: m@0: public void keyReleased(KeyEvent e) { m@0: // System.out.println("Key released: " + e.getKeyChar()); m@0: } m@0: public void keyTyped(KeyEvent e) { m@0: //System.out.println("Key typed: " + e.getKeyChar()); m@0: } m@0: }