m@0: /*============================================================================= m@0: * File: ExperimentController.java m@0: * Author: Marcus Pearce m@0: * Created: <2007-12-14 12:06:10 marcusp> m@12: * Time-stamp: <2011-11-10 19:08:45 marcusp> m@0: *============================================================================= m@0: */ m@0: m@0: import java.awt.*; m@0: import java.awt.event.*; m@0: import javax.swing.*; c@48: import java.io.IOException; c@48: import java.io.File; 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; c@45: StimulusPanel sp; m@0: SubjectDataPanel sdp; m@0: InterBlockPanel ibp; c@47: EndTestPanel etp; m@0: c@48: boolean runPostScript; c@48: m@0: /* constructor */ m@0: public ExperimentController(ExperimentGui eg) { m@0: gui = eg; m@0: exp = gui.getExperiment(); c@48: results = exp.getSubjectResults(); c@48: runPostScript = exp.getRunPostScript(); m@0: m@0: ip = gui.getInstructionsPanel(); m@0: ibp = gui.getInterBlockPanel(); m@0: sp = gui.getStimulusPanel(); c@47: sdp = gui.getSubjectDataPanel(); c@47: etp = gui.getEndTestPanel(); m@0: m@0: ip.addNextButtonListener(this); m@0: sp.addAllListeners(this); m@0: sdp.addFinishButtonListener(this); c@47: ibp.addContinueButtonListener(this); c@47: etp.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) { c@42: //JOptionPane.showMessageDialog (gui, msg); c@42: sp.setMessagePrompt(msg); c@42: } c@42: c@42: protected void showDefaultMessagePrompt() { c@42: sp.showDefaultMessagePrompt(); m@0: } m@0: m@0: /* actionPerformed */ m@0: public void actionPerformed(ActionEvent e) { c@42: showDefaultMessagePrompt(); c@42: 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: c@42: Block block = exp.getCurrentBlock(); m@0: m@0: // InstructionsPanel m@0: if (source == ip.getNextButton()) { jeremy@37: String subjID = ip.getSubjectID(); jeremy@37: if (subjID.equals(ip.INVALID_SUBJECT_ID)) jeremy@37: reportError("The participant ID should contain only letters and numbers."); 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: } c@47: c@47: else if (source == etp.getContinueButton()) { c@48: if (runPostScript){ c@48: String dir = System.getProperty("user.dir") + System.getProperty("file.separator", "/"); c@48: String script = dir + exp.POST_SCRIPT; c@48: String[] cmd = new String[4]; c@48: if(script.toLowerCase().endsWith(".bat")){ c@48: cmd[0] = "cmd.exe"; c@48: cmd[1] = "/c"; c@48: cmd[2] = "start"; c@48: cmd[3] = script; c@48: } c@48: else{ c@48: cmd[0] = script; c@48: cmd[1] = " "; c@48: cmd[2] = " "; c@48: cmd[3] = " "; c@48: } c@48: Runtime runtime = Runtime.getRuntime(); c@48: try{ c@48: Process proc = runtime.exec(cmd); c@48: runPostScript = false; c@48: } catch (IOException exception){ c@48: System.out.println("Error: Script has not excecuted."); c@48: exception.printStackTrace(); c@48: } c@48: } c@47: System.exit(0); c@47: } 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(); c@47: gui.showCard("endTest"); m@8: } else m@8: reportError("You have not filled in all the information."); m@8: } else c@47: gui.showCard("endTest"); 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."); c@45: } else if (source == sp.getNextButton()) { c@42: nextStimuli(block); m@0: } else { jeremy@26: if (exp.getDebug()) jeremy@26: System.out.println("Button response, getAcceptingResponses: " + gui.getAcceptingResponses() + " " + e.getActionCommand()); jeremy@26: 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()) { jeremy@26: ratingResponse(i, time); jeremy@26: /* JShulver@23: block.addResponse(i+1, time); m@0: gui.setAcceptingResponses(false); JShulver@23: rButtons[i].setBackground(Color.red); jeremy@26: rButtons[i].setOpaque(true); jeremy@26: */ m@0: } m@0: } m@0: } m@0: } jeremy@26: m@0: m@0: public void keyPressed(KeyEvent e) { c@45: showDefaultMessagePrompt(); c@45: jeremy@26: if (exp.getDebug()) jeremy@26: 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(); c@42: c@43: if (e.getKeyCode() == KeyEvent.VK_SPACE){ c@42: nextStimuli(exp.getCurrentBlock()); c@42: } c@42: else 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)) { jeremy@26: ratingResponse(i, time); jeremy@26: /* m@10: if (exp.getDebug()) m@10: System.out.println("Got rating: " + (i + 1)); m@5: block.addResponse(i+1, time); m@5: gui.setAcceptingResponses(false); jeremy@26: */ 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: } c@42: jeremy@26: protected void ratingResponse(int buttonIndex, long time) { jeremy@26: jeremy@26: int rating = buttonIndex + 1; jeremy@26: jeremy@26: if (exp.getDebug()) jeremy@26: System.out.println("Rating: " + rating); jeremy@26: exp.getCurrentBlock().addResponse(rating, time); jeremy@26: sp.highlightResponse(buttonIndex); jeremy@26: gui.setAcceptingResponses(false); jeremy@26: } c@42: c@42: protected void nextStimuli(Block block){ c@42: if (!exp.hasRun() || exp.isRunning()) { c@42: //System.out.println(!exp.hasRun()); c@42: //System.out.println(exp.isRunning()); c@42: //System.out.println(exp.getCurrentBlock().getMidiPlayer().getSequencer().isRunning()); c@42: reportError("You haven't finished playing the melody yet."); c@42: c@42: } else if (exp.getCurrentBlock().getMelodyResults().countResponses() == 0) { c@42: reportError("Please select a number."); c@42: c@42: } else if (sp.unansweredQuestions()) c@42: reportError("There are unanswered questions."); c@45: c@42: else { c@45: showDefaultMessagePrompt(); c@42: // store results (and write to file) c@42: if (exp.getAskFamiliarity()) { c@42: String answer1 = (String)(sp.getQ1Box().getSelectedItem()); c@42: block.addMelodyQA("known", answer1); c@42: } else c@42: block.addMelodyQA("known", "-1"); c@42: if (exp.getAskLiking()) { c@42: String answer2 = (String)(sp.getQ2Box().getSelectedItem()); c@42: block.addMelodyQA("liked", answer2); c@42: } else c@42: block.addMelodyQA("liked", "-1"); c@42: block.storeMelodyResult(); c@42: results.writeResults(); c@42: // close the midi player c@42: block.getMidiPlayer().stop(); c@42: // proceed to ... c@42: c@42: String nextFile = block.nextFile(); c@42: if (nextFile == null) { c@42: boolean nb = exp.nextBlock(); c@42: if (nb) { c@42: // ... next block of trials c@42: gui.getInterBlockPanel().setText(); c@42: gui.getInterBlockPanel().updateMessageDisplay(); c@42: gui.showCard("interblock"); c@42: sp.resetButtonBackgrounds(); c@42: } else { c@42: // ... write results and subject questionnaire c@42: results.writeResults(); c@42: gui.showCard("subject"); c@42: } c@42: } else { c@42: // ... next melody within block c@42: sp.resetButtonBackgrounds(); c@42: sp.setSongNumberText(); c@42: sp.defaultAnswers(); c@42: gui.setAcceptingResponses(false); c@42: block.initialiseBlock(); c@42: exp.runExperiment(); c@42: } c@42: } c@42: } m@0: }