View Javadoc

1   
2   package org.ximtec.igesture;
3   
4   import java.util.HashSet;
5   import java.util.Set;
6   import java.util.concurrent.Executor;
7   import java.util.concurrent.Executors;
8   import java.util.logging.Logger;
9   
10  import org.ximtec.igesture.core.ResultSet;
11  import org.ximtec.igesture.event.GestureHandler;
12  
13  /**
14   * @author Bjorn Puype, bpuype@gmail.com
15   *
16   */
17  public class MultimodalGestureManager implements GestureHandler{
18  	
19  	private static final int NUMBER_OF_THREADS = 6;
20  
21  	private static final Logger LOGGER = Logger.getLogger(MultimodalGestureManager.class.getName());
22  
23  	private Set<String> composingGestures;
24  	private Set<Recogniser> recognisers;
25  	private MultimodalGestureQueue queue;
26  	
27  	public MultimodalGestureManager(MultimodalGestureRecogniser recogniser)
28  	{
29  		composingGestures = recogniser.getComposingGestureClasses();
30  		recognisers = new HashSet<Recogniser>();
31  		queue = recogniser.getQueue();
32  	}
33  	
34  	public void addRecogniser(Recogniser recogniser, boolean mixed)
35  	{
36  		recogniser.addMultimodalGestureHandler(this);
37  		// add recogniser
38  		recognisers.add(recogniser);
39  		if(mixed == false)
40  			// set recogniser in multimodal mode
41  			recogniser.setMode(Recogniser.MULTIMODAL_MODE);
42  		else
43  			// set recogniser in mixed mode
44  			recogniser.setMode(Recogniser.MIXED_MODE);
45  	}
46  	
47  	public void removeRecogniser(Recogniser recogniser)
48  	{
49  		recogniser.removeMultimodalGestureHandler(this);
50  		// remove recogniser
51  		recognisers.remove(recogniser);
52  		// set recogniser in normal mode
53  		recogniser.setMode(Recogniser.NORMAL_MODE);
54  	}
55  	
56  	public void removeAllRecognisers()
57  	{
58  		for(Recogniser r : recognisers)
59  			removeRecogniser(r);
60  	}
61  	
62  	/* (non-Javadoc)
63  	 * @see org.ximtec.igesture.event.GestureHandler#handle(org.ximtec.igesture.core.ResultSet)
64  	 */
65  	@Override
66  	public void handle(ResultSet resultSet) {
67  
68  		//if the gesture is a composing gesture send it to the multimodal recogniser by putting it in the queue
69  		if(composingGestures.contains(resultSet.getGesture().getName()))
70  		{
71  			queue.push(resultSet);
72  		}
73  		else if(resultSet.getSource().getMode() != Recogniser.MIXED_MODE)//push it out
74  		{
75  			//in mixed mode, the clients of the recogniser are already notified by the source recogniser itself
76  			//therefore, it is not necessary to notify the clients again about the same event
77  			fireEvent(resultSet);
78  		}
79  	}
80  	
81  	
82     /**
83      * Fires an event and informs all registered gesture handlers.
84      * 
85      * @param resultSet the result set to be used as an argument for the fired
86      *            event.
87      */
88     protected void fireEvent(final ResultSet resultSet) {
89  	  
90  	  Executor executor = Executors.newFixedThreadPool(NUMBER_OF_THREADS);
91  	  for (final GestureHandler gestureHandler : resultSet.getSource().getGestureHandlers()) {
92  	     LOGGER.info("Handler: "+gestureHandler.getClass());
93  	     if (gestureHandler != null) {
94  	        executor.execute(new Runnable() {
95  	
96  	           @Override
97  	           public void run() {
98  	              gestureHandler.handle(resultSet);
99  	           }
100 	           
101 	        });
102 	     }
103 	  }
104    } // fireEvent
105 
106 }