Skip to content
Snippets Groups Projects
Manager.java 5.31 KiB
Newer Older
Aylen Ricca's avatar
Aylen Ricca committed
package uy.edu.fing.chesstrack.modulovision;

Aylen Ricca's avatar
Aylen Ricca committed
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

Aylen Ricca's avatar
Aylen Ricca committed
import org.opencv.core.CvType;
import org.opencv.core.Mat;
Aylen Ricca's avatar
Aylen Ricca committed
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
Aylen Ricca's avatar
Aylen Ricca committed

Aylen Ricca's avatar
Aylen Ricca committed
import uy.edu.fing.chesstrack.ajedrez.Logica;
Nicolas Furquez's avatar
Nicolas Furquez committed
import uy.edu.fing.chesstrack.communication.Client;
import uy.edu.fing.chesstrack.modulomodelador.Modelador;
Aylen Ricca's avatar
Aylen Ricca committed
import android.media.AudioManager;
import android.media.ToneGenerator;
Aylen Ricca's avatar
Aylen Ricca committed
import android.os.Environment;
Aylen Ricca's avatar
Aylen Ricca committed
import android.util.Log;

Aylen Ricca's avatar
Aylen Ricca committed
public class Manager {

Aylen Ricca's avatar
Aylen Ricca committed
	private static final String TAG = "CHESSTRACK::MANAGER";
Aylen Ricca's avatar
Aylen Ricca committed
	private static Manager _instance;
Aylen Ricca's avatar
Aylen Ricca committed
	private static final int ARMANDO_TABLERO = 0;
	private static final int JUGANDO = 1;
	private static final int OK = 1;
	private static final int NOT = 0;
	private static final String WELCOME_MSG = ""
			+ "--------------------------------------------------------------------------\n"
			+ "  .:: CHESSTRACK ::. seguimiento de una partida de Ajedrez\n"
			+ "\n"
Aylen Ricca's avatar
Aylen Ricca committed
			+ "                                                              TImag 2014\n"
Aylen Ricca's avatar
Aylen Ricca committed
			+ "                                           Nicolas Furquez - Aylen Ricca\n"
			+ "--------------------------------------------------------------------------\n";

Aylen Ricca's avatar
Aylen Ricca committed
	private static int _estado;
Aylen Ricca's avatar
Aylen Ricca committed
	private static int _salida;
	private static Adquisicion _adquisicion;
	private static Client _client;
Aylen Ricca's avatar
Aylen Ricca committed
	private static DetectorOclusion _detectorOclusion;
	private static Modelador _modelador;
Aylen Ricca's avatar
Aylen Ricca committed
	private static Logica _logica;
Nicolas Furquez's avatar
Nicolas Furquez committed
	private final boolean _debug;
Aylen Ricca's avatar
Aylen Ricca committed
	private int _cantJugada;
Aylen Ricca's avatar
Aylen Ricca committed

	protected Manager() {
Aylen Ricca's avatar
Aylen Ricca committed
		_estado = ARMANDO_TABLERO;
Aylen Ricca's avatar
Aylen Ricca committed
		_salida = NOT;
		_adquisicion = null;
		_client = null;
Nicolas Furquez's avatar
Nicolas Furquez committed
		_debug = false;
Aylen Ricca's avatar
Aylen Ricca committed
		_cantJugada = 0;
Aylen Ricca's avatar
Aylen Ricca committed
	}

	public static Manager getInstance() {
		if (_instance == null) {
			_instance = new Manager();
		}
		return _instance;
	}

	public static int get_estado() {
		return _estado;
	}

	public static void set_estado(int _estado) {
		Manager._estado = _estado;
	}

Aylen Ricca's avatar
Aylen Ricca committed
	public void setConnection(String ip, int port) {
		Log.i(TAG, "Setting connection");
		_client = Client.getInstance();
		_client.EstablishConnection(ip, port);
		_client.SendData(WELCOME_MSG);
		_salida = OK;
	}

	public boolean calibrar(Mat frame) {
		Log.i(TAG, "Calibrando");
		if (Calibracion.getInstance().calibrar(frame)) {
			ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM,
					50);
			toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); // ms
			if (_salida == OK) {
				_client.SendData("FIN calibrar\n . . . armando tablero!\n");
			}
			try {
				_adquisicion = new Adquisicion();
				_modelador = new Modelador();
Aylen Ricca's avatar
Aylen Ricca committed
				_logica = new Logica();
			} catch (Exception e) {
				e.printStackTrace();
				return false;
			}
			return true;
		}
		Log.i(TAG, "No calibrado");
		ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50);
		toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 700);
		return false;
	}

