[feature] e-call add wait-event 3

Change-Id: I750defe9bce5d9d393c38cbd3bebd56ef9d598fe
diff --git a/lib/liblynq-call/lynq_call.cpp b/lib/liblynq-call/lynq_call.cpp
index fc6a9da..eef91c6 100755
--- a/lib/liblynq-call/lynq_call.cpp
+++ b/lib/liblynq-call/lynq_call.cpp
@@ -119,16 +119,32 @@
 bool call_list_loop = 1;

 int isDial = 0;

 int lynqIncomingCallId = 0;

-/*E-CALL begin*/

-typedef enum{		

-    LYNQ_ECALL_TYPE_TEST = 0, 	/* Test eCall */

-    LYNQ_ECALL_TYPE_RECONFIG = 1,	/*	Reconfiguration eCall */	

+

+#ifdef ECALL_SUPPORT

+typedef enum{        

+    LYNQ_ECALL_TYPE_TEST = 0,     /* Test eCall */

+    LYNQ_ECALL_TYPE_RECONFIG = 1,    /*    Reconfiguration eCall */    

     LYNQ_ECALL_MANUAL_EMERGENCY = 2,   /*Manual Emergency eCall */

     LYNQ_ECALL_TYPE_AUTO_EMERGENCY = 3,   /* Automatic Emergency eCall */\

 }LYNQ_ECall_Type;

 

-char e_call_addr[LYNQ_ECALL_VAR_MAX][LYNQ_PHONE_NUMBER_MAX]={"","112","112"};

-/*E-CALL end*/

+char e_call_addr[LYNQ_ECALL_VAR_MAX][LYNQ_PHONE_NUMBER_MAX]={"","null","112"};

+

+

+

+static pthread_mutex_t s_incoming_e_call_mutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t s_incoming_e_call_cond = PTHREAD_COND_INITIALIZER;

+

+LYNQ_ECall_Indication lynqIncomingEcallIndication;

+int lynqEcallId;

+

+void sendSignalIncomingECallEvent()

+{

+    pthread_mutex_lock(&s_incoming_e_call_mutex);

+    pthread_cond_signal(&s_incoming_e_call_cond);

+    pthread_mutex_unlock(&s_incoming_e_call_mutex);

+}

+#endif

 

 /**

  * @brief mark call initialization state

@@ -384,8 +400,10 @@
     bool call_end;

     call_end = 0;//0:this call end,1:call on

     lynq_call_list_t call_list[LYNQ_CALL_MAX];

+    int update=0;

     while(call_list_loop)

     {

+        update=0;

         pthread_mutex_lock(&s_urc_call_state_change_mutex);

         pthread_cond_wait(&s_urc_call_state_change_cond, &s_urc_call_state_change_mutex);

         LYDBGLOG("triggerGetCallList event!!!\n");

@@ -471,9 +489,14 @@
                         lynq_call_lists[n].hasTimeout==0;

                         continue;

                     }

-                    if(strcmp(call_list[i].addr,lynq_call_lists[n].addr)==0)

+                    LYDBGLOG("lynq_call_lists n is %d, used is %d, addr is %s addr2 %s\n",

+                    n,lynq_call_lists[n].used,call_list[i].addr,lynq_call_lists[n].addr);

+                    if(lynq_call_lists[n].used && (strcmp(call_list[i].addr,lynq_call_lists[n].addr)==0))

                     {

+                        LYINFLOG("updated\n");                    

                         updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);

+                        update=1;

+                        break;

                     }

                 }

                 LYDBGLOG("[count:%d]call_id=%d,call_state=%d,direction=%d,addr=%s,toa=%d",i,call_list[i].call_id,call_list[i].call_state,

@@ -481,7 +504,7 @@
             }

         }

         s_call_urc_event_complete = 1;

-        if(isDial==1)

+        if((isDial==1) && (update==1))

         {

             sendSignalToWaitCallStateChange();

             isDial = 0;

@@ -569,6 +592,10 @@
     int urcid = -1;

     Parcel *p = NULL;

     struct sockaddr_in dest_addr;

+#ifdef ECALL_SUPPORT

+    int ecall_ind;    

+#endif

+

     LYINFLOG("thread_urc_recv in running....\n");

     while(urc_call_recive_status)

     {

@@ -617,6 +644,24 @@
                      LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);

                     break;

                 }

+#ifdef ECALL_SUPPORT

+                case RIL_UNSOL_ECALL_INDICATIONS:

+                {

+                    p->readInt32(&ecall_ind);                  

+                    lynqIncomingEcallIndication=ecall_ind;

+                    if(LYNQ_ECALL_ACTIVE==lynqIncomingEcallIndication)

+                    {

+                        if(isDial==1)

+                        {                               

+                            p->readInt32(&lynqEcallId);

+                            sendSignalToWaitCallStateChange();

+                            usleep(300*1000);

+                        }                              

+                    }     

+                    sendSignalIncomingECallEvent();

+                    break;

+                 }

+#endif

                 default:

                     break;

             }

@@ -1148,21 +1193,33 @@
     RIL_ECall_Variant ril_ecall_variant = lynq_get_ril_ecall_variant_from_lynq_variant (lynq_ecall_variant);

     RIL_ECall_Category ril_ecall_cat = lynq_get_ril_ecall_cat_from_lynq_cat(lynq_ecall_cat);

 

+    lynq_call_id = updateAddr(e_call_addr[lynq_ecall_variant]);

+

+    LYINFLOG("e_call_addr is %s\n",e_call_addr[lynq_ecall_variant]);

+

     error=lynq_set_common_request(RIL_REQUEST_ECALL_FAST_MAKE_ECALL,4,"%d %d %s %s",ril_ecall_cat, ril_ecall_variant, "null", msd_data);

    

     if(error==0)

-    {

-        lynq_call_id = updateAddr(e_call_addr[lynq_ecall_variant]);

+    {        

         isDial = 1;

-        if(waitCallstateChange(10000)==ETIMEDOUT)//10000ms

+        if(waitCallstateChange(30000)==ETIMEDOUT)//30000ms

         {

+            isDial = 0;

             error = LYNQ_E_TIME_OUT;

-            LYERRLOG("timeout:wait Call state fail!!!");

-            lynq_call_lists[lynq_call_id].hasTimeout = 1;

+            cleanCallList(lynq_call_id);

+            LYERRLOG("timeout:wait Call state fail!!!");           

             return error;

         }

- 

+         

         *handle = lynq_call_id;

+        if(lynq_ecall_variant==LYNQ_ECALL_EMERGENCY){

+            lynq_call_lists[lynq_call_id].call_id=lynqEcallId;

+        }

+        LYINFLOG("lynq_fast_ecall handle is:%d, call id is %d",lynq_call_id,lynq_call_lists[lynq_call_id].call_id);

+        

+    }

+    else {

+        cleanCallList(lynq_call_id);

     }

 

     return error;

@@ -1238,6 +1295,24 @@
 {

     return lynq_set_common_request(RIL_REQUEST_ECALL_IVS_PUSH_MSD,0,"");    

 }

+

+int wait_ecall_event()

+{

+    int ret = 0;

+    pthread_mutex_lock(&s_incoming_e_call_mutex);

+    ret = pthread_cond_wait(&s_incoming_e_call_cond,&s_incoming_e_call_mutex);

+    pthread_mutex_unlock(&s_incoming_e_call_mutex);

+    return ret;

+}

+

+int lynq_wait_ecall_indication(LYNQ_ECall_Indication *eCall_Indication)

+{

+    wait_ecall_event();

+    *eCall_Indication = lynqIncomingEcallIndication;

+    LYINFLOG("lynq incoming e-call indication id:%d",lynqIncomingEcallIndication);

+    return 0;

+}

+

 #endif

 

 #if 0