es.udc.robotcontrol.testapp.comunication.RobotCommController.java Source code

Java tutorial

Introduction

Here is the source code for es.udc.robotcontrol.testapp.comunication.RobotCommController.java

Source

/*
 * Copyright (C) 2013 Amancio Daz Surez
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package es.udc.robotcontrol.testapp.comunication;

import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
import es.udc.robotcontrol.testapp.R;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * Servicio de comunicacin con el robot
 * Se encargar de abrir la conexin y lanzar tres hilos separados. Dos para leer y escribir del robot
 * y un tercero para recibir instrucciones en remoto (http get).
 *
 * Created by kerry on 2/06/13.
 */
public class RobotCommController {

    private Context ctx;
    public boolean continuar;

    private ConcurrentLinkedQueue<Comando> comandos;

    private long writeSleepTime;
    private long readSleepTime;
    private String reportUrl;

    private HiloEscritor escritor;
    private HiloLector lector;

    private ConectorPlaca conector;

    public RobotCommController(Context ctx) {
        this.ctx = ctx;
        Log.i(Constantes.TAG_SERVICIO, "Servicio robot creado");
        comandos = new ConcurrentLinkedQueue<Comando>();
        setReadSleepTime(1000);
        setWriteSleepTime(1000);
        Toast.makeText(ctx, R.string.robot_service_created, Toast.LENGTH_SHORT).show();
    }

    public void iniciar(Context ctx, Intent intent) {
        Log.i(Constantes.TAG_SERVICIO, "Iniciando controlador de robot");
        try {

            continuar = true;
            Log.i(Constantes.TAG_SERVICIO, "Creando conector Placa");
            conector = new ConectorPlaca();
            Log.i(Constantes.TAG_SERVICIO, "Conector placa creado. Llamando a conectar");
            conector.conectar(ctx, intent);
            Log.i(Constantes.TAG_SERVICIO, "La llamada a conectar ha tenido exito");

            Toast.makeText(ctx, R.string.robot_service_started, Toast.LENGTH_SHORT).show();

            Log.i(Constantes.TAG_SERVICIO, "Creando hilo escritor");
            escritor = new HiloEscritor(this);
            Log.i(Constantes.TAG_SERVICIO, "Creando hilo lector");
            lector = new HiloLector(this);

            Log.i(Constantes.TAG_SERVICIO, "Lanzando hilo lector");
            lector.start();
            Log.i(Constantes.TAG_SERVICIO, "Lanzando hilo escritor");
            escritor.start();
            Log.i(Constantes.TAG_SERVICIO, "Todos los hilos han sido lanzados. iniciar completado.");
        } catch (Exception ex) {
            Log.w(Constantes.TAG_SERVICIO, "Error iniciando conexion [ " + ex.getMessage() + " ] ", ex);
            Toast.makeText(ctx, R.string.robot_service_error_connection, Toast.LENGTH_SHORT).show();

        }
    }

    public void iniciarManual() {
        try {
            Log.i(Constantes.TAG_SERVICIO, "Iniciando controlador manualmente. No habr conexin");

            continuar = true;

            if (conector == null) {
                conector = new ConectorPlaca();
            }

            conector.conectarManual(this.ctx);
            Toast.makeText(ctx, R.string.robot_service_manual_started, Toast.LENGTH_SHORT).show();

            escritor = new HiloEscritor(this);
            lector = new HiloLector(this);

            lector.start();
            escritor.start();
        } catch (Exception ex) {
            Log.w(Constantes.TAG_SERVICIO, "Error iniciando conexion [ " + ex.getMessage() + " ] ", ex);
            String res = ctx.getResources().getString(R.string.robot_service_error_connection);
            String txt = String.format(res, ex.getMessage());
            Toast.makeText(ctx, txt, Toast.LENGTH_SHORT).show();
        }
    }

    public void terminar() {
        if (conector != null) {
            conector.desconectar();
        }
        continuar = false;
    }