Aylen Ricca's avatar
Aylen Ricca committed
	public void iniciarJuego() {
		_estado = JUGANDO;
		// beep
		_detectorOclusion = new DetectorOclusion();
		ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50);
		toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); // ms

		if (_salida == OK) {
			Mat tableroInicio = _logica.getTableroInicio();
			_client.SendData("TableroINICIO!\n");
			_client.SendData(" ".concat(tableroInicio.dump().concat("\n")));
		}
	}

Aylen Ricca's avatar
Aylen Ricca committed
	public Mat processFrame(Mat inputFrame) {
		Log.i(TAG, "Acondicionamiento");
		Mat region = _adquisicion.processFrame(inputFrame);

		Log.i(TAG, "TYPE=" + (inputFrame.type() == CvType.CV_8UC4));
		Log.i(TAG, "CHANNEL=" + (inputFrame.channels() == 4));
Aylen Ricca's avatar
Aylen Ricca committed

		switch (_estado) {
		case ARMANDO_TABLERO:
			Log.i(TAG, "Armando Tablero");
Aylen Ricca's avatar
Aylen Ricca committed
			Mat nuevo = _modelador.getMatrizFichas(region);
			if (_logica.validarTableroArmado(nuevo)) {
				iniciarJuego();
			}
Aylen Ricca's avatar
Aylen Ricca committed
			break;
		case JUGANDO:
			Log.i(TAG, "Jugando");
Aylen Ricca's avatar
Aylen Ricca committed
			//if (_detectorOclusion.hayNuevoTableroValido(region)) {
Aylen Ricca's avatar
Aylen Ricca committed
				Log.i(TAG, "Tablero Valido");
				// llamar al modelador
				Mat aux = _modelador.getMatrizFichas(region);
Aylen Ricca's avatar
Aylen Ricca committed
				// Log.i(TAG, "MATRIZ=" + aux.dump());
Aylen Ricca's avatar
Aylen Ricca committed
				region = _modelador.dibujarEscaquesSobel(1);
				SaveImage(region);
Aylen Ricca's avatar
Aylen Ricca committed

				if (_logica.validarNuevoTablero(aux)) {
					if (_salida == OK) {
Aylen Ricca's avatar
Aylen Ricca committed
						_client.SendData("Nuevo Tablero Valido = ["
								+ String.valueOf(_cantJugada) + "]\n");
Aylen Ricca's avatar
Aylen Ricca committed
						_cantJugada++;
						_client.SendData(" ".concat(aux.dump().concat("\n")));
					}
Aylen Ricca's avatar
Aylen Ricca committed
			//}
Aylen Ricca's avatar
Aylen Ricca committed
			break;
		}
Aylen Ricca's avatar
Aylen Ricca committed
		if (_debug) {
Aylen Ricca's avatar
Aylen Ricca committed
			Log.i(TAG, "DEBUG");
Aylen Ricca's avatar
Aylen Ricca committed
			Mat tmp = Mat.zeros(inputFrame.size(), CvType.CV_8UC4);
			Mat matTMP = tmp.submat(Calibracion.getRectROI());
			region.copyTo(matTMP);
			return tmp;
		}
		return inputFrame;
Aylen Ricca's avatar
Aylen Ricca committed
	}

	public void destroy() {
		if (_client != null) {
			_client.Stop();
		}
	}
Aylen Ricca's avatar
Aylen Ricca committed
	
	public void SaveImage (Mat mat) {
		   Mat mIntermediateMat = new Mat();
		   Imgproc.cvtColor(mat, mIntermediateMat, Imgproc.COLOR_RGBA2BGR, 3);

		   File path = new File(Environment.getExternalStorageDirectory() + "/DCIM/");
		   path.mkdirs();
		   String timeStamp = Integer.toString(_cantJugada++);
		   File file = new File(path, "image".concat(timeStamp).concat(".png"));
		   
		   String filename = file.toString();
		   Boolean bool = Highgui.imwrite(filename, mIntermediateMat);

		   if (bool)
		    Log.i(TAG, "SUCCESS writing image to external storage");
		   else
		    Log.i(TAG, "Fail writing image to external storage");
		}
Aylen Ricca's avatar
Aylen Ricca committed
}