001        package com.croftsoft.apps.infant;
002         
003        import java.awt.event.*;
004        import java.util.*;
005    
006        import net.java.games.input.Component;
007        import net.java.games.input.Controller;
008        import net.java.games.input.ControllerEnvironment;
009    
010        import com.croftsoft.core.gui.controller.NilController;
011        import com.croftsoft.core.lang.NullArgumentException;
012        import com.croftsoft.core.util.log.Log;
013    
014        /***********************************************************************
015        * Modifies model based on user input.
016        * 
017        * @version
018        *   $Id: InfantController.java,v 1.28 2007/12/01 00:51:07 croft Exp $
019        * @since
020        *   2005-03-16
021        * @author
022        *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
023        ***********************************************************************/
024    
025        public final class  InfantController
026          extends NilController
027        ////////////////////////////////////////////////////////////////////////
028        ////////////////////////////////////////////////////////////////////////
029        {
030    
031        private final InfantConfig          infantConfig;
032    
033        private final Queue<InfantMessage>  requestQueue;
034    
035        //
036    
037        private Controller  pacifierController;
038    
039        private boolean
040          displayRequested,
041          experimentEndRequested,
042          pacifierPreviouslyPressed,
043          pacifierReleased,
044          resetRequested,
045          saveFilenameRequested;
046    
047        private int  controllerIndex;
048    
049        ////////////////////////////////////////////////////////////////////////
050        ////////////////////////////////////////////////////////////////////////
051    
052        public  InfantController (
053          final InfantConfig          infantConfig,
054          final Queue<InfantMessage>  requestQueue )
055        ////////////////////////////////////////////////////////////////////////
056        {
057          NullArgumentException.checkArgs (
058            this.infantConfig = infantConfig,
059            this.requestQueue = requestQueue );
060    
061          selectController ( );
062        }
063    
064        ////////////////////////////////////////////////////////////////////////
065        ////////////////////////////////////////////////////////////////////////
066    
067        @Override     
068        public void  actionPerformed ( final ActionEvent  actionEvent )
069        ////////////////////////////////////////////////////////////////////////
070        {
071          final String  actionCommand = actionEvent.getActionCommand ( );
072    
073          if ( actionCommand.equals (
074            InfantMessage.Type.STIMULUS_WINDOW_OPEN.name ( ) ) )
075          {
076            this.displayRequested = true;
077          }
078          else if ( actionCommand.equals (
079            InfantMessage.Type.EXPERIMENT_BEGIN.name ( ) ) )
080          {
081            this.resetRequested = true;
082          }
083          else if ( actionCommand.equals (
084            InfantMessage.Type.EXPERIMENT_END.name ( ) ) )
085          {
086            experimentEndRequested = true;
087          }
088          else if ( actionCommand.equals (
089            InfantMessage.Type.LOAD_SETUP.name ( ) ) )
090          {
091            requestQueue.offer (
092              new InfantMessage ( InfantMessage.Type.LOAD_SETUP ) ); 
093          }
094          else if ( actionCommand.equals (
095            InfantMessage.Type.REQUEST_SAVE_FILENAME.name ( ) ) )
096          {
097            saveFilenameRequested = true;
098          }
099          else
100          {
101            this.infantConfig.getLog ( ).record (
102              "InfantController:  unknown command:  " + actionCommand );
103          }
104        }
105    
106        @Override     
107        public void  keyReleased ( final KeyEvent  keyEvent )
108        ////////////////////////////////////////////////////////////////////////
109        {
110          final int  keyCode = keyEvent.getKeyCode ( );
111    
112          if ( keyCode == KeyEvent.VK_SPACE )
113          {
114            pacifierReleased = true;
115          }
116          else
117          {
118            experimentEndRequested = true;
119          }
120        }
121    
122        ////////////////////////////////////////////////////////////////////////
123        ////////////////////////////////////////////////////////////////////////
124    
125        @Override
126        public void  update ( )
127        ////////////////////////////////////////////////////////////////////////
128        {
129          final boolean  pacifierCurrentlyPressed = pollPacifier ( );
130    
131          if ( pacifierPreviouslyPressed
132            && !pacifierCurrentlyPressed )
133          {
134            pacifierReleased = true;
135          }
136    
137          pacifierPreviouslyPressed = pacifierCurrentlyPressed;
138    
139          if ( displayRequested )
140          {
141            displayRequested = !requestQueue.offer (
142              new InfantMessage ( InfantMessage.Type.STIMULUS_WINDOW_OPEN ) );
143          }
144    
145          if ( pacifierReleased )
146          {
147            pacifierReleased = !requestQueue.offer (
148              new InfantMessage ( InfantMessage.Type.PACIFIER ) );
149          }
150    
151          if ( resetRequested )
152          {
153            resetRequested = !requestQueue.offer (
154              new InfantMessage ( InfantMessage.Type.EXPERIMENT_BEGIN ) );
155          }
156    
157          if ( experimentEndRequested )
158          {
159            experimentEndRequested = !requestQueue.offer (
160              new InfantMessage ( InfantMessage.Type.EXPERIMENT_END ) );
161          }
162    
163          if ( saveFilenameRequested )
164          {
165            saveFilenameRequested = !requestQueue.offer (
166              new InfantMessage (
167                InfantMessage.Type.REQUEST_SAVE_FILENAME ) );
168          }
169        }
170    
171        ////////////////////////////////////////////////////////////////////////
172        // private methods
173        ////////////////////////////////////////////////////////////////////////
174    
175        private void  selectController ( )
176        ////////////////////////////////////////////////////////////////////////
177        {
178          controllerIndex = infantConfig.getControllerIndex ( );
179    
180          final Log  log = infantConfig.getLog ( );
181    
182          Controller  pacifierController = null;
183    
184          try
185          {
186            final ControllerEnvironment  controllerEnvironment
187            = ControllerEnvironment.getDefaultEnvironment ( );
188    
189            final Controller [ ]  controllers
190            = controllerEnvironment.getControllers ( );
191    
192            for ( int  i = 1; i <= controllers.length; i++ )
193            {
194              final Controller  controller = controllers [ i - 1 ];
195    
196              if ( i == controllerIndex )
197              {
198                log.record ( i + " / " + controller.getType ( ) + " / "
199                  + controller.getName ( ) );
200    
201                if ( Controller.Type.STICK.equals ( controller.getType ( ) ) )
202                {           
203                  pacifierController = controller;
204                }
205                else
206                {
207                  log.record (
208                    "Controller is not of type " + Controller.Type.STICK );
209                }
210              }
211            }
212          }
213          catch ( Exception  ex )
214          {
215            ex.printStackTrace ( );
216          }
217    
218          if ( pacifierController != null )
219          {
220            log.record ( "Using controller " + controllerIndex + " / "
221              + pacifierController.getType ( ) + " / "
222              + pacifierController.getName ( ) );
223          }
224          else
225          {
226            log.record ( "Controller not configured (use spacebar to test)" );
227          }
228    
229          this.pacifierController = pacifierController;
230        }
231    
232        /***********&***********************************************************
233        * Polls the pacifier.
234        * 
235        * @return
236        * 
237        *   True if the pacifier is currently pressed.
238        ***********************************************************************/
239        private boolean  pollPacifier ( )
240        ////////////////////////////////////////////////////////////////////////
241        {
242          if ( controllerIndex != infantConfig.getControllerIndex ( ) )
243          {
244            selectController ( );
245          }
246    
247          if ( pacifierController == null )
248          {
249            return false;
250          }
251    
252          final Component [ ]  components
253          = pacifierController.getComponents ( );
254    
255          if ( components == null )
256          {
257            return false;
258          }
259    
260          final Float [ ]  floats = new Float [ components.length ];
261    
262          String  format = "";
263    
264          for ( int  i = 0; i < components.length; i++ )
265          {
266            format += "%" + ( i + 1 ) + "$+1.3f ";
267          }
268    
269          format += "%n";
270    
271          if ( !pacifierController.poll ( ) )
272          {
273            return false;
274          }
275    
276          for ( int  i = 0; i < components.length; i++ )
277          {
278            Component  component = components [ i ];
279    
280            floats [ i ] = new Float ( component.getPollData ( ) );
281          }
282    
283    //    System.out.printf ( format, ( Object [ ] ) floats );
284    
285          if ( ( floats.length > 2  )
286            && ( floats [ 2 ].floatValue ( ) < 0.5 ) )
287          {
288            return true; 
289          }
290    
291          return false;
292        }
293    
294        ////////////////////////////////////////////////////////////////////////
295        ////////////////////////////////////////////////////////////////////////
296        }