[feature] ecall add abnormal process and cs call handle changed from index to call id
Change-Id: Iffc5ae14b06fa96c3ad3b6a1c77f9784654dce04
diff --git a/src/lynq/lib/liblynq-call/lynq_call.cpp b/src/lynq/lib/liblynq-call/lynq_call.cpp
index 48266b8..fd07b15 100755
--- a/src/lynq/lib/liblynq-call/lynq_call.cpp
+++ b/src/lynq/lib/liblynq-call/lynq_call.cpp
@@ -25,6 +25,7 @@
#define LYNQ_REC_BUF 8192
#define LYNQ_REQUEST_PARAM_BUF 8192
#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3
+#define INVALID_ID (-1)
#define USER_LOG_TAG "LYNQ_CALL"
using ::android::Parcel;
@@ -54,7 +55,6 @@
int toa;
int direction;/*0: MO call,1:MT call*/
char addr[LYNQ_PHONE_NUMBER_MAX];
- int hasTimeout;
}lynq_call_list_e_t;
typedef struct
{
@@ -106,7 +106,13 @@
/* The logic conflict*/
LYNQ_E_CONFLICT=9000,
/*Null anomaly*/
- LYNQ_E_NULL_ANONALY=9001
+ LYNQ_E_NULL_ANONALY=9001,
+ /*Invalid id anomaly*/
+ LYNQ_E_INVALID_ID_ANONALY=9002,
+#ifdef ECALL_SUPPORT
+ LYNQ_E_ECALL_BEING_RUNNING =9003,
+ LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,
+#endif
}LYNQ_E;
typedef enum{
LYNQ_E_VOLUMN_SET_DTMF,
@@ -124,6 +130,9 @@
int lynqIncomingCallId = 0;
#ifdef ECALL_SUPPORT
+int lynq_set_common_request(int request_id, int argc, const char* format,...);
+int is_ecall_dial = 0;
+int g_ecallId = INVALID_ID;
typedef enum{
LYNQ_ECALL_TYPE_TEST = 0, /* Test eCall */
LYNQ_ECALL_TYPE_RECONFIG = 1, /* Reconfiguration eCall */
@@ -131,22 +140,41 @@
LYNQ_ECALL_TYPE_AUTO_EMERGENCY = 3, /* Automatic Emergency eCall */\
}LYNQ_ECall_Type;
-char e_call_addr[LYNQ_ECALL_VAR_MAX][LYNQ_PHONE_NUMBER_MAX]={"","null","112"};
-
-
+char e_call_addr[LYNQ_ECALL_VAR_MAX][LYNQ_PHONE_NUMBER_MAX]={"test_ecall","emergency_ecall","reconf_ecall"};
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;
+LYNQ_ECall_Indication g_lynqIncomingEcallIndication;
void sendSignalIncomingECallEvent()
{
+ LYINFLOG("send incoming ecall event signal");;
pthread_mutex_lock(&s_incoming_e_call_mutex);
pthread_cond_signal(&s_incoming_e_call_cond);
pthread_mutex_unlock(&s_incoming_e_call_mutex);
}
+
+int lynq_is_msd_suc(LYNQ_ECall_Indication lynqIncomingEcallIndication)
+{
+ if(LYNQ_ECALL_LLACK_RECEIVED == lynqIncomingEcallIndication ||
+ LYNQ_ECALL_ALACK_POSITIVE_RECEIVED == lynqIncomingEcallIndication ||
+ LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED == lynqIncomingEcallIndication ||
+ LYNQ_ECALL_T5_TIMER_OUT == lynqIncomingEcallIndication ||
+ LYNQ_ECALL_T6_TIMER_OUT == lynqIncomingEcallIndication ||
+ LYNQ_ECALL_T7_TIMER_OUT == lynqIncomingEcallIndication)
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+int lynq_ecall_is_running()
+{
+ return (is_ecall_dial!=0) || (g_ecallId !=INVALID_ID);
+}
+
#endif
/**
@@ -177,7 +205,7 @@
ret = sendto(sockfd, client_tmp, client_size, 0, (struct sockaddr *)&addr_serv, len_addr_serv);
if(ret==-1)
{
- LYERRLOG("sendto error\n");
+ LYERRLOG("sendto error");
return -1;
}
return 0;
@@ -192,7 +220,7 @@
len = recvfrom(sockfd,recvline,LYNQ_REC_BUF, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
if(len == -1)
{
- LYERRLOG("recvfrom error\n");
+ LYERRLOG("recvfrom error");
return -1;
}
if (recvline != NULL) {
@@ -225,7 +253,7 @@
client.request = 9;//RIL_REQUEST_GET_CURRENT_CALLS
client.paramLen = 0;
bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
- LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
+ LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
if(send_request(lynq_call_client_sockfd,&client)==-1)
{
LYERRLOG("send request fail");
@@ -245,7 +273,7 @@
return 0;
}
lynq_call_state = CALL_ON;
- LYINFLOG("lynq_call_state:%d",lynq_call_state);
+ LYINFLOG("lynq_call_state:%d, call num is %d ",lynq_call_state,call_num);
for(int i = 0;i < call_num;i++)
{
p.readInt32(&temp);
@@ -281,12 +309,12 @@
void cleanCallList(int lynq_call_id)
{
+ LYINFLOG("cleanCall local idx is %d, id is %d",lynq_call_id,lynq_call_lists[lynq_call_id].call_id);
lynq_call_lists[lynq_call_id].call_id = 0;
lynq_call_lists[lynq_call_id].call_state = (int)LYNQ_CALL_END;
lynq_call_lists[lynq_call_id].toa = 0;
lynq_call_lists[lynq_call_id].direction = 0;
lynq_call_lists[lynq_call_id].used = 0;
- lynq_call_lists[lynq_call_id].hasTimeout = 0;
memset(lynq_call_lists[lynq_call_id].addr,0,sizeof(lynq_call_lists[lynq_call_id].addr));
}
int getUnusedElement()
@@ -300,23 +328,22 @@
}
return -1;
}
-int updateAddr(char addr[])
+int addAddr(char addr[])
{
int ret = 0;
ret = getUnusedElement();
memcpy(lynq_call_lists[ret].addr,addr,strlen(addr)+1);
lynq_call_lists[ret].used = 1;
+ LYINFLOG("add local idx is %d addr is %s",ret,addr);
return ret;
}
void updateCallList(lynq_call_list_e_t *callList, int call_id,int call_state,int toa,int direction)
{
- LYINFLOG("Update Call List");
+ LYINFLOG("Update original local id is %d, new local id is %d",callList->call_id,call_id);
callList->call_id = call_id;
callList->call_state = call_state;
callList->toa = toa;
- callList->direction = direction;
- callList->used = 1;
- callList->hasTimeout = 0;
+ callList->direction = direction;
return;
}
int waitCallstateChange(int mtime)
@@ -348,28 +375,43 @@
}
int checkHasCall(char addr[])
{
- LYINFLOG("check has call");
for(int i = 0;i<LYNQ_CALL_MAX;i++)
{
if(strcmp(lynq_call_lists[i].addr,addr)==0)
{
+ LYINFLOG("checkHasCall addr is %s idx is %d id is %d",addr,i,lynq_call_lists[i].call_id);
return 1;
}
}
+ LYINFLOG("checkHasCall addr is %s , no idx is found",addr);
return 0;
}
int find_call_id_with_addr(char *addr)
{
- LYINFLOG("find call id with addr!!!");
for(int id = 0; id < LYNQ_CALL_MAX; id++)
{
- if(strcmp(lynq_call_lists[id].addr,addr) == 0)
+ if(lynq_call_lists[id].used && (strcmp(lynq_call_lists[id].addr,addr) == 0))
{
+ LYINFLOG("find addr %s in local list, local idx is %d id is %d",addr,id,lynq_call_lists[id].call_id);
return id;
}
}
+ LYINFLOG("find addr %s in local list , not found",addr);
return -1;
}
+int find_call_id_with_call_id(int call_id)
+{
+ for(int id = 0; id < LYNQ_CALL_MAX; id++)
+ {
+ if(lynq_call_lists[id].used && (lynq_call_lists[id].call_id == call_id))
+ {
+ LYINFLOG("find id %d in local list, local idx is %d, addr is %s",call_id,id,lynq_call_lists[id].addr);
+ return id;
+ }
+ }
+ LYINFLOG("find id %d in local list , not found",call_id);
+ return INVALID_ID;
+}
void sendSignalToWaitCallStateChange()
{
LYINFLOG("send Signal To Wait Call State Change");
@@ -393,7 +435,6 @@
callList->direction = direction;
memcpy(callList->addr,addr,strlen(addr)+1);
callList->used = 1;
- callList->hasTimeout = 0;
return;
}
@@ -401,120 +442,173 @@
{
int ret=0;
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;
+ int cnt;
+ int i,n;
+
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");
+ LYDBGLOG("triggerGetCallList event!!!");
memset(call_list,0,sizeof(call_list));
ret = lynq_get_current_call_list(call_list);
if(ret != 0)
{
- LYDBGLOG("get current call list failure!!!\n");
+ LYDBGLOG("get current call list failure!!!");
continue;
}
LYINFLOG("++++++++++++++triggerGetCallList++++++++++++++");
- for(int i = 0;i < LYNQ_CALL_MAX;i++)
+ LYINFLOG("clear local index begin");
+ cnt=0;
+ for(i = 0;i < LYNQ_CALL_MAX;i++)
{
- if(strlen(lynq_call_lists[i].addr) != 0)
+ if(lynq_call_lists[i].used ==0)
+ {
+ continue;
+ }
+ cnt++;
+ LYINFLOG("local idx is %d id is %d addr is %s state is %d direction is %d",i,lynq_call_lists[i].call_id,lynq_call_lists[i].addr,lynq_call_lists[i].call_state,lynq_call_lists[i].direction);
+
+ if(lynq_call_lists[i].call_id > 0)
{
call_end = 0;
- for(int id = 0; id < LYNQ_CALL_MAX; id++)
+ for(n = 0; n < LYNQ_CALL_MAX; n++)
{
- if(strcmp(call_list[id].addr,lynq_call_lists[i].addr) == 0)
+ if(call_list[n].call_id == lynq_call_lists[i].call_id)
{
call_end = 1;
- LYINFLOG("find lynq call i %d, id %d!!!",i,id);
+ LYINFLOG("find lynq call local idx %d, service idx %d id is %d!!!",i,n,lynq_call_lists[i].call_id);
+ break;
}
}
if(call_end == 0)
{
- LYINFLOG("MT hungup,then clean call info");
- cleanCallList(i);
- continue;
+ LYINFLOG("MT hungup,then clean call info local idx is %d id is %d",i, lynq_call_lists[i].call_id);
+ cleanCallList(i);
}
} //fix bug API-54
+ else
+ {
+ LYINFLOG("local id is 0");
+ }
+ }
+ LYINFLOG("clear local index end, local used cnt is %d", cnt);
+
+ LYINFLOG("add or update local index begin ");
+ for (i = 0;i < LYNQ_CALL_MAX;i++)
+ {
+ if(call_list[i].call_id==0)
+ {
+ break;
+ }
+
+ LYINFLOG("servie idx %d begin: call_id=%d, call_state=%d, direction=%d, addr=%s, toa=%d",i,call_list[i].call_id, call_list[i].call_state,
+ call_list[i].direction,call_list[i].addr,call_list[i].toa);
+
if(call_list[i].direction == 1)//MT call
{
+ LYINFLOG("This is a MT CALL");
/*MT CALL state code
**LYNQ_CALL_INCOMING = 4,
**LYNQ_CALL_WAITING = 5,
*/
if((call_list[i].call_state ==4) || (call_list[i].call_state ==5))
{
- /*you call me, and i call you,One party failed to dial*/
- if(!checkHasCall(call_list[i].addr))
+#ifdef ECALL_SUPPORT
+ if(lynq_ecall_is_running())
{
- lynqIncomingCallId = getUnusedElement();
- addCallListToLynqCallList(&lynq_call_lists[lynqIncomingCallId],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction,call_list[i].addr);
- sendSignalIncomingCall();
+ lynq_call_hungup(&(call_list[i].call_id));
+ continue;
}
- else
+#endif
+ }
+ /*you call me, and i call you,One party failed to dial*/
+ n = find_call_id_with_addr(call_list[i].addr);
+ if(n ==INVALID_ID)
+ {
+ n = addAddr(call_list[i].addr);
+ updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
+ lynqIncomingCallId = call_list[i].call_id;
+ sendSignalIncomingCall();
+ }
+ else if(lynq_call_lists[n].call_state == call_list[i].call_state)
+ {
+ LYINFLOG("state not changed, state is %d ",call_list[i].call_state);
+ if(call_list[i].call_state ==4 || call_list[i].call_state ==5)
{
- int temp_call_id = find_call_id_with_addr(call_list[i].addr);
/*if call state not change,Maybe this call was ignored, so we need to continue to inform the user of
**an incoming call until the status changes.
**fix bug API-54
*/
- if((temp_call_id > 0) && (lynq_call_lists[temp_call_id].call_state == call_list[i].call_state))
- {
- sendSignalIncomingCall();
- }
+ LYINFLOG("resend incoming call signal");
+ sendSignalIncomingCall();
}
}
- /*if state changed*/
- else
+ else
{
- /*update call state*/
- for(int n = 0 ; n < LYNQ_CALL_MAX; n++)
- {
- if(strcmp(call_list[i].addr,lynq_call_lists[n].addr)==0)
- {
- updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
- break;
- }
- }
- }
+ LYINFLOG("state changed from %d to %d",lynq_call_lists[n].call_state,call_list[i].call_state);
+
+ updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
+ }
}
else
- {
- if(call_list[i].call_id==0)
+ {
+ LYINFLOG("This is a MO CALL");
+ call_end = 0;
+ for(n = 0 ; n < LYNQ_CALL_MAX; n++)
{
- break;
- }
- for(int n = 0 ; n < LYNQ_CALL_MAX; n++)
- {
- if((lynq_call_lists[n].hasTimeout == 1) && (strcmp(lynq_call_lists[n].addr,call_list[i].addr) == 0))
+ if(lynq_call_lists[n].used && ((strcmp(call_list[i].addr,lynq_call_lists[n].addr)==0)||(call_list[i].call_id==lynq_call_lists[n].call_id)))
{
- cleanCallList(n);//if this call time out,need clean lynq call list.
- /*hangup call with call id*/
- lynq_call_hungup(&call_list[i].call_id);
- lynq_call_lists[n].hasTimeout==0;
+ if(lynq_call_lists[n].call_id==0)
+ {
+ LYINFLOG("add a call id");
+ update=1;
+ }
+ LYINFLOG("local idx %d updated, original call id is %d origial addr is %s original state is %d",n,lynq_call_lists[n].call_id,lynq_call_lists[n].addr,lynq_call_lists[n].call_state);
+ updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
+ call_end = 1;
+ break;
+ }
+ }
+
+ if(call_end == 0)
+ {
+ LYINFLOG("need to hangup id %d", call_list[i].call_id);
+#ifdef ECALL_SUPPORT
+ if(is_ecall_dial==1)
+ {
+ LYINFLOG("ecall is dialing, for the timebeing, don't huangup");
continue;
}
- 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;
- }
+#endif
+ LYINFLOG("hang up service call id %d",call_list[i].call_id);
+ lynq_call_hungup(&(call_list[i].call_id));
}
- 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,
- call_list[i].direction,call_list[i].addr,call_list[i].toa);
}
+ LYDBGLOG("servie idx %d end",i);
}
+ LYINFLOG("add or update local index end ");
s_call_urc_event_complete = 1;
- if((isDial==1) && (update==1))
+ if(isDial==1)
{
- sendSignalToWaitCallStateChange();
- isDial = 0;
+ LYINFLOG("now is dialing");
+ if(update==1)
+ {
+ LYINFLOG("find added call");
+ sendSignalToWaitCallStateChange();
+ isDial = 0;
+ }
+ else
+ {
+ LYINFLOG("not find added call");
+ }
+ }
+ else
+ {
+ LYINFLOG("now is not dialing");
}
pthread_mutex_unlock(&s_urc_call_state_change_mutex);
}
@@ -547,14 +641,14 @@
/*
if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)
{
- LYDBGLOG("[%s] is not a valid IPaddress\n", argv[1]);
+ LYDBGLOG("[%s] is not a valid IPaddress", argv[1]);
exit(1);
}
*/
lynq_call_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(connect(lynq_call_client_sockfd, (struct sockaddr *)&lynq_socket_server_addr, sizeof(lynq_socket_server_addr)) == -1)
{
- LYERRLOG("connect error\n");
+ LYERRLOG("connect error");
return -1;
}
#endif
@@ -583,10 +677,11 @@
LYERRLOG("lynq_update_call_list_loop fail!!!");
return -1;
}
- LYDBGLOG("lynq_update_call_list_loop success!!!\n");
+ LYDBGLOG("lynq_update_call_list_loop success!!!");
return 0;
}
+
void *thread_urc_recv(void *parg)
{
int socket_fd = (int64_t)parg;
@@ -600,10 +695,12 @@
Parcel *p = NULL;
struct sockaddr_in dest_addr;
#ifdef ECALL_SUPPORT
- int ecall_ind;
+ int ecall_ind;
+ int ecallId;
+ int unused_callid;
#endif
- LYINFLOG("thread_urc_recv in running....\n");
+ LYINFLOG("thread_urc_recv in running....");
while(urc_call_recive_status)
{
bzero(urc_data,LYNQ_REC_BUF);
@@ -611,10 +708,10 @@
len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);
if(len <= 0)
{
- LYERRLOG("thread_urc_recv step2 fail\n");
+ LYERRLOG("thread_urc_recv step2 fail");
break;
}
- LYDBGLOG("=====>urc data len<=====:%d\n",len);
+ LYDBGLOG("=====>urc data len<=====:%d",len);
p = new Parcel();
if(p==NULL)
{
@@ -628,12 +725,12 @@
p->readInt32(&resp_type);
p->readInt32(&urcid);
p->readInt32(&slot_id);
- //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
+ //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
switch (urcid)
{
case 1001://RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED
{
- LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
+ LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lynqRespWatingEvent();
break;
}
@@ -648,24 +745,95 @@
case 1029://RIL_UNSOL_RINGBACK_TONE
case 3049://RIL_UNSOL_CALL_INFO_INDICATION
{
- LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
+ LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",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);
+ p->readInt32(&ecall_ind);
+ g_lynqIncomingEcallIndication = ecall_ind;
+ p->readInt32(&ecallId);
+ LYINFLOG("**************:RIL_UNSOL_ECALL_INDICATIONS ,Id %d, ind %d, ecall dialing is %d, normal dialing is %d, local ecall id is %d",ecallId,ecall_ind,is_ecall_dial,isDial,g_ecallId);
+ if(lynq_is_msd_suc(g_lynqIncomingEcallIndication))
+ {
+ if(is_ecall_dial)
+ {
+ LYINFLOG("ecall is dialing, recv suc indication");
+ is_ecall_dial=0;
+ if(ecallId >0 && find_call_id_with_call_id(ecallId)==INVALID_ID)
+ {
+ LYINFLOG("add ecall in loacl list");
+ g_ecallId = ecallId;
+ unused_callid=addAddr("ecall");
+ lynq_call_lists[unused_callid].call_id=g_ecallId;
+ }
sendSignalToWaitCallStateChange();
- usleep(300*1000);
- }
- }
+ }
+ else if(ecallId >0 && (find_call_id_with_call_id(ecallId)==INVALID_ID)){
+ LYERRLOG("ecall is not in dialing and first recv suc indication, hangup");
+ lynq_call_hungup(&ecallId);
+ }
+ else
+ {
+ LYERRLOG("ecall is not in dialing and not first recv suc indication");
+ }
+ }
+ else if (LYNQ_ECALL_PSAP_CALLBACK_START == g_lynqIncomingEcallIndication)
+ {
+ if(lynq_ecall_is_running()==0)
+ {
+ LYINFLOG("ecall is not running, recv psap call back msd start, set ecall in dialing");
+ is_ecall_dial=1;
+ if(isDial)
+ {
+ LYINFLOG("stop normal dial");
+ sendSignalToWaitCallStateChange();
+ }
+ else
+ {
+ LYINFLOG("no normal dial");
+ }
+ }
+ else
+ {
+ LYERRLOG("ecall is running, recv psap call back msd start");
+ }
+ }
+ else if (LYNQ_ECALL_ABNORMAL_HANGUP == g_lynqIncomingEcallIndication)
+ {
+ if(is_ecall_dial==0)
+ {
+ LYERRLOG("ecall is not in dialing, recv abnormal hangup");
+ g_ecallId = INVALID_ID;
+ }
+ else
+ {
+ LYINFLOG("ecall is in dialing, recv abnormal hangup");
+ }
+ }
+ else if (LYNQ_ECALL_DISCONNECTED == g_lynqIncomingEcallIndication ||
+ LYNQ_ECALL_REDIAL_TIMER_OUT == g_lynqIncomingEcallIndication ||
+ LYNQ_ECALL_T2_TIMER_OUT == g_lynqIncomingEcallIndication)
+ {
+ g_ecallId = INVALID_ID;
+ if(is_ecall_dial)
+ {
+ LYERRLOG("ecall is in dialing, recv like disconnect indication");
+ is_ecall_dial=0;
+ sendSignalToWaitCallStateChange();
+ }
+ else
+ {
+ LYINFLOG("ecall is not in dialing, recv like disconnect indication");
+ }
+ }
+ else
+ {
+ LYINFLOG("not special indication");
+ }
sendSignalIncomingECallEvent();
+ LYINFLOG("**************:RIL_UNSOL_ECALL_INDICATIONS, local ecall id is %d", g_ecallId);
break;
}
#endif
@@ -689,7 +857,7 @@
socket_fd = socket(AF_INET,SOCK_DGRAM,0);
if(socket_fd < 0)
{
- LYERRLOG("creaet socket for udp fail\n");
+ LYERRLOG("creaet socket for udp fail");
return -1;
}
urc_local_addr.sin_family = AF_INET;
@@ -699,7 +867,7 @@
rt = setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
if(rt<0)
{
- LYERRLOG("SO_REUSEADDR fail\n");
+ LYERRLOG("SO_REUSEADDR fail");
return -1;
}
rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
@@ -713,10 +881,10 @@
rt = pthread_create(&lynq_call_urc_tid,&attr,thread_urc_recv,(void *)socket_fd);
if(rt < 0)
{
- LYERRLOG("urc loop failure!!!\n");
+ LYERRLOG("urc loop failure!!!");
return -1;
}
- LYDBGLOG("urc loop success!!!\n");
+ LYDBGLOG("urc loop success!!!");
return 0;
}
int getSelfElement(char addr[])
@@ -737,7 +905,7 @@
void lynq_call_state_change_test(int soc_id)
{
- LYDBGLOG("call state change,sim:%d\n",soc_id);
+ LYDBGLOG("call state change,sim:%d",soc_id);
}
int lynq_init_call(int uToken)
{
@@ -773,6 +941,7 @@
}
int lynq_deinit_call()
{
+ int ret;
if(g_lynq_call_init_flag == 0)
{
LYDBGLOG("lynq_deinit_call failed!!!");
@@ -781,7 +950,7 @@
else
{
g_lynq_call_init_flag = 0;
- int ret = -1;
+ lynq_call_hungup_all();
if(lynq_call_client_sockfd>0)
{
close(lynq_call_client_sockfd);
@@ -824,7 +993,7 @@
vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
va_end(args);
}
- LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
+ LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
if(send_request(lynq_call_client_sockfd,&client)==-1)
{
LYERRLOG("send request fail");
@@ -855,7 +1024,7 @@
client.request = request_id;
client.paramLen = 0;
bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
- LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
+ LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
if(send_request(lynq_call_client_sockfd,&client)==-1)
{
LYERRLOG("send request fail");
@@ -879,27 +1048,45 @@
int slot_id = -1;
int error = -1;
int lynq_call_id = -1;
+
+ LYINFLOG("lynq_call begin addr %s",addr);
if(addr==NULL)
{
LYERRLOG("Phone num is null!!!");
return -1;
}
+
+ if(find_call_id_with_addr(addr)!=INVALID_ID)
+ {
+ LYERRLOG("addr %s exists",addr);
+ return LYNQ_E_CONFLICT;
+ }
+
+#ifdef ECALL_SUPPORT
+ if(lynq_ecall_is_running())
+ {
+ LYERRLOG("lynq_fast_ecall ecall is running");
+ return LYNQ_E_ECALL_BEING_RUNNING;
+ }
+#endif
+
client.uToken = Global_uToken_call;
client.request = 10;//RIL_REQUEST_DIAL
client.paramLen = 2;
bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
memcpy(client.param,addr,strlen(addr)+1);
strcat(client.param," 0");
- LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
+ lynq_call_id = addAddr(addr);
+ LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
if(send_request(lynq_call_client_sockfd,&client)==-1)
{
LYERRLOG("send request fail");
+ cleanCallList(lynq_call_id);
return -1;
}
get_response(lynq_call_client_sockfd,p);
JumpHeader(p,&resp_type,&request,&slot_id,&error);
LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
- lynq_call_id = updateAddr(addr);
if(error==0)
{
isDial = 1;
@@ -907,14 +1094,28 @@
{
//if timeout,this call need destroy.
isDial = 0;
-
error = LYNQ_E_TIME_OUT;
- LYERRLOG("timeout:wait Call state fail!!!");
- lynq_call_lists[lynq_call_id].hasTimeout = 1;
+ LYERRLOG("lynq_call timeout:wait Call state fail!!! clear local idx %d",lynq_call_id);
+ cleanCallList(lynq_call_id);
return error;
}
- *handle = lynq_call_id;
+ isDial = 0;
+ *handle = lynq_call_lists[lynq_call_id].call_id;
+ if(*handle > 0)
+ {
+ LYINFLOG("lynq_call dial addr %s suc, id is %d",addr,*handle);
+ return 0;
+ }
+ else
+ {
+ LYERRLOG("lynq_call dial addr %s fail, invalid id",addr);
+ cleanCallList(lynq_call_id);
+ return LYNQ_E_INVALID_ID_ANONALY;
+ }
+
}
+ LYERRLOG("lynq_call dial addr %s fail, service error %d",addr, error);
+ cleanCallList(lynq_call_id);
return error;
}
int lynq_call_answer()
@@ -929,7 +1130,7 @@
client.request = 40;//RIL_REQUEST_DIAL
client.paramLen = 0;
bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
- LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
+ LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
if(send_request(lynq_call_client_sockfd,&client)==-1)
{
LYERRLOG("send request fail");
@@ -949,7 +1150,7 @@
int slot_id = -1;
int error = -1;
int call_id = 0;
- int lynq_call_id = 0;
+ int lynq_call_id;
if(handle==NULL||!((*handle>=0)&&(*handle<10)))
{
LYERRLOG("[%s] illegal input!!!!",__FUNCTION__);
@@ -959,10 +1160,9 @@
client.request = 12;//RIL_REQUEST_HUNGUP
client.paramLen = 1;
bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
- lynq_call_id = *handle;
- call_id = lynq_call_lists[lynq_call_id].call_id;
+ call_id = *handle;
sprintf(client.param,"%d",call_id);
- LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
+ LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
if(send_request(lynq_call_client_sockfd,&client)==-1)
{
LYERRLOG("send request fail");
@@ -973,7 +1173,11 @@
LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
if(error==0)
{
- cleanCallList(lynq_call_id);
+ lynq_call_id=find_call_id_with_call_id(call_id);
+ if(lynq_call_id!=INVALID_ID)
+ {
+ cleanCallList(lynq_call_id);
+ }
}
return error;
}
@@ -989,7 +1193,7 @@
client.request = 17;//RIL_REQUEST_UDUB
client.paramLen = 0;
bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
- LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
+ LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
if(send_request(lynq_call_client_sockfd,&client)==-1)
{
LYERRLOG("send request fail");
@@ -1017,11 +1221,17 @@
int lynq_get_current_call_state(int *handle, int *call_state,int *toa,int *direction,char addr[])
{
int lynq_call_id = 0;
+ LYINFLOG("lynq_get_current_call_state begin ");
if(handle==NULL)
{
+ LYERRLOG("handle is NULL");
return LYNQ_E_NULL_ANONALY;
}
- lynq_call_id = *handle;
+ lynq_call_id = find_call_id_with_call_id(*handle);
+ if(lynq_call_id==INVALID_ID)
+ {
+ return LYNQ_E_INVALID_ID_ANONALY;
+ }
*call_state = lynq_call_lists[lynq_call_id].call_state;
*toa = lynq_call_lists[lynq_call_id].toa;
*direction = lynq_call_lists[lynq_call_id].direction;
@@ -1124,7 +1334,7 @@
}
int lynq_incall_record_start(const char* file_path)
{
- return lynq_set_common_request(8011,2,"%s %s","1",file_path); //LYNQ_REQUEST_RECORD
+ return lynq_set_common_request(8011,2,"%s %s","1",file_path); //LYNQ_REQUEST_RECORD
}
int lynq_incall_record_stop()
{
@@ -1178,7 +1388,7 @@
if(test_num==NULL || test_num_length > LYNQ_PHONE_NUMBER_MAX )
{
- LYERRLOG("test_num is null or test_num_length %d s greater than %d\n ",test_num_length,LYNQ_PHONE_NUMBER_MAX);
+ LYERRLOG("test_num is null or test_num_length %d s greater than %d ",test_num_length,LYNQ_PHONE_NUMBER_MAX);
return -1;
}
@@ -1192,20 +1402,23 @@
return error;
}
-
int lynq_fast_ecall(int* handle, LYNQ_ECall_Category lynq_ecall_cat, LYNQ_ECall_Variant lynq_ecall_variant, const char *addr, int addr_length, const unsigned char *msd_data,int msd_length)
{
- int error = -1;
- int lynq_call_id = -1;
+ int error;
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);
char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};
unsigned int i;
-
- if(msd_length > MSD_MAX_LENGTH)
+ if(lynq_ecall_is_running())
{
- LYERRLOG("msd_length %d is greater than %d, parameter error\n",msd_length,MSD_MAX_LENGTH);
- return -1;
+ LYERRLOG("lynq_fast_ecall ecall is running");
+ return LYNQ_E_ECALL_BEING_RUNNING;
+ }
+
+ if(msd_length > MSD_MAX_LENGTH || msd_length <=0)
+ {
+ LYERRLOG("lynq_fast_ecall msd_length %d is greater than %d or <= 0, parameter error",msd_length,MSD_MAX_LENGTH);
+ return LYNQ_E_ECALL_MSD_LENGTH_ERROR;
}
for(i =0; i<msd_length;i++)
@@ -1213,33 +1426,35 @@
sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);
}
- lynq_call_id = updateAddr(e_call_addr[lynq_ecall_variant]);
- LYINFLOG("e_call_addr is %s\n",e_call_addr[lynq_ecall_variant]);
+ LYINFLOG("lynq_fast_ecall addr is %s",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", lynq_msd_data);
if(error==0)
- {
- isDial = 1;
- if(waitCallstateChange(30000)==ETIMEDOUT)//30000ms
+ {
+ is_ecall_dial = 1;
+ if(waitCallstateChange(180000)==ETIMEDOUT)//180000ms
{
- isDial = 0;
- error = LYNQ_E_TIME_OUT;
- cleanCallList(lynq_call_id);
- LYERRLOG("timeout:wait Call state fail!!!");
- return error;
+ LYERRLOG("lynq_fast_ecall timeout:wait Call state time out!!!");
+ is_ecall_dial = 0;
+ lynqRespWatingEvent();
+ return LYNQ_E_TIME_OUT;
}
-
- *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);
+ is_ecall_dial = 0;
+ lynqRespWatingEvent();
- }
- else {
- cleanCallList(lynq_call_id);
+ if(g_ecallId != INVALID_ID)
+ {
+ *handle=g_ecallId;
+ LYINFLOG("lynq_fast_ecall id is %d",g_ecallId);
+ return 0;
+ }
+ else
+ {
+ LYERRLOG("lynq_fast_ecall service return fail");
+ return LYNQ_E_INVALID_ID_ANONALY;
+ }
}
return error;
@@ -1263,7 +1478,7 @@
if(handle==NULL)
{
- LYERRLOG("handle is NULL, parameter error \n ");
+ LYERRLOG("handle is NULL, parameter error ");
return -1;
}
@@ -1273,13 +1488,12 @@
{
lynq_ecall_variant=lynq_get_lynq_ecall_variant_from_lynq_type(type);
- lynq_call_id = updateAddr(e_call_addr[lynq_ecall_variant]);
+ lynq_call_id = addAddr(e_call_addr[lynq_ecall_variant]);
isDial = 1;
if(waitCallstateChange(10000)==ETIMEDOUT)//10000ms
{
error = LYNQ_E_TIME_OUT;
LYERRLOG("timeout:wait Call state fail!!!");
- lynq_call_lists[lynq_call_id].hasTimeout = 1;
return error;
}
@@ -1295,23 +1509,31 @@
char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};
unsigned int i;
- if(handle==NULL || ((*handle) >= LYNQ_CALL_MAX) || msd_length > MSD_MAX_LENGTH)
+ if(handle==NULL || ((*handle) >= LYNQ_CALL_MAX) || msd_length > MSD_MAX_LENGTH || msd_length == 0 || msd_data ==NULL)
{
- LYERRLOG("handle is NULL or *handle %d is greater or equeal to %d or msd_length %d is greater than %d, parameter error\n",*handle,LYNQ_CALL_MAX,msd_length,MSD_MAX_LENGTH);
+ LYERRLOG("lynq_set_msd handle is NULL or *handle %d is greater or equeal to %d or msd_length %d is greater than %d or msd_data %s is NULL, parameter error",*handle,LYNQ_CALL_MAX,msd_length,MSD_MAX_LENGTH, msd_data);
return -1;
}
for(i=0; i<msd_length;i++)
{
sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);
- }
+ }
+
+ LYINFLOG("lynq_set_msd ");
return lynq_set_common_request(RIL_REQUEST_ECALL_SET_MSD,2,"%d %s",lynq_call_lists[(*handle)].call_id,lynq_msd_data);
}
int lynq_set_ivs(int enable)
{
- return lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);
+ if(enable<0)
+ {
+ lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);
+ return 0;
+ }
+
+ return lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);
}
int lynq_reset_ivs()
@@ -1329,15 +1551,15 @@
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);
+ 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);
+ *eCall_Indication = g_lynqIncomingEcallIndication;
+ LYINFLOG("lynq_wait_ecall_indication id: %d",g_lynqIncomingEcallIndication);
return 0;
}
@@ -1350,10 +1572,10 @@
n = lynq_init_call(lynq_call_state_change_test,2222);
if(n<0)
{
- LYDBGLOG("lynq init call fail!!!\n");
+ LYDBGLOG("lynq init call fail!!!");
return -1;
}
- LYDBGLOG("lynq call init success!!!\n");
+ LYDBGLOG("lynq call init success!!!");
char phoneNum[LYNQ_PHONE_NUMBER_MAX];
sprintf(phoneNum,"18180053406 0",strlen("18180053406 0")+1);
lynq_call(phoneNum);