Mercurial > hg > mep
view ExperimentController.java @ 47:be66ee2fe9fe
Added abstract class EndBlockPanel to deliver end of block messages (e.g. end of practice block).
Added and implemented EndTestPanel which gives "thank you for participating" etc message at end of test.
author | Carl Bussey <c.bussey@se10.qmul.ac.uk> |
---|---|
date | Thu, 13 Jun 2013 18:33:34 +0100 |
parents | 351b0c8b34ac |
children | f3261bd3dd49 |
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.*; public class ExperimentController implements ActionListener, KeyListener { /* variables */ ExperimentGui gui; Experiment exp; SubjectResults results; InstructionsPanel ip; StimulusPanel sp; SubjectDataPanel sdp; InterBlockPanel ibp; EndTestPanel etp; /* 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(); 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()) { System.exit(0); } // SubjectDataPanel else if (e.getSource() == sdp.getFinishButton()) { if (exp.getFinalQuestionnaire()) { if (sdp.allDataEntered()) { sdp.storeData(); results.writeSubjectData(); //System.exit(0); 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(); } } } }