mako: bluetooth: Implement BT DUT mode

add codes to read bd addr property for DUT mode

Change-Id: I885d15bd14dfb1c81d5bc2c7a7a4479f3b86aa87
diff --git a/bdAddrLoader/addrloader.c b/bdAddrLoader/addrloader.c
index b1d2d81..be0d5b1 100644
--- a/bdAddrLoader/addrloader.c
+++ b/bdAddrLoader/addrloader.c
@@ -32,12 +32,46 @@
 #define BD_ADDR_LEN  6
 #define BD_ADDR_STR_LEN 18
 
-#define FTM_PATH_COMMON "/persist"
-#define FTM_PATH_BT_ADDR "bluetooth/.bdaddr"
-#define FTM_PATH_WIFI_ADDR "wifi/.wlanaddr"
+
+#define ARG_TYPE_PATH_FILE  0x11
+#define ARG_TYPE_PATH_PROP  0x12
+
+#define ARG_TYPE_DATA_HEX   0x21
+#define ARG_TYPE_DATA_ASCII 0x22
+
+typedef struct _ArgEl
+{
+   const char *szSrc;    // Source Path
+   int nPathType;        // Type of Source Path
+   int nDataType;        // Type of Data
+}ArgEl;
+
+typedef ArgEl InArg;
 
 #define DEFAULT_BDADDR_PROP "persist.service.bdroid.bdaddr"
 
+typedef struct _OutArg
+{
+   ArgEl dest;
+   char  cSeperator;    // a character to be used for sperating like ':' of "XX:XX:XX:XX:XX:XX"
+   char  bPrintOut;     // Print out bd addr in standard out or not
+}OutArg;
+
+typedef struct _LoadedData
+{
+    union {
+       unsigned char bin[BD_ADDR_LEN];
+       char sz[BD_ADDR_STR_LEN];
+    }data;
+    int nDataType;
+}LoadedBDAddr;
+
+typedef enum _res
+{
+    SUCCESS = 0,
+    FAIL
+}Res;
+
 int hexa_to_ascii(const unsigned char* hexa, char* ascii, int nHexLen)
 {
     int i, j;
@@ -51,7 +85,9 @@
 
     ascii[nHexLen*2] = '\0';
 
-    return 0;
+    ALOGI("hex_to_ascii() - converted Data (%s)", ascii);
+
+    return SUCCESS;
 }
 
 int readBDAddrData(const char* szFilePath, unsigned char* addrData, int nDataLen)
@@ -62,16 +98,16 @@
 
     if(nFd < 0){
         ALOGW("There is no Address File in FTM area : %s\n", szFilePath);
-        return 1;
+        return FAIL;
     }
 
     nRdCnt = read(nFd, addrData, nDataLen);
     if(nRdCnt != nDataLen){
         ALOGE("Fail to read Address data from FTM area\n");
         close(nFd);
-        return 1;
+        return FAIL;
     }
-    return 0;
+    return SUCCESS;
 }
 
 void formattingBdAddr(char *szBDAddr, const char cSep)
@@ -87,27 +123,149 @@
     }
 }
 
