package uk.co.alt236.bluetoothlelib.device.beacon.ibeacon;
import android.bluetooth.BluetoothDevice;
import android.os.Parcel;
import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice;
import uk.co.alt236.bluetoothlelib.device.beacon.BeaconDevice;
import uk.co.alt236.bluetoothlelib.device.beacon.BeaconType;
import uk.co.alt236.bluetoothlelib.device.beacon.BeaconUtils;
public class IBeaconDevice extends BluetoothLeDevice implements BeaconDevice{
/**
* The m iBeacon data.
*/
private final IBeaconManufacturerData mIBeaconData;
/**
* Instantiates a new iBeacon device.
*
* @param device the device
* @param rssi the RSSI value
* @param scanRecord the scanRecord
* @throws IllegalArgumentException if the passed device is not an iBeacon
*/
public IBeaconDevice(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
super(device, rssi, scanRecord, 0);
mIBeaconData = new IBeaconManufacturerData(this);
}
/**
* Instantiates a new iBeacon device.
*
* @param device the device
* @param rssi the RSSI value of the RSSI measurement
* @param scanRecord the scan record
* @param timestamp the timestamp of the RSSI measurement
* @throws IllegalArgumentException if the passed device is not an iBeacon
*/
public IBeaconDevice(final BluetoothDevice device, final int rssi, final byte[] scanRecord, final long timestamp) {
super(device, rssi, scanRecord, timestamp);
mIBeaconData = new IBeaconManufacturerData(this);
}
/**
* Will try to convert a {@link BluetoothLeDevice} into an
* iBeacon Device.
*
* @param device the device
* @throws IllegalArgumentException if the passed device is not an iBeacon
*/
public IBeaconDevice(final BluetoothLeDevice device) {
super(device);
mIBeaconData = new IBeaconManufacturerData(this);
}
private IBeaconDevice(final Parcel in) {
super(in);
mIBeaconData = new IBeaconManufacturerData(this);
}
/**
* Gets the estimated Accuracy of the reading in meters based on
* a simple running average of the last {@link #MAX_RSSI_LOG_SIZE}
* samples.
*
* @return the accuracy in meters
*/
public double getAccuracy() {
return IBeaconUtils.calculateAccuracy(
getCalibratedTxPower(),
getRunningAverageRssi());
}
@Override
public BeaconType getBeaconType() {
return BeaconType.IBEACON;
}
/**
* Gets the calibrated TX power of the iBeacon device as reported.
*
* @return the calibrated TX power
*/
public int getCalibratedTxPower() {
return getIBeaconData().getCalibratedTxPower();
}
/**
* Gets the iBeacon company identifier.
*
* @return the company identifier
*/
public int getCompanyIdentifier() {
return getIBeaconData().getCompanyIdentifier();
}
/**
* Gets the estimated Distance descriptor.
*
* @return the distance descriptor
*/
public IBeaconDistanceDescriptor getDistanceDescriptor() {
return IBeaconUtils.getDistanceDescriptor(getAccuracy());
}
/**
* Gets the iBeacon manufacturing data.
*
* @return the iBeacon data
*/
public IBeaconManufacturerData getIBeaconData() {
return mIBeaconData;
}
/**
* Gets the iBeacon Major value.
*
* @return the Major value
*/
public int getMajor() {
return getIBeaconData().getMajor();
}
/**
* Gets the iBeacon Minor value.
*
* @return the Minor value
*/
public int getMinor() {
return getIBeaconData().getMinor();
}
/**
* Gets the iBeacon UUID.
*
* @return the UUID
*/
public String getUUID() {
return getIBeaconData().getUUID();
}
}