/*
 * Created on Dec 16, 2004
 */

package javax.realtime.test.bridge;

import javax.realtime.AbsoluteTime;
import javax.realtime.AsyncEvent;
import javax.realtime.AsyncEventHandler;
import javax.realtime.PeriodicTimer;
import javax.realtime.RealtimeThread;
import javax.realtime.RelativeTime;
import javax.realtime.ReleaseParameters;

import javax.realtime.DSS.DSS;
import javax.realtime.DSS.Terminator;

/**
 * @author gary
 */

public class OneWayBridge {

	public static void main(String[] args) {
		
		String choiceMode = "deterministic";
		
		if ( args.length > 0 ) {
			choiceMode = args[0];
		}

		try {		
			if ( DSS.usingJPF ) {
				System.out.println( "Running under JPF" );
			} else {
				System.out.println( "Running under native JVM" );			
			}
			Bridge bridge = new Bridge( "Bridge" );	

			CarArrivals carArrivals = 
				new CarArrivals( "Car arrivals", 1, bridge, 5 );
			carArrivals.initialize();
			
			// activation time chosen to avoid gratuitous nondeterminism
			DSS.activate( carArrivals, new AbsoluteTime( 0, 1 ) );
			
			AsyncEvent ae = new AsyncEvent();
			ae.bindTo( "Bridge observer created" );
			
			RealtimeThread bridgeReporter = 
				new BridgeReporter( "Bridge Reporter", bridge, 6, 0 );
			
			AsyncEventHandler brOverrunHandler = new AsyncEventHandler() {
				public void handleAsyncEvent() {
					DSS.printTime();
					System.out.println( "Bridge Reporter overrun handler fires" );
				}
			};
			
			RelativeTime cost = new RelativeTime( 10000, 0 );
			bridgeReporter.setReleaseParameters( 
					new ReleaseParameters( cost, null, brOverrunHandler, null ) );
			bridgeReporter.initialize();
			
			AsyncEventHandler aeh = new BridgeObserver( bridgeReporter );		
			ae.addHandler( aeh );		
			// use external event to trigger bridge observer
			DSS.causeHappening( "Bridge observer created" );
			
			AsyncEventHandler ptHandler = new AsyncEventHandler() {
				public void handleAsyncEvent() {
					DSS.printTime();
					System.out.println( "Periodic Timer fires" );
				}			
			};		
			PeriodicTimer pt = new PeriodicTimer( new AbsoluteTime( 0, 2 ), 
					new RelativeTime( 5, 0 ), ptHandler );
			
			RealtimeThread shutdown = new Terminator( new RelativeTime( 100, 0 ) );
			shutdown.initialize();
			DSS.activate( shutdown, new AbsoluteTime( 0, 3 ) );
			
			// all seed processes now initialized (passivated)				
			DSS.runSimulation( choiceMode );
		} catch ( Exception e ) {
			System.out.println( e );
			e.printStackTrace();
		}
	}
}

