/* @file VirtualDistoXComm.java
*
* @author marco corvi
* @date jun 2016
*
* @brief TopoDroid - DistoX_server communication
* --------------------------------------------------------
* Copyright This sowftare is distributed under GPL-3.0 or later
* See the file COPYING.
* --------------------------------------------------------
*/
package com.topodroid.DistoX;
import java.nio.ByteBuffer;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.EOFException;
import java.io.UnsupportedEncodingException;
import java.util.UUID;
import java.util.List;
import java.util.ArrayList;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import android.content.Context;
import android.content.ComponentName;
import android.content.ServiceConnection;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.IBinder;
// import android.os.Parcelable;
import android.os.ParcelUuid;
// import android.os.AsyncTask;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.BroadcastReceiver;
import android.database.DataSetObserver;
// import android.widget.Toast;
import android.util.Log;
public class VirtualDistoXComm extends TopoDroidComm
{
private String mAddress;
private VirtualDistoX mServer;
// private static final byte CALIB_BIT = (byte)0x08;
// public byte[] mCoeff;
// -----------------------------------------------------------
VirtualDistoXComm( TopoDroidApp app, VirtualDistoX server )
{
super( app );
mAddress = Device.ZERO_ADDRESS;
mServer = server;
// Log.v( "DistoX", "VD Comm cstr. address " + mAddress );
}
// public void resume()
// {
// // if ( mRfcommThread != null ) { mRfcommThread.resume(); }
// }
// public void suspend()
// {
// // if ( mRfcommThread != null ) { mRfcommThread.suspend(); }
// }
// --------------------------------------------------------
public void disconnectRemoteDevice( )
{
super.disconnectRemoteDevice();
mServer.unbindServer();
// Log.v( "DistoX", "VD comm disconnect remote");
}
/** Toggle device calibration mode
* @param address device address
* @param type device type
* @return
*/
public boolean toggleCalibMode( String address, int type )
{
// Log.v("DistoX", "VD comm toggleCalibMode");
boolean ret = false;
if ( createSocket() ) {
byte[] result = new byte[4];
if ( mProtocol.read8000( result ) ) {
if ( (result[0] & CALIB_BIT) == 0 ) {
ret = mProtocol.sendCommand( (byte)0x31 ); // TOGGLE CALIB ON
} else {
ret = mProtocol.sendCommand( (byte)0x30 ); // TOGGLE CALIB OFF
}
}
destroySocket();
}
return ret;
}
public boolean writeCoeff( String address, byte[] coeff )
{
// Log.v("DistoX", "VD comm writeCoeff");
boolean ret = false;
if ( createSocket() ) {
ret = mProtocol.writeCalibration( mCoeff );
destroySocket();
}
return ret;
}
// called only by CalibReadTask
public boolean readCoeff( String address, byte[] coeff )
{
// Log.v("DistoX", "VD comm readCoeff");
boolean ret = false;
if ( createSocket() ) {
ret = mProtocol.readCalibration( coeff );
destroySocket();
}
return ret;
}
// low-level memory read
// called by TopoDroidApp.readMemory
byte[] readMemory( String address, int addr )
{
// Log.v("DistoX", "VD comm readMemory");
return null;
}
// ------------------------------------------------------------------------------------
// CONTINUOUS DATA DOWNLOAD
public boolean connectDevice( String address, Handler /* ILister */ lister ) // FIXME LISTER
{
// Log.v("DistoX", "VD comm connect device");
if ( createSocket() ) {
startRfcommThread( -2, lister );
return true;
}
return false;
}
public void disconnect()
{
// Log.v("DistoX", "VD comm disconnectDevice");
cancelRfcommThread();
destroySocket();
}
private boolean createSocket( )
{
if ( mServer != null ) {
mServer.bindServer( );
DataInputStream in = mServer.getInputStream();
DataOutputStream out = mServer.getOutputStream();
if ( in != null && out != null ) {
mProtocol = new DistoXProtocol( in, out, mApp.mDevice );
return true;
} else {
clearServer();
return false;
}
} else {
TDLog.Error("VD comm create socket - server null");
}
clearServer();
return false;
}
private void destroySocket()
{
// Log.v("DistoX", "VD comm destroy socket");
clearServer();
}
private void clearServer()
{
// Log.v("DistoX", "VD comm unbind server");
if ( mServer != null ) mServer.unbindServer( );
}
protected boolean startRfcommThread( int to_read, Handler /* ILister */ lister ) // FIXME LISTER
{
// Log.v( "DistoX", "VD start RFcomm thread: to_read " + to_read );
if ( mServer != null ) {
if ( mRfcommThread == null ) {
mRfcommThread = new RfcommThread( mProtocol, to_read, lister );
mRfcommThread.start();
// TDLog.Log( TDLog.LOG_COMM, "startRFcommThread started");
} else {
// Log.v("DistoX", "VD startRFcommThread already running");
}
return true;
} else {
mRfcommThread = null;
// Log.e("DistoX", "VD startRFcommThread: unbound server");
return false;
}
}
// -------------------------------------------------------------------------------------
// ON-DEMAND DATA DOWNLOAD
public int downloadData( String address, Handler /* ILister */ lister ) // FIXME LISTER
{
int ret = 0;
// Log.v("DistoX", "VD comm download data");
if ( createSocket() ) {
// download with timeout
startRfcommThread( -1, lister );
while ( mRfcommThread != null ) {
try { Thread.sleep( 100 ); } catch ( InterruptedException e ) { }
}
ret = nReadPackets;
destroySocket();
}
return ret;
}
// ====================================================================================
};