    /**
     * Este metodo se utiliza para cargar la lista de comandos a enviar al mvil
     * Har un parsing de la lista y la enviar a la placa segn est configurado
     *
     * @param list
     */
    public void cargarPrograma(String[] list) {
        Programa p = Programa.construir(list);

        if (p.getReportUrl() != null) {
            setReportUrl(p.getReportUrl());
        }

        // Limpiamos la cola de envios
        if (p.isLimpiarCola()) {
            comandos.clear();
        }

        // Fijamos los tiempos para dormir los hilos trabajadores
        setReadSleepTime(p.readSleepTime());
        setWriteSleepTime(p.writeSleepTime());

        // Aadimos los nuevos comandos
        comandos.addAll(p.listaComandos());
    }

    public synchronized Comando getNextComando() {
        return comandos.poll();
    }

    public synchronized boolean continuarEscritor(HiloEscritor hs) {
        return (continuar && (escritor == hs));
    }

    public synchronized boolean continuarLector(HiloLector hl) {
        return (continuar && (lector == hl));
    }

    public void enviarComando(Comando c) {
        conector.escribir(c);
    }

    public synchronized byte[] leer() {
        return conector.leer();
    }

    public long getWriteSleepTime() {
        return writeSleepTime;
    }

    public void setWriteSleepTime(long writeSleepTime) {
        this.writeSleepTime = writeSleepTime;
    }

    public long getReadSleepTime() {
        return readSleepTime;
    }

    public void setReadSleepTime(long readSleepTime) {
        this.readSleepTime = readSleepTime;
    }

    public String getReportUrl() {
        return reportUrl;
    }

    public void setReportUrl(String reportUrl) {
        this.reportUrl = reportUrl;
    }
}

class HiloEscritor extends Thread {

    RobotCommController padre;

    public HiloEscritor(RobotCommController padre) {
        this.padre = padre;
    }

    @Override
    public void run() {
        while (padre.continuarEscritor(this)) {
            Comando c = padre.getNextComando();
            padre.enviarComando(c);
            try {
                sleep(padre.getWriteSleepTime());
            } catch (InterruptedException ie) {
                Log.w(Constantes.TAG_SERVICIO, "InterruptedException en el escritor");
            } catch (Exception ex) {
                Log.w(Constantes.TAG_SERVICIO, "Exception en hilo escritor ", ex);
                padre.continuar = false;
            }
        }
        Log.i(Constantes.TAG_SERVICIO, "Hilo escritor terminando");
    }

}

class HiloLector extends Thread {

    RobotCommController padre;

    public HiloLector(RobotCommController padre) {
        this.padre = padre;
    }

    @Override
    public void run() {
        while (padre.continuarLector(this)) {
            try {
                byte[] leido = padre.leer();
                if (leido != null) {
                    Log.i(Constantes.TAG_SERVICIO, "Leidos [ " + leido.length + " ] bytes");
                    try {
                        // Parsear la lectura
                        SensorInfo info = new SensorInfo(leido);
                        // Publicarla
                        String base = padre.getReportUrl();
                        if (base != null) {
                            base = base + info.toUrlFormat();
                            HttpClient httpClient = new DefaultHttpClient();
                            HttpGet get = new HttpGet(base);
                            get.setHeader("content-type", "application/json");
                            httpClient.execute(get);
                        }
                    } catch (Exception e) {
                        Log.w("Error informando", e);
                        StringBuilder sb = new StringBuilder();
                        for (int x = 0; x < leido.length; x++) {
                            sb.append("byte [ " + x + " ] = (" + leido[x] + ")");
                        }
                        Log.w(Constantes.TAG_SERVICIO, "Leido => " + sb.toString());
                    }
                } else {
                    Log.i(Constantes.TAG_SERVICIO, "Nada que leer");
                }
                try {
                    sleep(padre.getReadSleepTime());
                } catch (InterruptedException ie) {
                    Log.w(Constantes.TAG_SERVICIO, "InterruptedException en el lector");
                }
            } catch (Exception ex) {
                Log.w(Constantes.TAG_SERVICIO, "Exception en hilo lector", ex);
                padre.continuar = false;
            }
        }

        Log.i(Constantes.TAG_SERVICIO, "Hilo lector terminando");
    }

}