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;
}
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
}