/*
* (C) Copyright 2016 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*/
package com.fr3ts0n.ecu.gui.androbd;
import android.content.Context;
import android.os.Handler;
import com.fr3ts0n.prot.StreamHandler;
import java.net.InetSocketAddress;
import java.net.Socket;
/**
* Network communication service to allow connection to WIFI OBD adapters
* Created by fr3ts0n on 17.04.16.
*/
public class NetworkCommService
extends CommService
implements Runnable
{
public Socket mSocket;
/** communication stream handler */
public StreamHandler ser = new StreamHandler();;
public Thread serThread;
/** default constructor */
public NetworkCommService()
{
super();
}
/**
* Constructor. Prepares a new Network Communication session.
*
* @param context The UI Activity Context
* @param handler A Handler to send messages back to the UI Activity
*/
public NetworkCommService(Context context, Handler handler)
{
super(context, handler);
ser.setMessageHandler(elm);
}
@Override
public void start()
{
log.debug("start");
// set up protocol handlers
elm.addTelegramWriter(ser);
// create communication thread
serThread = new Thread(this);
serThread.start();
}
@Override
public void stop()
{
log.debug("stop");
elm.removeTelegramWriter(ser);
// close socket
try
{
mSocket.close();
} catch (Exception e)
{
log.error(e.getMessage());
}
setState(STATE.OFFLINE);
}
@Override
public void write(byte[] out)
{
// forward message to stream handler
ser.writeTelegram(new String(out).toCharArray());
}
@Override
public void run()
{
// run communication loop
ser.run();
// loop was finished -> we have lost connection
connectionLost();
}
/**
* Thread for connecting network device
* * required to eliminate android.os.NetworkOnMainThreadException
*/
protected class ConnectThread extends Thread
{
CommService svc;
String device;
int portNum = 23;
public ConnectThread(CommService svc, String device, int portNum)
{
this.svc = svc;
this.device = device;
this.portNum = portNum;
}
@Override
public void run()
{
log.info(String.format("Connecting to %s port %d", device, portNum));
setState(STATE.CONNECTING);
try
{
// create socket connection
mSocket = new Socket();
InetSocketAddress addr = new InetSocketAddress(device, portNum);
mSocket.connect(addr);
// set streams for stream handler
ser.setStreams(mSocket.getInputStream(), mSocket.getOutputStream());
// we are connected -> signal connection established
connectionEstablished(device);
// start communication service thread
svc.start();
} catch (Exception e)
{
log.error(e.getMessage());
connectionFailed();
}
}
}
/**
* Open network connection to device using specified port
* @param device address of device
* @param portNum port to connect to
*/
public void connect(Object device, int portNum)
{
new ConnectThread(this, String.valueOf(device), portNum).start();
}
@Override
public void connect(Object device, boolean secure)
{
connect(device, secure ? 23 : 22);
}
}