forked from upstream-mirrors/OpenTracks
1315 lines
36 KiB
Java
1315 lines
36 KiB
Java
/*
|
|
* Copyright 2010 Dynastream Innovations Inc.
|
|
*
|
|
* 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 com.dsi.ant;
|
|
|
|
import com.dsi.ant.exception.AntInterfaceException;
|
|
import com.dsi.ant.exception.AntRemoteException;
|
|
import com.dsi.ant.exception.AntServiceNotConnectedException;
|
|
|
|
import android.content.ComponentName;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.ServiceConnection;
|
|
import android.net.Uri;
|
|
import android.os.IBinder;
|
|
import android.os.RemoteException;
|
|
import android.util.Log;
|
|
|
|
import java.util.Arrays;
|
|
|
|
/**
|
|
* Public API for controlling the Ant Service. AntInterface is a proxy
|
|
* object for controlling the Ant Service via IPC. Creating a AntInterface
|
|
* object will create a binding with the Ant service.
|
|
*
|
|
* @hide
|
|
*/
|
|
public class AntInterface {
|
|
|
|
/** The Log Tag. */
|
|
public static final String TAG = "ANTInterface";
|
|
|
|
/** Enable debug logging. */
|
|
public static boolean DEBUG = false;
|
|
|
|
/** Search string to find ANT Radio Proxy Service in the Android Marketplace */
|
|
private static final String MARKET_SEARCH_TEXT_DEFAULT = "ANT Radio Service Dynastream Innovations Inc";
|
|
|
|
/** Name of the ANT Radio shared library */
|
|
private static final String ANT_LIBRARY_NAME = "com.dsi.ant.antradio_library";
|
|
|
|
/** Inter-process communication with the ANT Radio Proxy Service. */
|
|
private static IAnt_6 sAntReceiver = null;
|
|
|
|
/** Singleton instance of this class. */
|
|
private static AntInterface INSTANCE;
|
|
|
|
/** Used when obtaining a reference to the singleton instance. */
|
|
private static Object INSTANCE_LOCK = new Object();
|
|
|
|
/** The context to use. */
|
|
private Context sContext = null;
|
|
|
|
/** Listens to changes to service connection status. */
|
|
private ServiceListener sServiceListener;
|
|
|
|
/** Is the ANT Radio Proxy Service connected. */
|
|
private static boolean sServiceConnected = false;
|
|
|
|
/** The version code (eg. 1) of ANTLib used by the ANT application service */
|
|
private static int mServiceLibraryVersionCode = 0;
|
|
|
|
/** Has support for ANT already been checked */
|
|
private static boolean mCheckedAntSupported = false;
|
|
|
|
/** Is ANT supported on this device */
|
|
private static boolean mAntSupported = false;
|
|
|
|
/**
|
|
* An interface for notifying AntInterface IPC clients when they have
|
|
* been connected to the ANT service.
|
|
*
|
|
* @see ServiceEvent
|
|
*/
|
|
public interface ServiceListener
|
|
{
|
|
/**
|
|
* Called to notify the client when this proxy object has been
|
|
* connected to the ANT service. Clients must wait for
|
|
* this callback before making IPC calls on the ANT
|
|
* service.
|
|
*/
|
|
public void onServiceConnected();
|
|
|
|
/**
|
|
* Called to notify the client that this proxy object has been
|
|
* disconnected from the ANT service. Clients must not
|
|
* make IPC calls on the ANT service after this callback.
|
|
* This callback will currently only occur if the application hosting
|
|
* the BluetoothAg service, but may be called more often in future.
|
|
*/
|
|
public void onServiceDisconnected();
|
|
}
|
|
|
|
|
|
//Constructor
|
|
/**
|
|
* Instantiates a new ant interface.
|
|
*
|
|
* @param context the context
|
|
* @param listener the listener
|
|
* @since 1.0
|
|
*/
|
|
private AntInterface(Context context, ServiceListener listener)
|
|
{
|
|
// This will be around as long as this process is
|
|
sContext = context;
|
|
sServiceListener = listener;
|
|
}
|
|
|
|
/**
|
|
* Gets the single instance of AntInterface, creating it if it doesn't exist.
|
|
* Only the initial request for an instance will have context and listener set to the requested objects.
|
|
*
|
|
* @param context the context used to bind to the remote service.
|
|
* @param listener the listener to be notified of status changes.
|
|
* @return the AntInterface instance.
|
|
* @since 1.0
|
|
*/
|
|
public static AntInterface getInstance(Context context,ServiceListener listener)
|
|
{
|
|
if(DEBUG) Log.d(TAG, "getInstance");
|
|
|
|
synchronized (INSTANCE_LOCK)
|
|
{
|
|
if(!hasAntSupport(context))
|
|
{
|
|
if(DEBUG) Log.d(TAG, "getInstance: ANT not supported");
|
|
|
|
return null;
|
|
}
|
|
|
|
if (INSTANCE == null)
|
|
{
|
|
if(DEBUG) Log.d(TAG, "getInstance: Creating new instance");
|
|
|
|
INSTANCE = new AntInterface(context,listener);
|
|
}
|
|
else
|
|
{
|
|
if(DEBUG) Log.d(TAG, "getInstance: Using existing instance");
|
|
}
|
|
|
|
if(!sServiceConnected)
|
|
{
|
|
if(DEBUG) Log.d(TAG, "getInstance: No connection to proxy service, attempting connection");
|
|
|
|
if(!INSTANCE.initService())
|
|
{
|
|
Log.e(TAG, "getInstance: No connection to proxy service");
|
|
|
|
INSTANCE.destroy();
|
|
INSTANCE = null;
|
|
}
|
|
}
|
|
|
|
return INSTANCE;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Go to market.
|
|
*
|
|
* @param pContext the context
|
|
* @param pSearchText the search text
|
|
* @since 1.2
|
|
*/
|
|
public static void goToMarket(Context pContext, String pSearchText)
|
|
{
|
|
if(null == pSearchText)
|
|
{
|
|
goToMarket(pContext);
|
|
}
|
|
else
|
|
{
|
|
if(DEBUG) Log.i(TAG, "goToMarket: Search text = "+ pSearchText);
|
|
|
|
Intent goToMarket = null;
|
|
goToMarket = new Intent(Intent.ACTION_VIEW,Uri.parse("http://market.android.com/search?q=" + pSearchText));
|
|
goToMarket.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
pContext.startActivity(goToMarket);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Go to market.
|
|
*
|
|
* @param pContext the context
|
|
* @since 1.2
|
|
*/
|
|
public static void goToMarket(Context pContext)
|
|
{
|
|
if(DEBUG) Log.d(TAG, "goToMarket");
|
|
|
|
goToMarket(pContext, MARKET_SEARCH_TEXT_DEFAULT);
|
|
}
|
|
|
|
/**
|
|
* Class for interacting with the ANT interface.
|
|
*/
|
|
private final ServiceConnection sIAntConnection = new ServiceConnection() {
|
|
public void onServiceConnected(ComponentName pClassName, IBinder pService) {
|
|
// This is called when the connection with the service has been
|
|
// established, giving us the service object we can use to
|
|
// interact with the service. We are communicating with our
|
|
// service through an IDL interface, so get a client-side
|
|
// representation of that from the raw service object.
|
|
if(DEBUG) Log.d(TAG, "sIAntConnection onServiceConnected()");
|
|
sAntReceiver = IAnt_6.Stub.asInterface(pService);
|
|
|
|
sServiceConnected = true;
|
|
|
|
// Notify the attached application if it is registered
|
|
if (sServiceListener != null)
|
|
{
|
|
sServiceListener.onServiceConnected();
|
|
}
|
|
else
|
|
{
|
|
if(DEBUG) Log.d(TAG, "sIAntConnection onServiceConnected: No service listener registered");
|
|
}
|
|
}
|
|
|
|
public void onServiceDisconnected(ComponentName pClassName) {
|
|
// This is called when the connection with the service has been
|
|
// unexpectedly disconnected -- that is, its process crashed.
|
|
if(DEBUG) Log.d(TAG, "sIAntConnection onServiceDisconnected()");
|
|
sAntReceiver = null;
|
|
|
|
sServiceConnected = false;
|
|
mServiceLibraryVersionCode = 0;
|
|
|
|
// Notify the attached application if it is registered
|
|
if (sServiceListener != null)
|
|
{
|
|
sServiceListener.onServiceDisconnected();
|
|
}
|
|
else
|
|
{
|
|
if(DEBUG) Log.d(TAG, "sIAntConnection onServiceDisconnected: No service listener registered");
|
|
}
|
|
|
|
// Try and rebind to the service
|
|
INSTANCE.releaseService();
|
|
INSTANCE.initService();
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Binds this activity to the ANT service.
|
|
*
|
|
* @return true, if successful
|
|
*/
|
|
private boolean initService() {
|
|
if(DEBUG) Log.d(TAG, "initService() entered");
|
|
|
|
boolean ret = false;
|
|
|
|
if(!sServiceConnected)
|
|
{
|
|
ret = sContext.bindService(new Intent(IAnt_6.class.getName()), sIAntConnection, Context.BIND_AUTO_CREATE);
|
|
if(DEBUG) Log.i(TAG, "initService(): Bound with ANT service: " + ret);
|
|
}
|
|
else
|
|
{
|
|
if(DEBUG) Log.d(TAG, "initService: already initialised service");
|
|
ret = true;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/** Unbinds this activity from the ANT service. */
|
|
private void releaseService() {
|
|
if(DEBUG) Log.d(TAG, "releaseService() entered");
|
|
|
|
// TODO Make sure can handle multiple calls to onDestroy
|
|
if(sServiceConnected)
|
|
{
|
|
sContext.unbindService(sIAntConnection);
|
|
sServiceConnected = false;
|
|
}
|
|
|
|
if(DEBUG) Log.d(TAG, "releaseService() unbound.");
|
|
}
|
|
|
|
/**
|
|
* True if this activity can communicate with the ANT service.
|
|
*
|
|
* @return true, if service is connected
|
|
* @since 1.2
|
|
*/
|
|
public boolean isServiceConnected()
|
|
{
|
|
return sServiceConnected;
|
|
}
|
|
|
|
/**
|
|
* Destroy.
|
|
*
|
|
* @return true, if successful
|
|
* @since 1.0
|
|
*/
|
|
public boolean destroy()
|
|
{
|
|
if(DEBUG) Log.d(TAG, "destroy");
|
|
|
|
releaseService();
|
|
|
|
INSTANCE = null;
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
////-------------------------------------------------
|
|
|
|
/**
|
|
* Enable.
|
|
*
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void enable() throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.enable())
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Disable.
|
|
*
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void disable() throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.disable())
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Checks if is enabled.
|
|
*
|
|
* @return true, if is enabled.
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public boolean isEnabled() throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
return sAntReceiver.isEnabled();
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT tx message.
|
|
*
|
|
* @param message the message
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTTxMessage(byte[] message) throws AntInterfaceException
|
|
{
|
|
if(DEBUG) Log.d(TAG, "ANTTxMessage");
|
|
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTTxMessage(message))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT reset system.
|
|
*
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTResetSystem() throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTResetSystem())
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT unassign channel.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTUnassignChannel(byte channelNumber) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTUnassignChannel(channelNumber))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT assign channel.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param channelType the channel type
|
|
* @param networkNumber the network number
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTAssignChannel(byte channelNumber, byte channelType, byte networkNumber) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTAssignChannel(channelNumber, channelType, networkNumber))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT set channel id.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param deviceNumber the device number
|
|
* @param deviceType the device type
|
|
* @param txType the tx type
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTSetChannelId(byte channelNumber, short deviceNumber, byte deviceType, byte txType) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTSetChannelId(channelNumber, deviceNumber, deviceType, txType))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT set channel period.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param channelPeriod the channel period
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTSetChannelPeriod(byte channelNumber, short channelPeriod) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTSetChannelPeriod(channelNumber, channelPeriod))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT set channel rf freq.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param radioFrequency the radio frequency
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTSetChannelRFFreq(byte channelNumber, byte radioFrequency) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTSetChannelRFFreq(channelNumber, radioFrequency))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT set channel search timeout.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param searchTimeout the search timeout
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTSetChannelSearchTimeout(byte channelNumber, byte searchTimeout) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTSetChannelSearchTimeout(channelNumber, searchTimeout))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT set low priority channel search timeout.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param searchTimeout the search timeout
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTSetLowPriorityChannelSearchTimeout(byte channelNumber, byte searchTimeout) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTSetLowPriorityChannelSearchTimeout(channelNumber, searchTimeout))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT set proximity search.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param searchThreshold the search threshold
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTSetProximitySearch(byte channelNumber, byte searchThreshold) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTSetProximitySearch(channelNumber, searchThreshold))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT set channel transmit power
|
|
* @param channelNumber the channel number
|
|
* @param txPower the transmit power level
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTSetChannelTxPower(byte channelNumber, byte txPower) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTSetChannelTxPower(channelNumber, txPower))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT add channel id.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param deviceNumber the device number
|
|
* @param deviceType the device type
|
|
* @param txType the tx type
|
|
* @param listIndex the list index
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTAddChannelId(byte channelNumber, short deviceNumber, byte deviceType, byte txType, byte listIndex) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTAddChannelId(channelNumber, deviceNumber, deviceType, txType, listIndex))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT config list.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param listSize the list size
|
|
* @param exclude the exclude
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTConfigList(byte channelNumber, byte listSize, byte exclude) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTConfigList(channelNumber, listSize, exclude))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT config event buffering.
|
|
*
|
|
* @param screenOnFlushTimerInterval the screen on flush timer interval
|
|
* @param screenOnFlushBufferThreshold the screen on flush buffer threshold
|
|
* @param screenOffFlushTimerInterval the screen off flush timer interval
|
|
* @param screenOffFlushBufferThreshold the screen off flush buffer threshold
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.3
|
|
*/
|
|
public void ANTConfigEventBuffering(short screenOnFlushTimerInterval, short screenOnFlushBufferThreshold, short screenOffFlushTimerInterval, short screenOffFlushBufferThreshold) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTConfigEventBuffering((int)screenOnFlushTimerInterval, (int)screenOnFlushBufferThreshold, (int)screenOffFlushTimerInterval, (int)screenOffFlushBufferThreshold))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT disable event buffering.
|
|
*
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.1
|
|
*/
|
|
public void ANTDisableEventBuffering() throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTDisableEventBuffering())
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT open channel.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTOpenChannel(byte channelNumber) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTOpenChannel(channelNumber))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT close channel.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTCloseChannel(byte channelNumber) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTCloseChannel(channelNumber))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT request message.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param messageID the message id
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTRequestMessage(byte channelNumber, byte messageID) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTRequestMessage(channelNumber, messageID))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT send broadcast data.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param txBuffer the tx buffer
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTSendBroadcastData(byte channelNumber, byte[] txBuffer) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTSendBroadcastData(channelNumber, txBuffer))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT send acknowledged data.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param txBuffer the tx buffer
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTSendAcknowledgedData(byte channelNumber, byte[] txBuffer) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTSendAcknowledgedData(channelNumber, txBuffer))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT send burst transfer packet.
|
|
*
|
|
* @param control the control
|
|
* @param txBuffer the tx buffer
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public void ANTSendBurstTransferPacket(byte control, byte[] txBuffer) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
if(!sAntReceiver.ANTSendBurstTransferPacket(control, txBuffer))
|
|
{
|
|
throw new AntInterfaceException();
|
|
}
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Transmits the given data on channelNumber as part of a burst message.
|
|
*
|
|
* @param channelNumber Which channel to transmit on.
|
|
* @param txBuffer The data to send.
|
|
* @param initialPacket Which packet in the burst sequence does the data begin in, 1 is the first.
|
|
* @param containsEndOfBurst Is this the last of the data to be sent in burst.
|
|
* @return The number of bytes still to be sent (approximately). 0 if success.
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
*/
|
|
public int ANTSendBurstTransfer(byte channelNumber, byte[] txBuffer) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
return sAntReceiver.ANTSendBurstTransfer(channelNumber, txBuffer);
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ANT send partial burst.
|
|
*
|
|
* @param channelNumber the channel number
|
|
* @param txBuffer the tx buffer
|
|
* @param initialPacket the initial packet
|
|
* @param containsEndOfBurst the contains end of burst
|
|
* @return The number of bytes still to be sent (approximately). 0 if success.
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.0
|
|
*/
|
|
public int ANTSendPartialBurst(byte channelNumber, byte[] txBuffer, int initialPacket, boolean containsEndOfBurst) throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
return sAntReceiver.ANTTransmitBurst(channelNumber, txBuffer, initialPacket, containsEndOfBurst);
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the version code (eg. 1) of ANTLib used by the ANT application service
|
|
*
|
|
* @return the service library version code, or 0 on error.
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.2
|
|
*/
|
|
public int getServiceLibraryVersionCode() throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
if(mServiceLibraryVersionCode == 0)
|
|
{
|
|
try
|
|
{
|
|
mServiceLibraryVersionCode = sAntReceiver.getServiceLibraryVersionCode();
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
return mServiceLibraryVersionCode;
|
|
}
|
|
|
|
/**
|
|
* Returns the version name (eg "1.0") of ANTLib used by the ANT application service
|
|
*
|
|
* @return the service library version name, or null on error.
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.2
|
|
*/
|
|
public String getServiceLibraryVersionName() throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
return sAntReceiver.getServiceLibraryVersionName();
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Take control of the ANT Radio.
|
|
*
|
|
* @return True if control has been granted, false if another application has control or the request failed.
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.5
|
|
*/
|
|
public boolean claimInterface() throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
return sAntReceiver.claimInterface();
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Give up control of the ANT Radio.
|
|
*
|
|
* @return True if control has been given up, false if this application did not have control.
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.5
|
|
*/
|
|
public boolean releaseInterface() throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
return sAntReceiver.releaseInterface();
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Claims the interface if it is available. If not the user will be prompted (on the notification bar) if a force claim should be done.
|
|
* If the ANT Interface is claimed, an AntInterfaceIntent.ANT_INTERFACE_CLAIMED_ACTION intent will be sent, with the current applications pid.
|
|
*
|
|
* @param String appName The name if this application, to show to the user.
|
|
* @returns false if a claim interface request notification already exists.
|
|
* @throws IllegalArgumentException
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.5
|
|
*/
|
|
public boolean requestForceClaimInterface(String appName) throws AntInterfaceException
|
|
{
|
|
if((null == appName) || ("".equals(appName)))
|
|
{
|
|
throw new IllegalArgumentException();
|
|
}
|
|
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
return sAntReceiver.requestForceClaimInterface(appName);
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Clears the notification asking the user if they would like to seize control of the ANT Radio.
|
|
*
|
|
* @returns false if this process is not requesting to claim the interface.
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.5
|
|
*/
|
|
public boolean stopRequestForceClaimInterface() throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
return sAntReceiver.stopRequestForceClaimInterface();
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if the calling application has control of the ANT Radio.
|
|
*
|
|
* @return True if control is currently granted.
|
|
* @throws AntInterfaceException
|
|
* @throws AntServiceNotConnectedException
|
|
* @throws AntRemoteException
|
|
* @since 1.5
|
|
*/
|
|
public boolean hasClaimedInterface() throws AntInterfaceException
|
|
{
|
|
if(!sServiceConnected)
|
|
{
|
|
throw new AntServiceNotConnectedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
return sAntReceiver.hasClaimedInterface();
|
|
}
|
|
catch(RemoteException e)
|
|
{
|
|
throw new AntRemoteException(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if this device has support for ANT.
|
|
*
|
|
* @return True if the device supports ANT (may still require ANT Radio Service be installed).
|
|
* @since 1.5
|
|
*/
|
|
public static boolean hasAntSupport(Context pContext)
|
|
{
|
|
if(!mCheckedAntSupported)
|
|
{
|
|
mAntSupported = Arrays.asList(pContext.getPackageManager().getSystemSharedLibraryNames()).contains(ANT_LIBRARY_NAME);
|
|
mCheckedAntSupported = true;
|
|
}
|
|
|
|
return mAntSupported;
|
|
}
|
|
}
|