Add DS support.

Change-Id: Ib8bc4e171dd5ca526f8e151ff3d467097582a8cb
diff --git a/mbtk/mbtk_rild_v2/src/atchannel.c b/mbtk/mbtk_rild_v2/src/atchannel.c
index 80f8e68..54313d0 100755
--- a/mbtk/mbtk_rild_v2/src/atchannel.c
+++ b/mbtk/mbtk_rild_v2/src/atchannel.c
@@ -38,20 +38,21 @@
 #define HANDSHAKE_TIMEOUT_MSEC 500
 #define AT_BUFF_MAX 1024
 
-static pthread_t s_tid_reader[ATPORTTYPE_NUM];
-static int s_at_fd[ATPORTTYPE_NUM] = {-1};    /* fd of the AT channel */
-static int s_uart_fd = -1;    /* fd of the UART channel */
+static pthread_t s_tid_reader[ATPORTID_NUM];
+static int s_at_fd[ATPORTID_NUM] = {-1};    /* fd of the AT channel */
+static int s_uart_fd[MBTK_SIM_NUM] = {-1};    /* fd of the UART channel */
 
-static ATUnsolHandler s_unsolHandler;
+static ATUnsolHandler s_unsolHandler[MBTK_SIM_NUM];
 
 /* for input buffering */
 
-static char s_ATBuffer[ATPORTTYPE_NUM][MAX_AT_RESPONSE+1];
-static char *s_ATBufferCur[ATPORTTYPE_NUM] = {s_ATBuffer[ATPORTTYPE_0], s_ATBuffer[ATPORTTYPE_1], s_ATBuffer[ATPORTTYPE_2]};
-static char s_UartBuffer[MAX_AT_RESPONSE+1];
-static char *s_UartBufferCur = s_UartBuffer;
+static char s_ATBuffer[ATPORTID_NUM][MAX_AT_RESPONSE+1];
+static char *s_ATBufferCur[ATPORTID_NUM] = {s_ATBuffer[ATPORTID_SIM1_0], s_ATBuffer[ATPORTID_SIM1_0], s_ATBuffer[ATPORTID_SIM1_0],
+                                            s_ATBuffer[ATPORTID_SIM2_0], s_ATBuffer[ATPORTID_SIM2_0], s_ATBuffer[ATPORTID_SIM2_0]};
+static char s_UartBuffer[MBTK_SIM_NUM][MAX_AT_RESPONSE+1];
+static char *s_UartBufferCur[MBTK_SIM_NUM] = {s_UartBuffer[MBTK_SIM_1], s_UartBuffer[MBTK_SIM_2]};
 
-static mbtk_ril_at_state_enum at_state[ATPORTTYPE_NUM] = {RIL_AT_STATE_CLOSED};
+static mbtk_ril_at_state_enum at_state[ATPORTID_NUM] = {RIL_AT_STATE_CLOSED};
 
 #if AT_DEBUG
 void  AT_DUMP(const char*  prefix, const char*  buff, int  len)
@@ -72,22 +73,22 @@
  */
 
 // "Wait" when AT process...
-static pthread_mutex_t s_commandmutex[ATPORTTYPE_NUM] = {PTHREAD_MUTEX_INITIALIZER};
-static pthread_cond_t s_commandcond[ATPORTTYPE_NUM] = {PTHREAD_COND_INITIALIZER};
+static pthread_mutex_t s_commandmutex[ATPORTID_NUM] = {PTHREAD_MUTEX_INITIALIZER};
+static pthread_cond_t s_commandcond[ATPORTID_NUM] = {PTHREAD_COND_INITIALIZER};
 
-static ATCommandType s_type[ATPORTTYPE_NUM];
-static const char *s_responsePrefix[ATPORTTYPE_NUM] = {NULL};
-static const char *s_smsPDU[ATPORTTYPE_NUM] = {NULL};
-static ATResponse *sp_response[ATPORTTYPE_NUM] = {NULL};
-static char s_curr_at[ATPORTTYPE_NUM][AT_BUFF_MAX];
+static ATCommandType s_type[ATPORTID_NUM];
+static const char *s_responsePrefix[ATPORTID_NUM] = {NULL};
+static const char *s_smsPDU[ATPORTID_NUM] = {NULL};
+static ATResponse *sp_response[ATPORTID_NUM] = {NULL};
+static char s_curr_at[ATPORTID_NUM][AT_BUFF_MAX];
 
 static void (*s_onTimeout)(void) = NULL;
 static void (*s_onReaderClosed)(void) = NULL;
 static int s_readerClosed;
 
