[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