package com.croftsoft.apps.exemplar; import java.util.*; import com.croftsoft.core.lang.*; import com.croftsoft.core.lang.lifecycle.Startable; import com.croftsoft.core.lang.lifecycle.Updatable; import com.croftsoft.core.math.MathConstants; /********************************************************************* * Exemplar model. * * Maintains program state. * * @version * $Id: Model.java,v 1.10 2006/06/22 13:46:22 croft Exp $ * @since * 2006-01-03 * @author * David Wallace Croft *********************************************************************/ public final class Model implements Accessor, Startable, Updatable ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// { // private final instance variables private final Queue requestQueue; private final Queue eventQueue; // model state instance variables private long clickCount; private double phase; private long lastUpdateTime; ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// public Model ( final Config config, final Queue requestQueue, final Queue eventQueue ) ////////////////////////////////////////////////////////////////////// { NullArgumentException.checkArgs ( config, this.requestQueue = requestQueue, this.eventQueue = eventQueue ); /* clickCount = config.getClickCountInit ( ); */ } ////////////////////////////////////////////////////////////////////// // interface Accessor methods ////////////////////////////////////////////////////////////////////// public long getClickCount ( ) { return clickCount; } public double getPhase ( ) { return phase; } ////////////////////////////////////////////////////////////////////// // lifecycle methods ////////////////////////////////////////////////////////////////////// public void start ( ) ////////////////////////////////////////////////////////////////////// { lastUpdateTime = System.nanoTime ( ); } public void update ( ) ////////////////////////////////////////////////////////////////////// { final long currentTime = System.nanoTime ( ); final long deltaTimeNanos = currentTime - lastUpdateTime; lastUpdateTime = currentTime; update ( deltaTimeNanos ); } ////////////////////////////////////////////////////////////////////// // private methods ////////////////////////////////////////////////////////////////////// private void update ( final long deltaTimeNanos ) ////////////////////////////////////////////////////////////////////// { Message message = null; while ( ( message = requestQueue.poll ( ) ) != null ) { final Message.Type type = message.getType ( ); switch ( type ) { case INCREMENT_CLICK_COUNT: clickCount++; eventQueue.offer ( Message.CLICK_COUNT_CHANGED_INSTANCE ); break; default: System.out.println ( getClass ( ).getName ( ) + ": " + "unknown message type: " + type ); } } phase += MathConstants.TWO_PI * 0.1 // frequency * deltaTimeNanos * MathConstants.SECONDS_PER_NANOSECOND; if ( phase >= MathConstants.TWO_PI ) { phase -= MathConstants.TWO_PI; } } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// }