-static void onReaderClosed(ATPortType_enum port);
-static int writeCtrlZ (ATPortType_enum port, const char *s);
-static int writeline (ATPortType_enum port, const char *s);
+static void onReaderClosed(ATPortId_enum port);
+static int writeCtrlZ (ATPortId_enum port, const char *s);
+static int writeline (ATPortId_enum port, const char *s);
 
 typedef struct
 {
@@ -137,7 +138,7 @@
 
 
 /** add an intermediate response to sp_response*/
-static void addIntermediate(ATPortType_enum port, const char *line)
+static void addIntermediate(ATPortId_enum port, const char *line)
 {
     ATLine *p_new;
 
@@ -170,7 +171,7 @@
     "NO ANSWER",
     "NO DIALTONE",
 };
-static int isFinalResponseError(ATPortType_enum port, const char *line)
+static int isFinalResponseError(ATPortId_enum port, const char *line)
 {
     size_t i;
 
@@ -220,7 +221,7 @@
  * See 27.007 annex B
  * WARNING: NO CARRIER and others are sometimes unsolicited
  */
-static int isFinalResponse(ATPortType_enum port, const char *line)
+static int isFinalResponse(ATPortId_enum port, const char *line)
 {
     return isFinalResponseSuccess(line) || isFinalResponseError(port, line);
 }
@@ -252,7 +253,7 @@
 
 
 /** assumes s_commandmutex is held */
-static void handleFinalResponse(ATPortType_enum port, const char *line)
+static void handleFinalResponse(ATPortId_enum port, const char *line)
 {
     sp_response[port]->finalResponse = strdup(line);
 
@@ -260,22 +261,22 @@
     pthread_cond_signal(&s_commandcond[port]);
 }
 
-static void handleUnsolicited(const char *line)
+static void handleUnsolicited(ATPortId_enum port, const char *line)
 {
-    if (s_unsolHandler != NULL)
+    if (s_unsolHandler[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] != NULL)
     {
-        s_unsolHandler(line, NULL);
+        s_unsolHandler[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2](line, NULL);
     }
 }
 
-static void processLine(ATPortType_enum port, const char *line)
+static void processLine(ATPortId_enum port, const char *line)
 {
     pthread_mutex_lock(&s_commandmutex[port]);
 //    LOGD("LINE : %s", line);
     if (sp_response[port] == NULL)
     {
         /* no command pending */
-        handleUnsolicited(line);
+        handleUnsolicited(port, line);
     }
     else if (isFinalResponseSuccess(line))
     {
@@ -297,7 +298,7 @@
     else switch (s_type[port])
         {
             case NO_RESULT:
-                handleUnsolicited(line);
+                handleUnsolicited(port, line);
                 break;
             case NUMERIC:
                 if (sp_response[port]->p_intermediates == NULL
@@ -310,7 +311,7 @@
                 {
                     /* either we already have an intermediate response or
                        the line doesn't begin with a digit */
-                    handleUnsolicited(line);
+                    handleUnsolicited(port, line);
                 }
                 break;
             case SINGLELINE:
@@ -343,7 +344,7 @@
                 else
                 {
                     /* we already have an intermediate response */
-                    handleUnsolicited(line);
+                    handleUnsolicited(port, line);
                 }
                 break;
             case MULTILINE:
@@ -353,13 +354,13 @@
                 }
                 else
                 {
-                    handleUnsolicited(line);
+                    handleUnsolicited(port, line);
                 }
                 break;
 
             default: /* this should never be reached */
                 LOGE("Unsupported AT command type %d\n", s_type[port]);
-                handleUnsolicited(line);
+                handleUnsolicited(port, line);
                 break;
         }
 
@@ -398,7 +399,7 @@
  * have buffered stdio.
  */
 
-static const char *readline(ATPortType_enum port)
+static const char *readline(ATPortId_enum port)
 {
     ssize_t count;
 
@@ -500,7 +501,7 @@
     return ret;
 }
 
-static const char *readlineUrc(ATPortType_enum port)
+static const char *readlineUrc(ATPortId_enum port)
 {
     ssize_t count;
 
@@ -508,37 +509,40 @@
     char *p_eol = NULL;
     char *ret;
 
+    mbtk_sim_type_enum sim_id = port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2;
+
+
     /* this is a little odd. I use *s_ATBufferCur == 0 to
      * mean "buffer consumed completely". If it points to a character, than
      * the buffer continues until a \0
      */
-    if (*s_UartBufferCur == '\0')
+    if (*s_UartBufferCur[sim_id] == '\0')
     {
         /* empty buffer */
-        s_UartBufferCur = s_UartBuffer;
-        *s_UartBufferCur = '\0';
-        p_read = s_UartBuffer;
+        s_UartBufferCur[sim_id] = s_UartBuffer[sim_id];
+        *s_UartBufferCur[sim_id] = '\0';
+        p_read = s_UartBuffer[sim_id];
     }
     else       /* *s_ATBufferCur != '\0' */
     {
         /* there's data in the buffer from the last read */
 
         // skip over leading newlines
-        while (*s_UartBufferCur == '\r' || *s_UartBufferCur == '\n')
-            s_UartBufferCur++;
+        while (*s_UartBufferCur[sim_id] == '\r' || *s_UartBufferCur[sim_id] == '\n')
+            s_UartBufferCur[sim_id]++;
 
-        p_eol = findNextEOL(s_UartBufferCur);
+        p_eol = findNextEOL(s_UartBufferCur[sim_id]);
 
         if (p_eol == NULL)
         {
             /* a partial line. move it up and prepare to read more */
             size_t len;
 
-            len = strlen(s_UartBufferCur);
+            len = strlen(s_UartBufferCur[sim_id]);
 
-            memmove(s_UartBuffer, s_UartBufferCur, len + 1);
-            p_read = s_UartBuffer + len;
-            s_UartBufferCur = s_UartBuffer;
+            memmove(s_UartBuffer[sim_id], s_UartBufferCur[sim_id], len + 1);
+            p_read = s_UartBuffer[sim_id] + len;
+            s_UartBufferCur[sim_id] = s_UartBuffer[sim_id];
         }
         /* Otherwise, (p_eol !- NULL) there is a complete line  */
         /* that will be returned the while () loop below        */
@@ -546,19 +550,19 @@
 
     while (p_eol == NULL)
     {
-        if (0 == MAX_AT_RESPONSE - (p_read - s_UartBuffer))
+        if (0 == MAX_AT_RESPONSE - (p_read - s_UartBuffer[sim_id]))
         {
             LOGE("ERROR: Input line exceeded buffer\n");
             /* ditch buffer and start over again */
-            s_UartBufferCur = s_UartBuffer;
-            *s_UartBufferCur = '\0';
-            p_read = s_UartBuffer;
+            s_UartBufferCur[sim_id] = s_UartBuffer[sim_id];
+            *s_UartBufferCur[sim_id] = '\0';
+            p_read = s_UartBuffer[sim_id];
         }
 
         do
         {
-            count = read(s_uart_fd, p_read,
-                         MAX_AT_RESPONSE - (p_read - s_UartBuffer));
+            count = read(s_uart_fd[sim_id], p_read,
+                         MAX_AT_RESPONSE - (p_read - s_UartBuffer[sim_id]));
             usleep(10000);
         }
         while (count < 0 && errno == EINTR);
@@ -570,10 +574,10 @@
             p_read[count] = '\0';
 
             // skip over leading newlines
-            while (*s_UartBufferCur == '\r' || *s_UartBufferCur == '\n')
-                s_UartBufferCur++;
+            while (*s_UartBufferCur[sim_id] == '\r' || *s_UartBufferCur[sim_id] == '\n')
+                s_UartBufferCur[sim_id]++;
 
-            p_eol = findNextEOL(s_UartBufferCur);
+            p_eol = findNextEOL(s_UartBufferCur[sim_id]);
             p_read += count;
         }
         else if (count <= 0)
@@ -593,18 +597,17 @@
 
     /* a full line in the buffer. Place a \0 over the \r and return */
 
-    ret = s_UartBufferCur;
+    ret = s_UartBufferCur[sim_id];
     *p_eol = '\0';
-    s_UartBufferCur = p_eol + 1; /* this will always be <= p_read,    */
+    s_UartBufferCur[sim_id] = p_eol + 1; /* this will always be <= p_read,    */
     /* and there will be a \0 at *p_read */
 
-    LOGD("[Port-%d]URC< %s", port, ret);
+    LOGD("[Sim-%d,Port-%d]URC< %s", sim_id, port, ret);
     return ret;
 }
 
 
-
-static void onReaderClosed(ATPortType_enum port)
+static void onReaderClosed(ATPortId_enum port)
 {
     LOGD("onReaderClosed()");
     if (s_onReaderClosed != NULL && s_readerClosed == 0)
@@ -633,7 +636,7 @@
 static void *readerLoop(void *arg)
 {
     UNUSED(arg);
-    ATPortType_enum *port = (ATPortType_enum*)arg;
+    ATPortId_enum *port = (ATPortId_enum*)arg;
     for (;;)
     {
         const char * line;
@@ -673,9 +676,9 @@
                 break;
             }
 
-            if (s_unsolHandler != NULL)
+            if (s_unsolHandler[*port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] != NULL)
             {
-                s_unsolHandler (line1, line2);
+                s_unsolHandler[*port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] (line1, line2);
             }
             free(line1);
         }
@@ -695,7 +698,7 @@
 static void *readerUrcLoop(void *arg)
 {
     UNUSED(arg);
-    ATPortType_enum *port = (ATPortType_enum*)arg;
+    ATPortId_enum *port = (ATPortId_enum*)arg;
     for (;;)
     {
         const char *line;
@@ -707,7 +710,7 @@
             break;
         }
 
-        handleUnsolicited(line);
+        handleUnsolicited(*port, line);
     }
 
     onReaderClosed(*port);
@@ -725,7 +728,7 @@
  * This function exists because as of writing, android libc does not
  * have buffered stdio.
  */
-static int writeline (ATPortType_enum port, const char *s)
+static int writeline (ATPortId_enum port, const char *s)
 {
     size_t cur = 0;
     size_t len = strlen(s);
@@ -776,7 +779,7 @@
     return 0;
 }
 
-static int writeCtrlZ (ATPortType_enum port, const char *s)
+static int writeCtrlZ (ATPortId_enum port, const char *s)
 {
     size_t cur = 0;
     size_t len = strlen(s);
@@ -824,7 +827,7 @@
     return 0;
 }
 
-static void clearPendingCommand(ATPortType_enum port)
+static void clearPendingCommand(ATPortId_enum port)
 {
     if (sp_response[port] != NULL)
     {
@@ -841,21 +844,21 @@
  * Starts AT handler on stream "fd'
  * returns 0 on success, -1 on error
  */
-int at_open(ATPortType_enum port, int at_fd, int uart_fd, ATUnsolHandler h)
+int at_open(ATPortId_enum port, int at_fd, int uart_fd, ATUnsolHandler h)
 {
     int ret;
     pthread_attr_t attr;
 
     s_at_fd[port] = at_fd;
-    s_uart_fd = uart_fd;
-    s_unsolHandler = h;
+    s_uart_fd[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] = uart_fd;
+    s_unsolHandler[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] = h;
     s_readerClosed = 0;
     s_responsePrefix[port] = NULL;
     s_smsPDU[port] = NULL;
     sp_response[port] = NULL;
 
-    ATPortType_enum *at_port_ptr = (ATPortType_enum*)malloc(sizeof(ATPortType_enum));
-    ATPortType_enum *urc_port_ptr = (ATPortType_enum*)malloc(sizeof(ATPortType_enum));
+    ATPortId_enum *at_port_ptr = (ATPortId_enum*)malloc(sizeof(ATPortId_enum));
+    ATPortId_enum *urc_port_ptr = (ATPortId_enum*)malloc(sizeof(ATPortId_enum));
     *at_port_ptr = port;
     *urc_port_ptr = port;
 
@@ -868,7 +871,7 @@
         return -1;
     }
 
-    if(port == ATPORTTYPE_0) { // URC only for ATPORTTYPE_0
+    if(port == ATPORTID_SIM1_0 || port == ATPORTID_SIM2_0) { // URC only for ATPORTTYPE_0
         pthread_t uart_tid_reader;
         ret = pthread_create(&uart_tid_reader, &attr, readerUrcLoop, urc_port_ptr);
         if (ret < 0)
@@ -882,19 +885,19 @@
 }
 
 /* FIXME is it ok to call this from the reader and the command thread? */
-void at_close(ATPortType_enum port)
+void at_close(ATPortId_enum port)
 {
     LOGD("at_close()");
     if (s_at_fd[port] >= 0)
     {
         close(s_at_fd[port]);
     }
-    if (s_uart_fd >= 0)
+    if (s_uart_fd[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] >= 0)
     {
-        close(s_uart_fd);
+        close(s_uart_fd[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2]);
     }
     s_at_fd[port] = -1;
-    s_uart_fd = -1;
+    s_uart_fd[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] = -1;
 
     pthread_mutex_lock(&s_commandmutex[port]);
     s_readerClosed = 1;
@@ -976,7 +979,7 @@
  *
  * timeoutMsec == 0 means infinite timeout
  */
-static int at_send_command_full_nolock (ATPortType_enum port, const char *command, ATCommandType type,
+static int at_send_command_full_nolock (ATPortId_enum port, const char *command, ATCommandType type,
                                         const char *responsePrefix, const char *smspdu,
                                         long long timeoutMsec, ATResponse **pp_outResponse)
 {
@@ -1074,7 +1077,7 @@
  *
  * timeoutMsec == 0 means infinite timeout
  */
-static int at_send_command_full (ATPortType_enum port, const char *command, ATCommandType type,
+static int at_send_command_full (ATPortId_enum port, const char *command, ATCommandType type,
                                  const char *responsePrefix, const char *smspdu,
                                  long long timeoutMsec, ATResponse **pp_outResponse)
 {
@@ -1119,14 +1122,14 @@
  * if non-NULL, the resulting ATResponse * must be eventually freed with
  * at_response_free
  */
-int at_send_command (ATPortType_enum port, const char *command, ATResponse **pp_outResponse)
+int at_send_command (ATPortId_enum port, const char *command, ATResponse **pp_outResponse)
 {
     return at_send_command_full (port, command, NO_RESULT, NULL,
                                  NULL, 0, pp_outResponse);
 }
 
 
-int at_send_command_singleline (ATPortType_enum port, const char *command,
+int at_send_command_singleline (ATPortId_enum port, const char *command,
                                 const char *responsePrefix,
                                 ATResponse **pp_outResponse)
 {
@@ -1149,7 +1152,7 @@
     return err;
 }
 
-int at_send_command_singleline_with_timeout (ATPortType_enum port, const char *command,
+int at_send_command_singleline_with_timeout (ATPortId_enum port, const char *command,
         const char *responsePrefix,
         ATResponse **pp_outResponse,long long timeoutMsec)
 {
@@ -1174,7 +1177,7 @@
 
 
 
-int at_send_command_numeric (ATPortType_enum port, const char *command,
+int at_send_command_numeric (ATPortId_enum port, const char *command,
                              ATResponse **pp_outResponse)
 {
     int err;
@@ -1197,7 +1200,7 @@
 }
 
 
-int at_send_command_sms (ATPortType_enum port, const char *command,
+int at_send_command_sms (ATPortId_enum port, const char *command,
                          const char *pdu,
                          const char *responsePrefix,
                          ATResponse **pp_outResponse)
@@ -1222,7 +1225,7 @@
 }
 
 
-int at_send_command_multiline (ATPortType_enum port, const char *command,
+int at_send_command_multiline (ATPortId_enum port, const char *command,
                                const char *responsePrefix,
                                ATResponse **pp_outResponse)
 {
@@ -1258,7 +1261,7 @@
  * Periodically issue an AT command and wait for a response.
  * Used to ensure channel has start up and is active
  */
-int at_handshake(ATPortType_enum port)
+int at_handshake(ATPortId_enum port)
 {
 //    int i;
     int err = 0;
@@ -1340,12 +1343,12 @@
     return ret;
 }
 
-mbtk_ril_at_state_enum at_state_get(ATPortType_enum port)
+mbtk_ril_at_state_enum at_state_get(ATPortId_enum port)
 {
     return at_state[port];
 }
 
-void at_state_set(ATPortType_enum port, mbtk_ril_at_state_enum state)
+void at_state_set(ATPortId_enum port, mbtk_ril_at_state_enum state)
 {
     at_state[port] = state;
 }
@@ -1358,7 +1361,7 @@
     return true;
 }
 
-void unused_func(ATPortType_enum port)
+void unused_func(ATPortId_enum port)
 {
     isFinalResponse(port, NULL);
 }