Bluetooh-wipower: Support for power apply and charge complete API's.
Support for Power apply command from app layer provided along with
charge complete api's as a part of wipower charging.
Change-Id: I32bae53d87c2af123c86b9f744093cdada18852d
CRs-fixed: 671422
diff --git a/Android.mk b/Android.mk
index f487428..2a68027 100644
--- a/Android.mk
+++ b/Android.mk
@@ -23,6 +23,8 @@
LOCAL_JAVA_LIBRARIES := javax.obex
LOCAL_JAVA_LIBRARIES += mms-common
LOCAL_JAVA_LIBRARIES += telephony-common
+LOCAL_JAVA_LIBRARIES += com.quicinc.wbc
+
LOCAL_STATIC_JAVA_LIBRARIES := com.android.vcard
LOCAL_REQUIRED_MODULES := libbluetooth_jni bluetooth.default
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 3bbd86d..3e7c322 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -51,6 +51,8 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<application android:process="com.android.bluetooth">
+ <uses-library android:name="com.quicinc.wbc"
+ android:required="false" />
<uses-library android:name="javax.obex" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
<service
diff --git a/src/org/codeaurora/bluetooth/a4wp/A4wpService.java b/src/org/codeaurora/bluetooth/a4wp/A4wpService.java
index 50f6393..f778f96 100644
--- a/src/org/codeaurora/bluetooth/a4wp/A4wpService.java
+++ b/src/org/codeaurora/bluetooth/a4wp/A4wpService.java
@@ -58,6 +58,8 @@
import android.wipower.WipowerManager.PowerApplyEvent;
import android.wipower.WipowerManager.PowerLevel;
import android.wipower.WipowerDynamicParam;
+import com.quicinc.wbc.WbcManager;
+import com.quicinc.wbc.WbcTypes;
/**
* Class which executes A4WP service
@@ -94,7 +96,7 @@
private final static byte DEFAULT_MAX_POWER_DESIRED = 0x0032;
private final static short DEFAULT_VRECT_MIN = 0x003200;
private final static short DEFAULT_VRECT_MAX = 0x004650;
- private final static short DEFAULT_VRECT_SET = 0x002580;
+ private final static short DEFAULT_VRECT_SET = 0x003580;
private final static short DEFAULT_DELTA_R1 = 0x0001;
private final static int DEFAULT_RFU_VAL = 0x0000;
private static final int MSB_MASK = 0xFF00;
@@ -108,6 +110,30 @@
private static final byte A4WP_ADV_MIN_INTERVAL = 0x20;
private static final byte A4WP_ADV_MAX_INTERVAL = 0x20;
+ private static boolean mWipowerBoot = false;
+ static boolean mChargeComplete = true;
+
+ private WbcManager.WbcEventListener mWbcCallback = new WbcManager.WbcEventListener() {
+
+ @Override
+ public void onWbcEventUpdate(int what, int arg1, int arg2) {
+ Log.v(LOGTAG, "onWbcEventUpdate rcvd: " + what + ", " + arg1 + ", " + arg2);
+ if ((what == WbcTypes.WBC_EVENT_TYPE_CHARGING_REQUIRED_STATUS)){
+ if ((arg1 == WbcTypes.WBC_BATTERY_STATUS_CHARGING_NOT_REQUIRED)){
+ // this will set charge complete bit in pru alert
+ // eventally leading to a possible disconnect from ptu
+ mChargeComplete = true;
+ } else {
+ // We could be in 600mS scan state here and since charging needs to be resumed
+ // send enable power apply command to scan for short beacons */
+ mChargeComplete = false;
+ mWipowerManager.enablePowerApply(true, true, false);
+ }
+ }
+ Log.v(LOGTAG, "onWbcEventUpdate: charge complete " + mChargeComplete);
+ }
+ };
+
private class PruStaticParam {
private byte mOptvalidity;
private byte mProtoRevision;
@@ -380,6 +406,7 @@
private PtuStaticParam mPtuStaticParam; //20 bytes
private static WipowerDynamicParam mPruDynamicParam; //20 bytes
private WipowerManager mWipowerManager;
+ private WbcManager mWbcManager;
public A4wpService() {
Log.v(LOGTAG, "A4wpService");
@@ -451,6 +478,12 @@
@Override
public void onWipowerReady() {
Log.v(LOGTAG, "onWipowerReady");
+ if (mChargeComplete == true) {
+ mWipowerManager.enablePowerApply(true, true, true);
+ } else {
+ mWipowerManager.enablePowerApply(true, true, false);
+ }
+ mWipowerBoot = true;
}
@Override
@@ -514,7 +547,7 @@
byte[] value = data.getValue();
Log.v(LOGTAG, "calling SetValue");
- mPruDynamicParam.setAppValue(value);
+ mPruDynamicParam.setValue(value);
}
};
@@ -528,11 +561,15 @@
public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
mState = newState;
if (mState == BluetoothProfile.STATE_DISCONNECTED) {
- Log.v(LOGTAG, "onConnectionStateChange:DISCONNECTED " + device);
- if (mDevice != null) {
- //Uncomment this later
- //mWipowerManager.enableDataNotification(false);
- //mWipowerManager.stopCharging();
+ Log.v(LOGTAG, "onConnectionStateChange:DISCONNECTED " + device + "charge complete " + mChargeComplete);
+ if (mDevice != null && mWipowerManager != null) {
+ mWipowerManager.enableDataNotification(false);
+ mWipowerManager.stopCharging();
+ if (mChargeComplete == true) {
+ mWipowerManager.enablePowerApply(true, true, true);
+ } else {
+ mWipowerManager.enablePowerApply(true, true, false);
+ }
mDevice = null;
}
} else {
@@ -588,10 +625,15 @@
return;
}
value = mPruDynamicParam.getValue();
+ if (mChargeComplete == true) {
+ value[16] = (byte)(value[16] | CHARGE_COMPLETE_BIT);
+ } else {
+ value[16] = (byte)(value[16] & (~CHARGE_COMPLETE_BIT));
+ }
}
if (value != null)
{
- Log.v(LOGTAG, "device:" + id + "requestId:" + requestId + "status:" + status + "offset:" + offset + "value" + value);
+ Log.v(LOGTAG, "device=" + id + "requestId=" + requestId + "status=" + status + "offset=" + offset + "value=" + value[16]);
mBluetoothGattServer.sendResponse(device, requestId, status, offset, value);
}
}
@@ -698,7 +740,6 @@
mBluetoothGattServer.addService(a4wpService);
- Log.d(LOGTAG,"time to start advertising....:");
//startAdvertising();
@@ -726,6 +767,12 @@
mWipowerManager = WipowerManager.getWipowerManger(this, mWipowerCallback);
if (mWipowerManager != null)
mWipowerManager.registerCallback(mWipowerCallback);
+ mWbcManager = WbcManager.getInstance();
+ if (mWbcManager != null) {
+ mChargeComplete = (mWbcManager.getChargingRequired() == 0);
+ Log.v(LOGTAG, "onCreate: charge complete " + mChargeComplete);
+ mWbcManager.register(mWbcCallback);
+ }
}
@Override
@@ -733,6 +780,8 @@
Log.v(LOGTAG, "onDestroy");
if (mWipowerManager != null)
mWipowerManager.unregisterCallback(mWipowerCallback);
+ if (mWbcManager != null)
+ mWbcManager.unregister(mWbcCallback);
}
@Override
@@ -744,8 +793,15 @@
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(LOGTAG, "onStart Command called!!");
- //Make this restarable service by
- //Android app manager
+
+ //mWipowerBoot is used to hold power enable command till the service is been registered completely
+ if (mWipowerBoot == true) {
+ if (mChargeComplete == true) {
+ mWipowerManager.enablePowerApply(true, true, true);
+ } else {
+ mWipowerManager.enablePowerApply(true, true, false);
+ }
+ }
return START_STICKY;
}
}