Merge "bluetoothtbd common library reconfiguration (2/2)"
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..d2064b0
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,3 @@
+ajanti@google.com
+pavlin@google.com
+tturney@google.com
diff --git a/PMC/src/com/android/pmc/BleScanReceiver.java b/PMC/src/com/android/pmc/BleScanReceiver.java
index fb97255..56532dd 100644
--- a/PMC/src/com/android/pmc/BleScanReceiver.java
+++ b/PMC/src/com/android/pmc/BleScanReceiver.java
@@ -50,6 +50,10 @@
     private BluetoothLeScanner mBleScanner;
     private ScanSettings mScanSettings;
     private List<ScanFilter> mScanFilterList;
+    // Use PMCStatusLogger to send status and start & end times back to Python client
+    private PMCStatusLogger mPMCStatusLogger;
+    // Test start time is set when receiving the broadcast message from Python client
+    private long mStartTestTime;
 
     private ScanCallback mScanCallback = new ScanCallback() {
         @Override
@@ -74,6 +78,9 @@
         private int mScanTime;
         private int mNoScanTime;
         private int mNumAlarms;
+        private int mFirstScanTime;
+        private long mScanStartTime;
+        private long mScanEndTime;
 
         /**
          * Constructor
@@ -119,14 +126,15 @@
             mScanTime = scanTime;
             mNoScanTime = noScanTime;
             mNumAlarms = numAlarms;
+            mFirstScanTime = startTime;
+
             mScanSettings = new ScanSettings.Builder().setScanMode(
                                             scanMode).build();
 
             Intent alarmIntent = new Intent(BleScanListener.BLESCAN);
             alarmIntent.putExtra("com.android.pmc.BLESCAN.Action", START_SCAN);
             alarmIntent.putExtra("com.android.pmc.BLESCAN.CurrentAlarm", INIT_ALARM_NO);
-            long triggerTime = SystemClock.elapsedRealtime()
-                               + startTime * 1000;
+            long triggerTime = SystemClock.elapsedRealtime() + startTime * 1000;
             mAlarmManager.setExactAndAllowWhileIdle(
                           AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime,
                           PendingIntent.getBroadcast(mContext, 0,
@@ -151,6 +159,7 @@
                 return;
             }
             if (currentAlarm >= mNumAlarms) {
+                mPMCStatusLogger.flash();  // To flash out timestamps into log file
                 Log.d(TAG, "All alarms are done");
                 return;
             }
@@ -185,13 +194,22 @@
             }
             if (action == START_SCAN) {
                 Log.v(TAG, "Before Start Scan");
+                mScanStartTime = System.currentTimeMillis();
                 mBleScanner.startScan(mScanFilterList, mScanSettings,
                                  mScanCallback);
                 repeatAlarm(intent, mScanTime, STOP_SCAN);
             } else if (action == STOP_SCAN) {
                 Log.v(TAG, "Before Stop scan");
+                mScanEndTime = System.currentTimeMillis();
+                mPMCStatusLogger.logAlarmTimes(mScanStartTime / 1000.0, mScanEndTime / 1000.0);
                 mBleScanner.stopScan(mScanCallback);
-                repeatAlarm(intent, mNoScanTime, START_SCAN);
+                if ((mScanEndTime - mStartTestTime)
+                        < ((mScanTime + mNoScanTime) * mNumAlarms / 2 + mFirstScanTime) * 1000) {
+                    repeatAlarm(intent, mNoScanTime, START_SCAN);
+                } else {
+                    mPMCStatusLogger.flash();  // To flash out timestamps into log file
+                    Log.d(TAG, "Time is up to end");
+                }
             } else {
                 Log.e(TAG, "Unknown Action");
             }
@@ -230,6 +248,9 @@
             int repetitions = 1;
             String str;
 
+            mStartTestTime = System.currentTimeMillis();
+            mPMCStatusLogger = new PMCStatusLogger(TAG + ".log", TAG);
+
             if (extras == null) {
                 Log.e(TAG, "No parameters specified");
                 return;
@@ -279,6 +300,12 @@
             }
             mAlarmScanListener.firstAlarm(scanMode, startTime,
                                        scanTime, noScanTime, repetitions * 2);
+            if (mBleScanner != null && mScanFilterList != null && mScanSettings != null
+                                 && mScanCallback != null) {
+                mPMCStatusLogger.logStatus("READY");
+            } else {
+                Log.e(TAG, "BLE scanner is not ready to start test");
+            }
         }
     }
 }
diff --git a/PMC/src/com/android/pmc/PMCStatusLogger.java b/PMC/src/com/android/pmc/PMCStatusLogger.java
index d931adf..500780e 100644
--- a/PMC/src/com/android/pmc/PMCStatusLogger.java
+++ b/PMC/src/com/android/pmc/PMCStatusLogger.java
@@ -18,11 +18,15 @@
 
 import android.util.Log;
 
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileOutputStream;
+import java.io.FileWriter;
 import java.io.IOException;
-import java.io.OutputStreamWriter;
+
 
 /**
  * Logging class to log status so PMC can communicate the status back to client
@@ -31,6 +35,8 @@
     private File mFile;
     public static String TAG;
     public static String LOG_DIR = "/mnt/sdcard/Download";
+    public static JSONObject mJObject;
+    public static JSONArray mJArray;
 
     /**
      * Construtor - check if the file exist. If it is delete and create a new.
@@ -41,12 +47,14 @@
         TAG = tag;
 
         try {
-            mFile = new File(LOG_DIR + fileName);
+            mFile = new File(LOG_DIR + "/" + fileName);
             if (mFile.exists()) mFile.delete();
             mFile.createNewFile();
         } catch (IOException e) {
             Log.e(TAG, "Exception creating log file: " + fileName + " " + e);
         }
+        mJObject = new JSONObject();
+        mJArray = new JSONArray();
     }
 
     /**
@@ -56,8 +64,8 @@
      */
     public void logStatus(String message) {
         try {
-            FileOutputStream fos = new FileOutputStream(mFile, true);
-            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
+            FileWriter fos = new FileWriter(mFile);
+            BufferedWriter bw = new BufferedWriter(fos);
             bw.write(message);
             bw.newLine();
             bw.close();
@@ -65,5 +73,44 @@
             Log.e(TAG, "Exception writing log: " + message + " " + e);
         }
     }
+
+    /**
+     * Function to add alarm times into JSONArray object
+     *
+     * @param startTime - Start time for the cycle
+     * @param endTime - End time for the cycle
+     */
+    public void logAlarmTimes(double startTime, double endTime) {
+        JSONObject obj = new JSONObject();
+        try {
+            obj.put("StartTime", startTime);
+            obj.put("EndTime", endTime);
+            mJArray.put(obj);
+        } catch (JSONException e) {
+            Log.e(TAG, "Exception to put Alarm Times into JSONArray: " + e);
+        }
+    }
+
+    /**
+     * Function to save Json object into log file
+     *
+     */
+    public void flash() {
+        try {
+            mJObject.put("AlarmTimes", mJArray);
+
+            FileWriter fos = new FileWriter(mFile);
+            BufferedWriter bw = new BufferedWriter(fos);
+            Log.v(TAG, "JSON: " + mJObject.toString());
+            bw.write(mJObject.toString());
+            bw.newLine();
+            bw.close();
+        } catch (JSONException e) {
+            Log.e(TAG, "Exception to put JSONArray into main JSON object: " + e);
+        } catch (IOException e) {
+            Log.e(TAG, "Exception writing JSON to log file: " + e);
+        }
+    }
+
 }