/*
 * Sleep.java
 *
 * Created on 27 of July 2015, 15:57
 */
/**
 *
 * @author Paulo Roque Silva
 */
import java.util.Iterator;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class Sleep implements Runnable {

	Signal				signInput; // Guarda a entrada bus
    Neuron          	[][]time; // Neur�nio por sentido
    Iterator<Signal> 	listen; // L� o bus
    CyclicBarrier 		sleepBarrier; // Barreira de passos
    int 				me; // O pr�prio neur�nio

    public Sleep(CyclicBarrier barrSono,
    		Neuron [][]tneurons, int who) {

    	sleepBarrier = barrSono;
    	time 		 = tneurons;
    	me = who;
    	}
    
    public void write(int w, float a, int q) {
    	
		Brain.BusSleepOut.add(new Signal(w, a, q));
    }
    
    public void write2(int w, float a, int q) {
    	
		Brain.BusSleepOut2.add(new Signal(w, a, q));
    }
    
    public void runSono() {
    	int i;
    	
    	try {
            sleepBarrier.await();
        }
        catch(InterruptedException e) {
                e.printStackTrace();
            }
        catch (BrokenBarrierException ex) { 
            return;
        }
    	listen = Brain.BusSleepPreviews.iterator();
    	if (listen.hasNext())
        	while (listen.hasNext()) { // L� entrada bus
            	signInput = listen.next();
            	if (!time[me][0].newLearn(
            			Math.abs(signInput.emitter)))
            		// "Ouvindo"
    				write(me, signInput.actPower,
    						signInput.pleasure +
    						time[me][Brain.ProSelf].
    						finalQuality);
        	}
    	listen = Brain.BusSleepPreviews2.iterator();
    	if (listen.hasNext())
        	while (listen.hasNext()) { // L� entrada bus
            	signInput = listen.next();
            	if (signInput.emitter == me) // "Ouvindo"
                	for (i=0; i<time[me][0].learn.size();
                			i++)
        				write2(time[me][0].getLearn(i).
        						emitter, signInput.actPower,
        						signInput.pleasure +
        						time[me][Brain.ProSelf].
        						finalQuality);
        	}
    	if (time[me][0].standby2) { // Se em espera
       		time[me][0].standby2 = false;
        	time[me][0].addLearn(Math.abs(Cortex.lastExec),
        			0, time[Math.abs(Cortex.lastExec)]
        					[Brain.ProSelf].finalQuality);
        	System.out.print("Cortex.lastExec= "); //REMOVER
        	System.out.println(Cortex.lastExec); //REMOVER
    	}
    }

    public void run() {
        
		while(!sleepBarrier.isBroken() && !Neuron.end) {
    		runSono();
    	}
    }
}