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();
            }
        }
    }
}