
class SignalProcessingSystem {
	//Private Variables
	private Processor p1, p2;
	private Buffer b1, b2;
	
	
	//Constructors
	public SignalProcessingSystem(int capacity1, int capacity2){
		p1 = new Processor();
		p2 = new Processor();
		b1 = new Buffer(capacity1);
		b2 = new Buffer(capacity2);
	}
	
	
	//Public methods
	public void simulate(double simulationLength, double meanInterArrivalTime, double meanProcessingTime1, double meanProcessingTime2){
		Signal currentSignal = null;
		Signal nextSignal = new Signal(meanInterArrivalTime, meanProcessingTime1, meanProcessingTime2);	//initialize with first signal
		Signal nextInQ;
		double nextArrival = 0;			//The time that the next signal arrives
		double processor1Finished;	//The time processor 1 finishes processicing the current Signal
		double processor2Finished;	//The time processor 2 finishes processicing the current Signal
		while(nextArrival < Double.POSITIVE_INFINITY){
			//find time next signal arrives
			nextArrival = nextSignal.getArrivalTime();
			//find time processors 1 & 2 finish processing current Signal
			if(currentSignal!=null){
				processor1Finished = currentSignal.getProcessingTime1();
				processor2Finished = currentSignal.getProcessingTime2();
			}
			else{
				processor1Finished = Double.POSITIVE_INFINITY;
				processor2Finished = Double.POSITIVE_INFINITY;
			}
			
			//if next signal arrives first
			if(nextArrival < processor1Finished && nextArrival < processor2Finished){
				//if b1 is full, signal is lost
				if(b1.isFull()){
					//lose signal
				}
				//if p1 is idle, process the signal
				if(p1.isIdle()){
					p1.process(nextSignal);
				}
				//if p1 isn't idle, add to buffer
				if(!p1.isIdle()){
					b1.add(nextSignal);
				}
				//generate next signal
				currentSignal = nextSignal;
				nextSignal = new Signal(meanInterArrivalTime, meanProcessingTime1, meanProcessingTime2);
				//if next arrival time > simulation length, set signal to null
				if(nextSignal.getArrivalTime() > simulationLength){
					nextSignal = null;
					nextArrival = Double.POSITIVE_INFINITY;
				}
			}
			
			//if processor 1 finishes first
			else if (processor1Finished < nextArrival && processor1Finished < processor2Finished){
				//call p1.finish
				p1.finish();
				//if b1 isn't empty, process next signal
				if(!b1.isEmpty()){
					nextInQ = b1.remove();
					p1.process(nextInQ);
					//send finished signal to p2
					//if b2 is full, lose signal
					if(b2.isFull()){
						//lose signal
					}
					//if p2 is idle, process signal
					if(p2.isIdle()){
						p2.process(nextInQ);
					}
					//if p2 isn't idle, and b2 isn't full, add to b2
					if(!b2.isFull() && !p2.isIdle()){
						b2.add(nextInQ);
					}
				
				}
			}
			
			//if processor 2 finishes first
			else{
				//call p2.finish
				p2.finish();
				//if b2 isn't empty, process next signal
				if(!b2.isEmpty()){
					nextInQ = b2.remove();
					p2.process(nextInQ);
					//get stats from processed signal
				}
			}
		}
		//calculate and display stats
	}
}
