Mercurial > hg > mep
view ExperimentController.java @ 52:76e99859bdb4 tip
Add class files for previous changes.
author | Marcus Pearce <marcus.pearce@eecs.qmul.ac.uk> |
---|---|
date | Wed, 25 Feb 2015 10:11:04 +0000 |
parents | f3261bd3dd49 |
children |
line wrap: on
line source
/*============================================================================= * File: ExperimentController.java * Author: Marcus Pearce <m.pearce@gold.ac.uk> * Created: <2007-12-14 12:06:10 marcusp> * Time-stamp: <2011-11-10 19:08:45 marcusp> *============================================================================= */ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.IOException; import java.io.File; public class ExperimentController implements ActionListener, KeyListener { /* variables */ ExperimentGui gui; Experiment exp; SubjectResults results; InstructionsPanel ip; StimulusPanel sp; SubjectDataPanel sdp; InterBlockPanel ibp; EndTestPanel etp; boolean runPostScript; /* constructor */ public ExperimentController(ExperimentGui eg) { gui = eg; exp = gui.getExperiment(); results = exp.getSubjectResults(); runPostScript = exp.getRunPostScript(); ip = gui.getInstructionsPanel(); ibp = gui.getInterBlockPanel(); sp = gui.getStimulusPanel(); sdp = gui.getSubjectDataPanel(); etp = gui.getEndTestPanel(); ip.addNextButtonListener(this); sp.addAllListeners(this); sdp.addFinishButtonListener(this); ibp.addContinueButtonListener(this); etp.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); sp.setMessagePrompt(msg); } protected void showDefaultMessagePrompt() { sp.showDefaultMessagePrompt(); } /* actionPerformed */ public void actionPerformed(ActionEvent e) { showDefaultMessagePrompt(); 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()) { String subjID = ip.getSubjectID(); if (subjID.equals(ip.INVALID_SUBJECT_ID)) reportError("The participant ID should contain only letters and numbers."); // 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(); } else if (source == etp.getContinueButton()) { if (runPostScript){ String dir = System.getProperty("user.dir") + System.getProperty("file.separator", "/"); String script = dir + exp.POST_SCRIPT; String[] cmd = new String[4]; if(script.toLowerCase().endsWith(".bat")){ cmd[0] = "cmd.exe"; cmd[1] = "/c"; cmd[2] = "start"; cmd[3] = script; } else{ cmd[0] = script; cmd[1] = " "; cmd[2] = " "; cmd[3] = " "; } Runtime runtime = Runtime.getRuntime(); try{ Process proc = runtime.exec(cmd); runPostScript = false; } catch (IOException exception){ System.out.println("Error: Script has not excecuted."); exception.printStackTrace(); } } System.exit(0); } // SubjectDataPanel else if (e.getSource() == sdp.getFinishButton()) { if (exp.getFinalQuestionnaire()) { if (sdp.allDataEntered()) { sdp.storeData(); results.writeSubjectData(); gui.showCard("endTest"); } else reportError("You have not filled in all the information."); } else gui.showCard("endTest"); } // 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()) { nextStimuli(block); } else { if (exp.getDebug()) System.out.println("Button response, getAcceptingResponses: " + gui.getAcceptingResponses() + " " + e.getActionCommand()); JButton[] rButtons = sp.getResponseButtons(); for (int i = 0; i < rButtons.length; i++) { if (source == rButtons[i] && (exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) { ratingResponse(i, time); /* block.addResponse(i+1, time); gui.setAcceptingResponses(false); rButtons[i].setBackground(Color.red); rButtons[i].setOpaque(true); */ } } } } public void keyPressed(KeyEvent e) { showDefaultMessagePrompt(); if (exp.getDebug()) System.out.println("Key pressed: " + e.getKeyChar()); long time = System.nanoTime(); Block block = exp.getCurrentBlock(); sp = gui.getStimulusPanel(); JButton[] rButtons = sp.getResponseButtons(); if (e.getKeyCode() == KeyEvent.VK_SPACE){ nextStimuli(exp.getCurrentBlock()); } else if ((exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) { if (exp.getScaleLength() == 2) { char key = e.getKeyChar(); switch(key) { case 'q': block.addResponse(1, time); break; case 'p': block.addResponse(2, time); break; default: System.out.println("No Response at " + time); break; } } else { for (int i = 0; i < rButtons.length; i++) { //System.out.println("Char = " + Character.forDigit(i+1, 10)); if (e.getKeyChar() == Character.forDigit(i+1, 10)) { ratingResponse(i, time); /* if (exp.getDebug()) 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()); } protected void ratingResponse(int buttonIndex, long time) { int rating = buttonIndex + 1; if (exp.getDebug()) System.out.println("Rating: " + rating); exp.getCurrentBlock().addResponse(rating, time); sp.highlightResponse(buttonIndex); gui.setAcceptingResponses(false); } protected void nextStimuli(Block block){ if (!exp.hasRun() || exp.isRunning()) { //System.out.println(!exp.hasRun()); //System.out.println(exp.isRunning()); //System.out.println(exp.getCurrentBlock().getMidiPlayer().getSequencer().isRunning()); reportError("You haven't finished playing the melody yet."); } else if (exp.getCurrentBlock().getMelodyResults().countResponses() == 0) { reportError("Please select a number."); } else if (sp.unansweredQuestions()) reportError("There are unanswered questions."); else { showDefaultMessagePrompt(); // store results (and write to file) if (exp.getAskFamiliarity()) { String answer1 = (String)(sp.getQ1Box().getSelectedItem()); block.addMelodyQA("known", answer1); } else block.addMelodyQA("known", "-1"); if (exp.getAskLiking()) { String answer2 = (String)(sp.getQ2Box().getSelectedItem()); block.addMelodyQA("liked", answer2); } else block.addMelodyQA("liked", "-1"); block.storeMelodyResult(); results.writeResults(); // close the midi player block.getMidiPlayer().stop(); // 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"); sp.resetButtonBackgrounds(); } else { // ... write results and subject questionnaire results.writeResults(); gui.showCard("subject"); } } else { // ... next melody within block sp.resetButtonBackgrounds(); sp.setSongNumberText(); sp.defaultAnswers(); gui.setAcceptingResponses(false); block.initialiseBlock(); exp.runExperiment(); } } } }