+int readBDAddr(InArg inArg, LoadedBDAddr *loadedBDAddr)
+{
+    Res res = FAIL;
+    unsigned char addrData[BD_ADDR_LEN] = {0,};
+    int nDataLen = 0;
+
+    ALOGI("Read From %s by Path type(0x%2x), Data type (0x%2x)", inArg.szSrc, inArg.nPathType, inArg.nDataType);
+
+
+    if(inArg.nPathType == ARG_TYPE_PATH_FILE){
+        switch(inArg.nDataType){
+            case ARG_TYPE_DATA_HEX:
+                if(!readBDAddrData(inArg.szSrc, loadedBDAddr->data.bin, BD_ADDR_LEN)){
+                    loadedBDAddr->nDataType = ARG_TYPE_DATA_HEX;
+                    return SUCCESS;
+                }
+                break;
+            case ARG_TYPE_DATA_ASCII:
+               if(!readBDAddrData(inArg.szSrc, (unsigned char *)loadedBDAddr->data.sz, BD_ADDR_STR_LEN)){
+                    loadedBDAddr->nDataType = ARG_TYPE_DATA_ASCII;
+                    return SUCCESS;
+                }
+                break;
+            default:
+                return FAIL;
+        }
+    }else if(inArg.nPathType == ARG_TYPE_PATH_PROP){
+        switch(inArg.nDataType){
+            case ARG_TYPE_DATA_HEX:
+                if(property_get(inArg.szSrc, (char *)loadedBDAddr->data.bin, "")>=0){
+                    loadedBDAddr->nDataType = ARG_TYPE_DATA_HEX;
+                    return SUCCESS;
+                }
+                break;
+            case ARG_TYPE_DATA_ASCII:
+                if(property_get(inArg.szSrc, loadedBDAddr->data.sz, "")>=0){
+                    loadedBDAddr->nDataType = ARG_TYPE_DATA_ASCII;
+                    return SUCCESS;
+                }
+                break;
+            default:
+                return FAIL;
+        }
+    }else{
+        ALOGE("Error invalid argument : (%d)", inArg.nPathType);
+    }
+
+    ALOGE("Fail to read BDAddr from %s", inArg.szSrc);
+    return FAIL;
+}
+
+int writeBDAddr(OutArg outArg, LoadedBDAddr *loadedBDAddr)
+{
+    char szTmp[BD_ADDR_STR_LEN] = {0,};
+
+    ALOGI("Output Data type(0x%2x), bPrintout(%d), bPath(%s)",
+        outArg.dest.nDataType, outArg.bPrintOut, outArg.dest.szSrc);
+
+    ALOGI("Loaded Data type(0x%2x)", loadedBDAddr->nDataType);
+
+    if(outArg.dest.nDataType == ARG_TYPE_DATA_ASCII
+        && loadedBDAddr->nDataType == ARG_TYPE_DATA_HEX
+    ){
+        if(!hexa_to_ascii(loadedBDAddr->data.bin, szTmp, BD_ADDR_LEN)){
+            memcpy(loadedBDAddr->data.sz, szTmp, BD_ADDR_STR_LEN);
+            loadedBDAddr->nDataType = ARG_TYPE_DATA_ASCII;
+        }
+        else{
+            ALOGE("Fail to convert data");
+            return FAIL;
+        }
+    }
+
+    if(loadedBDAddr->nDataType == ARG_TYPE_DATA_ASCII){
+       // check out which addr data is already formated
+       if(strchr(loadedBDAddr->data.sz, '.') == NULL
+         && strchr(loadedBDAddr->data.sz, ':') == NULL
+       ){
+           formattingBdAddr(loadedBDAddr->data.sz, outArg.cSeperator);
+       }
+    }
+    // print out szBDAddr
+    if(outArg.bPrintOut
+        && loadedBDAddr->nDataType == ARG_TYPE_DATA_ASCII
+        && strlen(loadedBDAddr->data.sz)==(BD_ADDR_STR_LEN-1)) {
+       printf("%s",loadedBDAddr->data.sz);
+       if (property_set(DEFAULT_BDADDR_PROP, loadedBDAddr->data.sz) < 0)
+           ALOGE("Failed to set address in prop %s", DEFAULT_BDADDR_PROP);
+    }
+    else{
+       ALOGE("Invalid Data is loaded : %s", loadedBDAddr->data.sz);
+       return FAIL;
+    }
+    // TODO :: writing File or Property
+    return SUCCESS;
+}
+
 int main(int argc, char *argv[])
 {
     int nFd, nRdCnt;
-    char szFilePath[FILE_PATH_MAX] = {0,};
-    unsigned char addrData[BD_ADDR_LEN] = {0,};
-    char szBDAddr[BD_ADDR_STR_LEN] = {0,};
-    char *szBDAddrPath = NULL;
-    char *szProperty = NULL;
-    char bStdOut = 0;
     int c;
 
-    while((c=getopt(argc, argv, ":i:o:p")) != -1){
+    InArg inArg;
+    OutArg outArg;
+    LoadedBDAddr loadedBDAddr;
+
+    //initialize arg
+    memset(&inArg, 0, sizeof(InArg));
+    memset(&outArg, 0, sizeof(OutArg));
+    memset(&loadedBDAddr, 0, sizeof(LoadedBDAddr));
+
+    //load args;
+    while((c=getopt(argc, argv, ":f:p:hsx")) != -1){
         switch(c){
-            case 'i': // input file path
-                szBDAddrPath = optarg;
+            case 'f': // input path
+                if(optarg != NULL){
+                    ALOGI("option : f=%s", optarg);
+                    inArg.szSrc = optarg;
+                }else{
+                    ALOGW("Invalid Argument(%s) of input path", optarg);
+                }
+                inArg.nPathType = ARG_TYPE_PATH_FILE;
                 break;
-            case 'o': // output : property name
-                szProperty = optarg;
+            case 'p': // output path
+                if(optarg != NULL){
+                    ALOGI("option : p=%s", optarg);
+                    inArg.szSrc = optarg;
+                }else{
+                    ALOGW("Invalid Argument(%s) of out Path", optarg);
+                }
+                inArg.nPathType = ARG_TYPE_PATH_PROP;
                 break;
-            case 'p':
-                bStdOut = 1;
+            case 'h': // data type to be read is hex
+                ALOGI("option : h");
+                inArg.nDataType = ARG_TYPE_DATA_HEX;
+                break;
+            case 's': // data type to be read is ascii
+                ALOGI("option : s");
+                inArg.nDataType = ARG_TYPE_DATA_ASCII;
+                break;
+            case 'x':
+                ALOGI("option : x");
+                outArg.bPrintOut = 1; //true
                 break;
             default:
                 ALOGW("Unknown option : %c", c);
@@ -115,26 +273,20 @@
         }
     }
 
-    if(szBDAddrPath == NULL){
-        //set default bd address path
-        sprintf(szFilePath, "%s/%s", FTM_PATH_COMMON, FTM_PATH_BT_ADDR);
-        szBDAddrPath = szFilePath;
+    // setting up Arguments with default value
+    outArg.cSeperator = ':';
+    outArg.dest.nDataType = ARG_TYPE_DATA_ASCII;
+
+    // load bd addr and print out bd addr in formated ascii
+    if(readBDAddr(inArg, &loadedBDAddr)){
+        ALOGE("Fail to load data !!");
+        return FAIL;
     }
 
-    if(!readBDAddrData(szBDAddrPath, addrData, BD_ADDR_LEN)){
-        if(!hexa_to_ascii(addrData, szBDAddr, BD_ADDR_LEN)){
-            formattingBdAddr(szBDAddr, ':');
-            // write loaded bdaddr to property
-            if(szProperty != NULL) property_set(szProperty, szBDAddr);
-            // print out szBDAddr
-            if(bStdOut) printf("%s",szBDAddr);
-            if (property_set(DEFAULT_BDADDR_PROP, szBDAddr) < 0)
-                ALOGE("Failed to set address in prop %s", DEFAULT_BDADDR_PROP);
-            return 0;
-        }
-        else{
-            ALOGE("Fail to convert data from hex to ascii");
-        }
+    if(writeBDAddr(outArg, &loadedBDAddr)){
+        ALOGE("Fail to write data !!");
+        return FAIL;
     }
+
     return 1;
 }
diff --git a/init.mako.bt.sh b/init.mako.bt.sh
index 0111434..4fdd065 100644
--- a/init.mako.bt.sh
+++ b/init.mako.bt.sh
@@ -25,12 +25,19 @@
 
 POWER_CLASS=`getprop qcom.bt.dev_power_class`
 TRANSPORT=`getprop ro.qualcomm.bt.hci_transport`
+DUTADDR=`getprop net.btdut.address`
 
 #find the transport type
 logi "Transport : $TRANSPORT"
+logi "DUTADDR : $DUTADDR"
 
 #load bd addr
-BDADDR=`/system/bin/bdAddrLoader -p`
+if [$DUTADDR == ""]
+then
+BDADDR=`/system/bin/bdAddrLoader -f /persist/bluetooth/.bdaddr -h -x`
+else
+BDADDR=`/system/bin/bdAddrLoader -p net.btdut.address -s -x`
+fi
 
 setprop bluetooth.status off
 
@@ -48,15 +55,15 @@
      logi "Power Class: To override, Before turning BT ON; setprop qcom.bt.dev_power_class <1 or 2 or 3>";;
 esac
 
-if ["$BDADDR" == ""]
+if [$BDADDR == ""]
 then
-  logwrapper /system/bin/hci_qcomm_init -e $PWR_CLASS -vv
+logwrapper /system/bin/hci_qcomm_init -e $PWR_CLASS -vv
 else
-  logwrapper /system/bin/hci_qcomm_init -b $BDADDR -e $PWR_CLASS -vv
+logwrapper /system/bin/hci_qcomm_init -b $BDADDR -e $PWR_CLASS -vv
 fi
 
 case $? in
-  0) logi "Bluetooth QSoC firmware download succeeded, $BTS_DEVICE $BTS_TYPE $BTS_BAUD $BTS_ADDRESS";;
+  0) logi "Bluetooth QSoC firmware download succeeded, $PWR_CLASS $BDADDR $TRANSPORT";;
   *) failed "Bluetooth QSoC firmware download failed" $exit_code_hci_qcomm_init;
      setprop bluetooth.status off;
      exit $exit_code_hci_qcomm_init;;
diff --git a/init.mako.rc b/init.mako.rc
index 25d20ff..8fb269b 100644
--- a/init.mako.rc
+++ b/init.mako.rc
@@ -407,7 +407,7 @@
     group system wifi
     oneshot
 
-service bdAddrLoader /system/bin/bdAddrLoader -p
+service bdAddrLoader /system/bin/bdAddrLoader -f /persist/bluetooth/.bdaddr -h -x
     class main
     user bluetooth
     group system bluetooth