blob: b90b44b41886daf97555060401732c5198248eff [file] [log] [blame]
ll630be412022-07-25 05:52:14 +00001
lh7b0674a2022-01-10 00:34:35 -08002#include <stdio.h>
3#include <sys/types.h>
4#include <sys/socket.h>
5#include <arpa/inet.h>
6#include <fcntl.h>
7#include <string.h>
8#include <stdlib.h>
9#include <unistd.h>
10#include <binder/Parcel.h>
11#include <log/log.h>
lh7b0674a2022-01-10 00:34:35 -080012#include <cutils/jstring.h>
13#include <pthread.h>
14#include "liblog/lynq_deflog.h"
lh2afc7732022-01-10 02:24:31 -080015#include <sys/time.h>
lh21502f52022-01-27 00:27:12 -080016#include <string.h>
q.huang714145d2022-04-18 00:09:50 -040017#include <vendor-ril/telephony/ril.h>
18#include <vendor-ril/telephony/mtk_ril_sp.h>
19#include <vendor-ril/telephony/mtk_ril_ivt.h>
20#include "lynq_call.h"
21
22
lh7b0674a2022-01-10 00:34:35 -080023#define LYNQ_SERVICE_PORT 8088
rjw5d2a50e2022-02-28 15:01:49 +080024#define DSET_IP_ADDRESS "127.0.0.1"
lh7b0674a2022-01-10 00:34:35 -080025#define LYNQ_URC_SERVICE_PORT 8086
26#define LYNQ_REC_BUF 8192
27#define LYNQ_REQUEST_PARAM_BUF 8192
28#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3
q.huang70b76492022-06-02 14:49:02 +080029#define INVALID_ID (-1)
q.huangcb7b7292022-06-28 20:12:01 +080030#define RTP_FROM_CMD "gst-launch-1.0 -v udpsrc port=%d caps=\'application/x-rtp, media=(string)audio, clock-rate=(int)%d, channels=(int)%d\' ! rtpjitterbuffer latency=%d ! rtppcmadepay ! alawdec ! audioresample ! audioconvert ! alsasink device=\'hw:0,2\'"
31#define RTP_TO_CMD "gst-launch-1.0 -v alsasrc device=\'hw:0,6\' ! audioconvert ! audioresample ! alawenc ! rtppcmapay ! udpsink host=%s auto-multicast=true port=%d"
32#define MAX_IP_LENGTH 128
lh7b0674a2022-01-10 00:34:35 -080033#define USER_LOG_TAG "LYNQ_CALL"
34
35using ::android::Parcel;
36 typedef enum {
37 LYNQ_CALL_ACTIVE = 0,
38 LYNQ_CALL_HOLDING = 1,
39 LYNQ_CALL_DIALING = 2, /* MO call only */
40 LYNQ_CALL_ALERTING = 3, /* MO call only */
41 LYNQ_CALL_INCOMING = 4, /* MT call only */
lhe45b7002022-04-26 00:45:44 -070042 LYNQ_CALL_WAITING = 5, /* MT call only */
43 /*warren add for T800 platform 2022/04/26 start*/
44 LYNQ_CALL_END = 6, /*CALL END*/
45 /*warren add for T800 platform 2022/04/26 end*/
lh7b0674a2022-01-10 00:34:35 -080046}lynq_call_state_t;
47
48typedef struct{
49 int uToken;
50 int request;
51 int paramLen;
52 char param[LYNQ_REQUEST_PARAM_BUF];
53}lynq_client_t;
54typedef struct
55{
56 int used;
57 int call_id;
58 int call_state;
59 int toa;
60 int direction;/*0: MO call,1:MT call*/
61 char addr[LYNQ_PHONE_NUMBER_MAX];
lh7b0674a2022-01-10 00:34:35 -080062}lynq_call_list_e_t;
63typedef struct
64{
65 int call_id;
66 int call_state;
67 int toa;
68 int direction;/*0: MO call,1:MT call*/
69 char addr[LYNQ_PHONE_NUMBER_MAX];
70}lynq_call_list_t;
71
72lynq_call_list_e_t lynq_call_lists[LYNQ_CALL_MAX]={};
73static pthread_mutex_t call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
74static pthread_cond_t call_state_change_cond = PTHREAD_COND_INITIALIZER;
llc0c711a2022-07-13 09:39:44 +000075static pthread_mutex_t *s_urc_call_state_change_mutex = NULL;
76static pthread_cond_t *s_urc_call_state_change_cond = NULL;
lh7b0674a2022-01-10 00:34:35 -080077static pthread_mutex_t s_incoming_call_mutex = PTHREAD_MUTEX_INITIALIZER;
78static pthread_cond_t s_incoming_call_cond = PTHREAD_COND_INITIALIZER;
ll630be412022-07-25 05:52:14 +000079static pthread_mutex_t g_lynq_call_sendto_mutex;
lla8c25a82022-03-17 05:31:33 +000080pthread_t lynq_call_urc_tid = -1;
81pthread_t lynq_call_list_loop_tid = -1;
lhec17b0a2022-02-13 23:56:05 -080082
rjw5d2a50e2022-02-28 15:01:49 +080083/*lei add*/
84/* socket文件描述符 */
85int len_addr_serv;
86struct sockaddr_in addr_serv;
87lynq_client_t client_t;
88int client_size = 0;
89/*lei add*/
lh7b0674a2022-01-10 00:34:35 -080090
llc0c711a2022-07-13 09:39:44 +000091int s_call_urc_event_complete = 0;
lh7b0674a2022-01-10 00:34:35 -080092
93enum{
94 CALL_OFF=0,
95 CALL_ON=1
96}call_state;
ll04ae4142022-01-27 05:54:38 +000097typedef enum{
98 LYNQ_E_CARDSTATE_ERROR=8000,
99 /* The voice service state is out of service*/
100 LYNQ_E_STATE_OUT_OF_SERVICE=8001,
101 /* The voice service state is EMERGENCY_ONLY*/
102 LYNQ_E_STATE_EMERGENCY_ONLY=8002,
103 /* The radio power is power off*/
104 LYNQ_E_STATE_POWER_OFF=8003,
105 LYNQ_E_TIME_OUT=8004,
106 /*create or open sms DB fail */
107 LYNQ_E_SMS_DB_FAIL=8005,
108 /*Failed to execute sql statement*/
109 LYNQ_E_SMS_SQL_FAIL = 8006,
110 LYNQ_E_SMS_NOT_FIND = 8007,
111 /* The logic conflict*/
112 LYNQ_E_CONFLICT=9000,
113 /*Null anomaly*/
q.huang70b76492022-06-02 14:49:02 +0800114 LYNQ_E_NULL_ANONALY=9001,
115 /*Invalid id anomaly*/
116 LYNQ_E_INVALID_ID_ANONALY=9002,
117#ifdef ECALL_SUPPORT
118 LYNQ_E_ECALL_BEING_RUNNING =9003,
119 LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,
q.huangce82b972022-06-21 14:57:02 +0800120 LYNQ_E_ECALL_DAILING_NO_ANSWER =9005,
q.huang70b76492022-06-02 14:49:02 +0800121#endif
lh7b0674a2022-01-10 00:34:35 -0800122}LYNQ_E;
q.huangec88da92022-03-29 04:17:32 -0400123typedef enum{
124 LYNQ_E_VOLUMN_SET_DTMF,
125 LYNQ_E_VOLUMN_SET_SPEECH
126}LYNQ_E_VOLUMN_SET;
lh7b0674a2022-01-10 00:34:35 -0800127
128int lynq_call_state =CALL_OFF;
lh42c1e572022-01-25 18:47:39 -0800129int lynq_call_client_sockfd = 0;
130int Global_uToken_call = 0;
lh7b0674a2022-01-10 00:34:35 -0800131int global_call_count =0;
132int global_call_auto_answer = 0;
lh42c1e572022-01-25 18:47:39 -0800133bool urc_call_recive_status = 1;
llc0c711a2022-07-13 09:39:44 +0000134bool call_list_loop = 0;
lh7b0674a2022-01-10 00:34:35 -0800135int isDial = 0;
136int lynqIncomingCallId = 0;
q.huang8b33ed52022-04-19 20:27:44 -0400137
q.huangcb7b7292022-06-28 20:12:01 +0800138/*rtp begin*/
139typedef struct
140{
141 char ip[MAX_IP_LENGTH];
142 int port;
143}lynq_rtp_server_info;
144
145typedef struct
146{
147 int port;
148 int clockrate;
149 int latency;
150 int channels;
151}lynq_rtp_client_info;
152
153static lynq_rtp_client_info g_rtp_client_info;
154static lynq_rtp_server_info g_rtp_server_info;
155
156static pthread_t g_rtp_thread[RTP_MODE_MAX];
157static bool g_rtp_thread_valid[RTP_MODE_MAX];
158
159/*rtp end*/
160
q.huang8b33ed52022-04-19 20:27:44 -0400161#ifdef ECALL_SUPPORT
q.huang70b76492022-06-02 14:49:02 +0800162int lynq_set_common_request(int request_id, int argc, const char* format,...);
q.huang70b76492022-06-02 14:49:02 +0800163int g_ecallId = INVALID_ID;
q.huang8b33ed52022-04-19 20:27:44 -0400164typedef enum{
165 LYNQ_ECALL_TYPE_TEST = 0, /* Test eCall */
166 LYNQ_ECALL_TYPE_RECONFIG = 1, /* Reconfiguration eCall */
q.huang714145d2022-04-18 00:09:50 -0400167 LYNQ_ECALL_MANUAL_EMERGENCY = 2, /*Manual Emergency eCall */
q.huangce82b972022-06-21 14:57:02 +0800168 LYNQ_ECALL_TYPE_AUTO_EMERGENCY = 3, /* Automatic Emergency eCall */
q.huang714145d2022-04-18 00:09:50 -0400169}LYNQ_ECall_Type;
170
q.huangce82b972022-06-21 14:57:02 +0800171typedef enum{
172 LYNQ_ECALL_DAILING_STATE_NONE =0,
173 LYNQ_ECALL_DAILING_STATE_STARTED = 1,
174 LYNQ_ECALL_DAILING_STATE_ANSWERED = 2,
175}LYNQ_ECall_Dailing_State;
176
177LYNQ_ECall_Dailing_State is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
q.huang70b76492022-06-02 14:49:02 +0800178char e_call_addr[LYNQ_ECALL_VAR_MAX][LYNQ_PHONE_NUMBER_MAX]={"test_ecall","emergency_ecall","reconf_ecall"};
q.huang8b33ed52022-04-19 20:27:44 -0400179
180static pthread_mutex_t s_incoming_e_call_mutex = PTHREAD_MUTEX_INITIALIZER;
181static pthread_cond_t s_incoming_e_call_cond = PTHREAD_COND_INITIALIZER;
182
q.huang70b76492022-06-02 14:49:02 +0800183LYNQ_ECall_Indication g_lynqIncomingEcallIndication;
q.huangce82b972022-06-21 14:57:02 +0800184int g_lynqIncomingEcallId;
q.huang8b33ed52022-04-19 20:27:44 -0400185
186void sendSignalIncomingECallEvent()
187{
q.huangcb7b7292022-06-28 20:12:01 +0800188 LYINFLOG("send incoming ecall event signal");
q.huang8b33ed52022-04-19 20:27:44 -0400189 pthread_mutex_lock(&s_incoming_e_call_mutex);
190 pthread_cond_signal(&s_incoming_e_call_cond);
191 pthread_mutex_unlock(&s_incoming_e_call_mutex);
192}
q.huang70b76492022-06-02 14:49:02 +0800193
194int lynq_is_msd_suc(LYNQ_ECall_Indication lynqIncomingEcallIndication)
195{
196 if(LYNQ_ECALL_LLACK_RECEIVED == lynqIncomingEcallIndication ||
197 LYNQ_ECALL_ALACK_POSITIVE_RECEIVED == lynqIncomingEcallIndication ||
198 LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED == lynqIncomingEcallIndication ||
199 LYNQ_ECALL_T5_TIMER_OUT == lynqIncomingEcallIndication ||
200 LYNQ_ECALL_T6_TIMER_OUT == lynqIncomingEcallIndication ||
201 LYNQ_ECALL_T7_TIMER_OUT == lynqIncomingEcallIndication)
202 {
203 return 1;
204 }
205
206 return 0;
207}
208
209int lynq_ecall_is_running()
210{
q.huangce82b972022-06-21 14:57:02 +0800211 return (is_ecall_dial!=LYNQ_ECALL_DAILING_STATE_NONE) || (g_ecallId !=INVALID_ID);
q.huang70b76492022-06-02 14:49:02 +0800212}
q.huang8b33ed52022-04-19 20:27:44 -0400213#endif
q.huang714145d2022-04-18 00:09:50 -0400214
lla8c25a82022-03-17 05:31:33 +0000215/**
216 * @brief mark call initialization state
217 * 0: deinit state
218 * 1: init state
219 */
220int g_lynq_call_init_flag = 0;
lh7b0674a2022-01-10 00:34:35 -0800221
222int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error)
223{
224 if(p.dataAvail() > 0)
225 {
226 p.readInt32(resp_type);
227 p.readInt32(request);
228 p.readInt32(slot_id);
229 p.readInt32(error);
230 return 0;
231 }
232 else
233 {
234 return -1;
235 }
236}
237int send_request(int sockfd,lynq_client_t *client_tmp)
238{
239 int ret=0;
rjw5d2a50e2022-02-28 15:01:49 +0800240 ret = sendto(sockfd, client_tmp, client_size, 0, (struct sockaddr *)&addr_serv, len_addr_serv);
lh7b0674a2022-01-10 00:34:35 -0800241 if(ret==-1)
242 {
q.huang70b76492022-06-02 14:49:02 +0800243 LYERRLOG("sendto error");
lh7b0674a2022-01-10 00:34:35 -0800244 return -1;
245 }
246 return 0;
247}
248
249int get_response(int sockfd,Parcel &p)
250{
251 int len = 0;
252 char recvline[LYNQ_REC_BUF];
253 bzero(recvline,LYNQ_REC_BUF);
254 /* receive data from server */
rjw5d2a50e2022-02-28 15:01:49 +0800255 len = recvfrom(sockfd,recvline,LYNQ_REC_BUF, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
lh7b0674a2022-01-10 00:34:35 -0800256 if(len == -1)
257 {
q.huang70b76492022-06-02 14:49:02 +0800258 LYERRLOG("recvfrom error");
lh7b0674a2022-01-10 00:34:35 -0800259 return -1;
260 }
lh7b0674a2022-01-10 00:34:35 -0800261 if (recvline != NULL) {
262 p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
263 p.setDataPosition(0);
264 }
265 return 0;
266}
267static char *strdupReadString(Parcel &p) {
ll04ae4142022-01-27 05:54:38 +0000268 size_t stringlen;
lh7b0674a2022-01-10 00:34:35 -0800269 const char16_t *s16;
270 s16 = p.readString16Inplace(&stringlen);
ll04ae4142022-01-27 05:54:38 +0000271 return strndup16to8(s16, stringlen);
lh7b0674a2022-01-10 00:34:35 -0800272}
273
274int lynq_get_current_call_list(lynq_call_list_t call_list[LYNQ_CALL_MAX])
275{
276 Parcel p;
277 lynq_client_t client;
278 int resp_type = -1;
279 int request = -1;
280 int slot_id = -1;
281 int error = -1;
282 int call_num = 0;
283 int temp = 0;
284 char *remote_phoneNum = NULL;
285 char *remote_name= NULL;
286 char *uusData = NULL;
lh42c1e572022-01-25 18:47:39 -0800287 client.uToken = Global_uToken_call;
lh7b0674a2022-01-10 00:34:35 -0800288 client.request = 9;//RIL_REQUEST_GET_CURRENT_CALLS
289 client.paramLen = 0;
290 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang70b76492022-06-02 14:49:02 +0800291 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
lh42c1e572022-01-25 18:47:39 -0800292 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh7b0674a2022-01-10 00:34:35 -0800293 {
294 LYERRLOG("send request fail");
lh7b0674a2022-01-10 00:34:35 -0800295 return -1;
296 }
lh42c1e572022-01-25 18:47:39 -0800297 get_response(lynq_call_client_sockfd,p);
lh7b0674a2022-01-10 00:34:35 -0800298 JumpHeader(p,&resp_type,&request,&slot_id,&error);
299 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
300 if(error == 0)
301 {
302 p.readInt32(&call_num);
303 global_call_count = call_num;
304 if(call_num<=0)
305 {
306 lynq_call_state = CALL_OFF;
lhec17b0a2022-02-13 23:56:05 -0800307 LYINFLOG("lynq_call_state:%d",lynq_call_state);
lh7b0674a2022-01-10 00:34:35 -0800308 return 0;
309 }
lhec17b0a2022-02-13 23:56:05 -0800310 lynq_call_state = CALL_ON;
q.huang70b76492022-06-02 14:49:02 +0800311 LYINFLOG("lynq_call_state:%d, call num is %d ",lynq_call_state,call_num);
lh7b0674a2022-01-10 00:34:35 -0800312 for(int i = 0;i < call_num;i++)
313 {
314 p.readInt32(&temp);
315 call_list[i].call_state = temp;
316 p.readInt32(&call_list[i].call_id);
317 p.readInt32(&call_list[i].toa);
318 p.readInt32(&temp);
319 p.readInt32(&temp);
320 call_list[i].direction = temp;
321 p.readInt32(&temp);
322 p.readInt32(&temp);
323 p.readInt32(&temp);
324 remote_phoneNum = strdupReadString(p);
325 memcpy(call_list[i].addr,remote_phoneNum,strlen(remote_phoneNum));
326 LYINFLOG("call_id=%d,call_state=%d,direction=%d,addr=%s,toa=%d",call_list[i].call_id,call_list[i].call_state,
327 call_list[i].direction,call_list[i].addr,call_list[i].toa);
328 p.readInt32(&temp);
329 remote_name = strdupReadString(p);
330 p.readInt32(&temp);
331 p.readInt32(&temp);
332 if(temp==0)
333 {
334 continue;
335 }
336 p.readInt32(&temp); /* UUS Information is present */
337 p.readInt32(&temp);
338 p.readInt32(&temp);
339 p.read(uusData,temp);
340 }
341 }
342 return 0;
343}
344
345void cleanCallList(int lynq_call_id)
346{
q.huang70b76492022-06-02 14:49:02 +0800347 LYINFLOG("cleanCall local idx is %d, id is %d",lynq_call_id,lynq_call_lists[lynq_call_id].call_id);
lh7b0674a2022-01-10 00:34:35 -0800348 lynq_call_lists[lynq_call_id].call_id = 0;
lhe45b7002022-04-26 00:45:44 -0700349 lynq_call_lists[lynq_call_id].call_state = (int)LYNQ_CALL_END;
lh7b0674a2022-01-10 00:34:35 -0800350 lynq_call_lists[lynq_call_id].toa = 0;
351 lynq_call_lists[lynq_call_id].direction = 0;
352 lynq_call_lists[lynq_call_id].used = 0;
lh7b0674a2022-01-10 00:34:35 -0800353 memset(lynq_call_lists[lynq_call_id].addr,0,sizeof(lynq_call_lists[lynq_call_id].addr));
354}
355int getUnusedElement()
356{
357 for(int i=0;i < LYNQ_CALL_MAX; i++)
358 {
359 if(lynq_call_lists[i].used!=1)
360 {
361 return i;
362 }
363 }
364 return -1;
365}
q.huang70b76492022-06-02 14:49:02 +0800366int addAddr(char addr[])
lh7b0674a2022-01-10 00:34:35 -0800367{
368 int ret = 0;
369 ret = getUnusedElement();
370 memcpy(lynq_call_lists[ret].addr,addr,strlen(addr)+1);
371 lynq_call_lists[ret].used = 1;
q.huang70b76492022-06-02 14:49:02 +0800372 LYINFLOG("add local idx is %d addr is %s",ret,addr);
lh7b0674a2022-01-10 00:34:35 -0800373 return ret;
374}
375void updateCallList(lynq_call_list_e_t *callList, int call_id,int call_state,int toa,int direction)
376{
q.huang70b76492022-06-02 14:49:02 +0800377 LYINFLOG("Update original local id is %d, new local id is %d",callList->call_id,call_id);
lh7b0674a2022-01-10 00:34:35 -0800378 callList->call_id = call_id;
379 callList->call_state = call_state;
380 callList->toa = toa;
q.huang70b76492022-06-02 14:49:02 +0800381 callList->direction = direction;
lh7b0674a2022-01-10 00:34:35 -0800382 return;
383}
384int waitCallstateChange(int mtime)
385{
lhd1e457c2022-04-19 06:01:25 -0700386 LYINFLOG("wait Call state Change");
lh7b0674a2022-01-10 00:34:35 -0800387 int ret = 0;
388 int sec = 0;
389 int usec = 0;
lh2afc7732022-01-10 02:24:31 -0800390 struct timeval now;
391 struct timespec timeout;
392 gettimeofday(&now,NULL);
lh7b0674a2022-01-10 00:34:35 -0800393 sec = mtime/1000;
394 usec = mtime%1000;
lh2afc7732022-01-10 02:24:31 -0800395 timeout.tv_sec = now.tv_sec+sec;
396 timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
lh7b0674a2022-01-10 00:34:35 -0800397 pthread_mutex_lock(&call_state_change_mutex);
lh2afc7732022-01-10 02:24:31 -0800398 ret = pthread_cond_timedwait(&call_state_change_cond,&call_state_change_mutex,&timeout);
lh7b0674a2022-01-10 00:34:35 -0800399 pthread_mutex_unlock(&call_state_change_mutex);
400 return ret;
401}
402int waitIncomingCall()
403{
lhd1e457c2022-04-19 06:01:25 -0700404 LYINFLOG("wait incming call");
lh7b0674a2022-01-10 00:34:35 -0800405 int ret = 0;
406 pthread_mutex_lock(&s_incoming_call_mutex);
407 ret = pthread_cond_wait(&s_incoming_call_cond,&s_incoming_call_mutex);
408 pthread_mutex_unlock(&s_incoming_call_mutex);
409 return ret;
410}
411int checkHasCall(char addr[])
412{
413 for(int i = 0;i<LYNQ_CALL_MAX;i++)
414 {
415 if(strcmp(lynq_call_lists[i].addr,addr)==0)
416 {
q.huang70b76492022-06-02 14:49:02 +0800417 LYINFLOG("checkHasCall addr is %s idx is %d id is %d",addr,i,lynq_call_lists[i].call_id);
lh7b0674a2022-01-10 00:34:35 -0800418 return 1;
419 }
420 }
q.huang70b76492022-06-02 14:49:02 +0800421 LYINFLOG("checkHasCall addr is %s , no idx is found",addr);
lh7b0674a2022-01-10 00:34:35 -0800422 return 0;
423}
lhd1e457c2022-04-19 06:01:25 -0700424int find_call_id_with_addr(char *addr)
425{
lhd1e457c2022-04-19 06:01:25 -0700426 for(int id = 0; id < LYNQ_CALL_MAX; id++)
427 {
q.huang70b76492022-06-02 14:49:02 +0800428 if(lynq_call_lists[id].used && (strcmp(lynq_call_lists[id].addr,addr) == 0))
lhd1e457c2022-04-19 06:01:25 -0700429 {
q.huang70b76492022-06-02 14:49:02 +0800430 LYINFLOG("find addr %s in local list, local idx is %d id is %d",addr,id,lynq_call_lists[id].call_id);
lhd1e457c2022-04-19 06:01:25 -0700431 return id;
432 }
433 }
q.huang70b76492022-06-02 14:49:02 +0800434 LYINFLOG("find addr %s in local list , not found",addr);
lhd1e457c2022-04-19 06:01:25 -0700435 return -1;
436}
q.huang70b76492022-06-02 14:49:02 +0800437int find_call_id_with_call_id(int call_id)
438{
439 for(int id = 0; id < LYNQ_CALL_MAX; id++)
440 {
441 if(lynq_call_lists[id].used && (lynq_call_lists[id].call_id == call_id))
442 {
443 LYINFLOG("find id %d in local list, local idx is %d, addr is %s",call_id,id,lynq_call_lists[id].addr);
444 return id;
445 }
446 }
447 LYINFLOG("find id %d in local list , not found",call_id);
448 return INVALID_ID;
449}
lh7b0674a2022-01-10 00:34:35 -0800450void sendSignalToWaitCallStateChange()
451{
lhd1e457c2022-04-19 06:01:25 -0700452 LYINFLOG("send Signal To Wait Call State Change");
lh7b0674a2022-01-10 00:34:35 -0800453 pthread_mutex_lock(&call_state_change_mutex);
454 pthread_cond_signal(&call_state_change_cond);
455 pthread_mutex_unlock(&call_state_change_mutex);
456}
457void sendSignalIncomingCall()
458{
lhd1e457c2022-04-19 06:01:25 -0700459 LYINFLOG("send incoming call signal");
lh7b0674a2022-01-10 00:34:35 -0800460 pthread_mutex_lock(&s_incoming_call_mutex);
461 pthread_cond_signal(&s_incoming_call_cond);
462 pthread_mutex_unlock(&s_incoming_call_mutex);
463}
464
465void addCallListToLynqCallList(lynq_call_list_e_t *callList, int call_id,int call_state,int toa,int direction,char addr[LYNQ_PHONE_NUMBER_MAX])
466{
467 callList->call_id = call_id;
468 callList->call_state = call_state;
469 callList->toa = toa;
470 callList->direction = direction;
471 memcpy(callList->addr,addr,strlen(addr)+1);
472 callList->used = 1;
lh7b0674a2022-01-10 00:34:35 -0800473 return;
474}
475
476void *triggerGetCallList(void *parg)
ll04ae4142022-01-27 05:54:38 +0000477{
478 int ret=0;
lhd1e457c2022-04-19 06:01:25 -0700479 bool call_end;
ll04ae4142022-01-27 05:54:38 +0000480 lynq_call_list_t call_list[LYNQ_CALL_MAX];
q.huang8b33ed52022-04-19 20:27:44 -0400481 int update=0;
q.huang70b76492022-06-02 14:49:02 +0800482 int cnt;
483 int i,n;
484
lh7b0674a2022-01-10 00:34:35 -0800485 while(call_list_loop)
ll04ae4142022-01-27 05:54:38 +0000486 {
q.huang8b33ed52022-04-19 20:27:44 -0400487 update=0;
llc0c711a2022-07-13 09:39:44 +0000488 pthread_mutex_lock(s_urc_call_state_change_mutex);
489 pthread_cond_wait(s_urc_call_state_change_cond, s_urc_call_state_change_mutex);
q.huang70b76492022-06-02 14:49:02 +0800490 LYDBGLOG("triggerGetCallList event!!!");
ll04ae4142022-01-27 05:54:38 +0000491 memset(call_list,0,sizeof(call_list));
492 ret = lynq_get_current_call_list(call_list);
493 if(ret != 0)
494 {
q.huang70b76492022-06-02 14:49:02 +0800495 LYDBGLOG("get current call list failure!!!");
llbc035332022-04-11 05:49:51 +0000496 continue;
ll04ae4142022-01-27 05:54:38 +0000497 }
lhd1e457c2022-04-19 06:01:25 -0700498 LYINFLOG("++++++++++++++triggerGetCallList++++++++++++++");
q.huang70b76492022-06-02 14:49:02 +0800499 LYINFLOG("clear local index begin");
500 cnt=0;
501 for(i = 0;i < LYNQ_CALL_MAX;i++)
lh7b0674a2022-01-10 00:34:35 -0800502 {
q.huang70b76492022-06-02 14:49:02 +0800503 if(lynq_call_lists[i].used ==0)
504 {
505 continue;
506 }
507 cnt++;
508 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);
509
510 if(lynq_call_lists[i].call_id > 0)
lhd1e457c2022-04-19 06:01:25 -0700511 {
512 call_end = 0;
q.huang70b76492022-06-02 14:49:02 +0800513 for(n = 0; n < LYNQ_CALL_MAX; n++)
lhd1e457c2022-04-19 06:01:25 -0700514 {
q.huang70b76492022-06-02 14:49:02 +0800515 if(call_list[n].call_id == lynq_call_lists[i].call_id)
lhd1e457c2022-04-19 06:01:25 -0700516 {
517 call_end = 1;
q.huang70b76492022-06-02 14:49:02 +0800518 LYINFLOG("find lynq call local idx %d, service idx %d id is %d!!!",i,n,lynq_call_lists[i].call_id);
519 break;
lhd1e457c2022-04-19 06:01:25 -0700520 }
521 }
522 if(call_end == 0)
523 {
q.huang70b76492022-06-02 14:49:02 +0800524 LYINFLOG("MT hungup,then clean call info local idx is %d id is %d",i, lynq_call_lists[i].call_id);
525 cleanCallList(i);
lhd1e457c2022-04-19 06:01:25 -0700526 }
527 } //fix bug API-54
q.huang70b76492022-06-02 14:49:02 +0800528 else
529 {
530 LYINFLOG("local id is 0");
531 }
532 }
533 LYINFLOG("clear local index end, local used cnt is %d", cnt);
534
535 LYINFLOG("add or update local index begin ");
536 for (i = 0;i < LYNQ_CALL_MAX;i++)
537 {
538 if(call_list[i].call_id==0)
539 {
540 break;
541 }
542
543 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,
544 call_list[i].direction,call_list[i].addr,call_list[i].toa);
545
lh7b0674a2022-01-10 00:34:35 -0800546 if(call_list[i].direction == 1)//MT call
547 {
q.huang70b76492022-06-02 14:49:02 +0800548 LYINFLOG("This is a MT CALL");
lh0fd3b012022-05-13 03:02:19 -0700549 /*MT CALL state code
550 **LYNQ_CALL_INCOMING = 4,
551 **LYNQ_CALL_WAITING = 5,
552 */
553 if((call_list[i].call_state ==4) || (call_list[i].call_state ==5))
lh7b0674a2022-01-10 00:34:35 -0800554 {
q.huang70b76492022-06-02 14:49:02 +0800555#ifdef ECALL_SUPPORT
556 if(lynq_ecall_is_running())
lh7b0674a2022-01-10 00:34:35 -0800557 {
q.huang70b76492022-06-02 14:49:02 +0800558 lynq_call_hungup(&(call_list[i].call_id));
559 continue;
lh7b0674a2022-01-10 00:34:35 -0800560 }
q.huang70b76492022-06-02 14:49:02 +0800561#endif
562 }
563 /*you call me, and i call you,One party failed to dial*/
564 n = find_call_id_with_addr(call_list[i].addr);
565 if(n ==INVALID_ID)
566 {
567 n = addAddr(call_list[i].addr);
568 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
569 lynqIncomingCallId = call_list[i].call_id;
570 sendSignalIncomingCall();
571 }
572 else if(lynq_call_lists[n].call_state == call_list[i].call_state)
573 {
574 LYINFLOG("state not changed, state is %d ",call_list[i].call_state);
575 if(call_list[i].call_state ==4 || call_list[i].call_state ==5)
lhd1e457c2022-04-19 06:01:25 -0700576 {
lhd1e457c2022-04-19 06:01:25 -0700577 /*if call state not change,Maybe this call was ignored, so we need to continue to inform the user of
578 **an incoming call until the status changes.
579 **fix bug API-54
580 */
q.huang70b76492022-06-02 14:49:02 +0800581 LYINFLOG("resend incoming call signal");
582 sendSignalIncomingCall();
lhd1e457c2022-04-19 06:01:25 -0700583 }
lh7b0674a2022-01-10 00:34:35 -0800584 }
q.huang70b76492022-06-02 14:49:02 +0800585 else
ll72bf6c12022-03-24 10:22:25 +0800586 {
q.huang70b76492022-06-02 14:49:02 +0800587 LYINFLOG("state changed from %d to %d",lynq_call_lists[n].call_state,call_list[i].call_state);
588
589 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
590 }
lh7b0674a2022-01-10 00:34:35 -0800591 }
592 else
q.huang70b76492022-06-02 14:49:02 +0800593 {
594 LYINFLOG("This is a MO CALL");
595 call_end = 0;
596 for(n = 0 ; n < LYNQ_CALL_MAX; n++)
lh7b0674a2022-01-10 00:34:35 -0800597 {
q.huang70b76492022-06-02 14:49:02 +0800598 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)))
lh7b0674a2022-01-10 00:34:35 -0800599 {
q.huang70b76492022-06-02 14:49:02 +0800600 if(lynq_call_lists[n].call_id==0)
601 {
602 LYINFLOG("add a call id");
603 update=1;
604 }
605 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);
606 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
607 call_end = 1;
608 break;
609 }
610 }
611
612 if(call_end == 0)
613 {
614 LYINFLOG("need to hangup id %d", call_list[i].call_id);
615#ifdef ECALL_SUPPORT
q.huangce82b972022-06-21 14:57:02 +0800616 if(is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)
q.huang70b76492022-06-02 14:49:02 +0800617 {
618 LYINFLOG("ecall is dialing, for the timebeing, don't huangup");
lh7b0674a2022-01-10 00:34:35 -0800619 continue;
620 }
q.huang70b76492022-06-02 14:49:02 +0800621#endif
622 LYINFLOG("hang up service call id %d",call_list[i].call_id);
623 lynq_call_hungup(&(call_list[i].call_id));
lh7b0674a2022-01-10 00:34:35 -0800624 }
lh7b0674a2022-01-10 00:34:35 -0800625 }
q.huang70b76492022-06-02 14:49:02 +0800626 LYDBGLOG("servie idx %d end",i);
ll04ae4142022-01-27 05:54:38 +0000627 }
q.huang70b76492022-06-02 14:49:02 +0800628 LYINFLOG("add or update local index end ");
lh42c1e572022-01-25 18:47:39 -0800629 s_call_urc_event_complete = 1;
q.huang70b76492022-06-02 14:49:02 +0800630 if(isDial==1)
lh7b0674a2022-01-10 00:34:35 -0800631 {
q.huang70b76492022-06-02 14:49:02 +0800632 LYINFLOG("now is dialing");
633 if(update==1)
634 {
635 LYINFLOG("find added call");
636 sendSignalToWaitCallStateChange();
637 isDial = 0;
638 }
639 else
640 {
641 LYINFLOG("not find added call");
642 }
643 }
644 else
645 {
646 LYINFLOG("now is not dialing");
lh7b0674a2022-01-10 00:34:35 -0800647 }
llc0c711a2022-07-13 09:39:44 +0000648 pthread_mutex_unlock(s_urc_call_state_change_mutex);
ll04ae4142022-01-27 05:54:38 +0000649 }
650 return NULL;
lh7b0674a2022-01-10 00:34:35 -0800651}
652
653void lynqRespWatingEvent()
ll04ae4142022-01-27 05:54:38 +0000654{
655 if(s_call_urc_event_complete==1)
656 {
llc0c711a2022-07-13 09:39:44 +0000657 pthread_mutex_lock(s_urc_call_state_change_mutex);
658 pthread_cond_signal(s_urc_call_state_change_cond);
ll04ae4142022-01-27 05:54:38 +0000659 s_call_urc_event_complete = 0;
llc0c711a2022-07-13 09:39:44 +0000660 pthread_mutex_unlock(s_urc_call_state_change_mutex);
lh7b0674a2022-01-10 00:34:35 -0800661 }
ll04ae4142022-01-27 05:54:38 +0000662 return;
lh7b0674a2022-01-10 00:34:35 -0800663}
664
665/*Warren add for T800 platform 2021/11/19 start*/
666int lynq_socket_client_start()
rjw5d2a50e2022-02-28 15:01:49 +0800667{
668 #if 0
lh7b0674a2022-01-10 00:34:35 -0800669 struct sockaddr_in lynq_socket_server_addr;
670 /* init lynq_socket_server_addr */
671 bzero(&lynq_socket_server_addr, sizeof(lynq_socket_server_addr));
672 lynq_socket_server_addr.sin_family = AF_INET;
673 lynq_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
674 lynq_socket_server_addr.sin_addr.s_addr = htons(INADDR_ANY);
rjw5d2a50e2022-02-28 15:01:49 +0800675
lh7b0674a2022-01-10 00:34:35 -0800676 /*
677 if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)
678 {
q.huang70b76492022-06-02 14:49:02 +0800679 LYDBGLOG("[%s] is not a valid IPaddress", argv[1]);
lh7b0674a2022-01-10 00:34:35 -0800680 exit(1);
681 }
682*/
lh42c1e572022-01-25 18:47:39 -0800683 lynq_call_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
684 if(connect(lynq_call_client_sockfd, (struct sockaddr *)&lynq_socket_server_addr, sizeof(lynq_socket_server_addr)) == -1)
lh7b0674a2022-01-10 00:34:35 -0800685 {
q.huang70b76492022-06-02 14:49:02 +0800686 LYERRLOG("connect error");
lh7b0674a2022-01-10 00:34:35 -0800687 return -1;
688 }
rjw5d2a50e2022-02-28 15:01:49 +0800689 #endif
690 lynq_call_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
691 if (-1 == lynq_call_client_sockfd)
692 {
693 return lynq_call_client_sockfd;
694 }
ll630be412022-07-25 05:52:14 +0000695 struct timeval timeOut;
696 timeOut.tv_sec = 60;
697 timeOut.tv_usec = 0;
698 if (setsockopt(lynq_call_client_sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
699 {
700 RLOGD("time out setting failed\n");
701 return -1;
702 }
rjw5d2a50e2022-02-28 15:01:49 +0800703 /* 设置address */
704 memset(&addr_serv, 0, sizeof(addr_serv));
705 addr_serv.sin_family = AF_INET;
706 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
707 addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);
708 len_addr_serv = sizeof(addr_serv);
lh7b0674a2022-01-10 00:34:35 -0800709 return 0;
710}
711int lynq_update_call_list_loop()
712{
713 int ret = 0;
lh7b0674a2022-01-10 00:34:35 -0800714 pthread_attr_t attr;
715 pthread_attr_init(&attr);
716 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
lhec17b0a2022-02-13 23:56:05 -0800717 ret = pthread_create(&lynq_call_list_loop_tid,&attr,triggerGetCallList,NULL);
lh7b0674a2022-01-10 00:34:35 -0800718 if(ret < 0)
719 {
720 LYERRLOG("lynq_update_call_list_loop fail!!!");
721 return -1;
722 }
q.huang70b76492022-06-02 14:49:02 +0800723 LYDBGLOG("lynq_update_call_list_loop success!!!");
lh7b0674a2022-01-10 00:34:35 -0800724 return 0;
725
726}
q.huang70b76492022-06-02 14:49:02 +0800727
lh7b0674a2022-01-10 00:34:35 -0800728void *thread_urc_recv(void *parg)
ll04ae4142022-01-27 05:54:38 +0000729{
lh7b0674a2022-01-10 00:34:35 -0800730 int socket_fd = (int64_t)parg;
731 int len=0;
732 socklen_t addr_len=0;
733 uint8_t *dataLength = NULL;
734 char urc_data[LYNQ_REC_BUF];
735 int slot_id = -1;
736 int resp_type = -1;
737 int urcid = -1;
738 Parcel *p = NULL;
739 struct sockaddr_in dest_addr;
q.huang8b33ed52022-04-19 20:27:44 -0400740#ifdef ECALL_SUPPORT
q.huang70b76492022-06-02 14:49:02 +0800741 int ecall_ind;
742 int ecallId;
743 int unused_callid;
q.huang8b33ed52022-04-19 20:27:44 -0400744#endif
745
q.huang70b76492022-06-02 14:49:02 +0800746 LYINFLOG("thread_urc_recv in running....");
lh42c1e572022-01-25 18:47:39 -0800747 while(urc_call_recive_status)
lh7b0674a2022-01-10 00:34:35 -0800748 {
749 bzero(urc_data,LYNQ_REC_BUF);
750 //get data msg
751 len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);
752 if(len <= 0)
ll04ae4142022-01-27 05:54:38 +0000753 {
q.huang70b76492022-06-02 14:49:02 +0800754 LYERRLOG("thread_urc_recv step2 fail");
ll04ae4142022-01-27 05:54:38 +0000755 break;
lh7b0674a2022-01-10 00:34:35 -0800756 }
q.huang70b76492022-06-02 14:49:02 +0800757 LYDBGLOG("=====>urc data len<=====:%d",len);
lh7b0674a2022-01-10 00:34:35 -0800758 p = new Parcel();
759 if(p==NULL)
760 {
lh21502f52022-01-27 00:27:12 -0800761 LYERRLOG("new parcel failure!!!");
lh7b0674a2022-01-10 00:34:35 -0800762 break;
763 }
764 p->setData((uint8_t *)urc_data,len); // p.setData((uint8_t *) buffer, buflen);
765 p->setDataPosition(0);
766 if(p->dataAvail() > 0)
767 {
768 p->readInt32(&resp_type);
769 p->readInt32(&urcid);
770 p->readInt32(&slot_id);
q.huang70b76492022-06-02 14:49:02 +0800771 //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lh7b0674a2022-01-10 00:34:35 -0800772 switch (urcid)
773 {
774 case 1001://RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED
775 {
q.huang70b76492022-06-02 14:49:02 +0800776 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lh7b0674a2022-01-10 00:34:35 -0800777 lynqRespWatingEvent();
778 break;
779 }
780 case 1018://RIL_UNSOL_CALL_RING
781 {
782 if(global_call_auto_answer==1)
783 {
784 lynq_call_answer();
785 }
786 break;
787 }
788 case 1029://RIL_UNSOL_RINGBACK_TONE
789 case 3049://RIL_UNSOL_CALL_INFO_INDICATION
790 {
q.huang70b76492022-06-02 14:49:02 +0800791 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lh7b0674a2022-01-10 00:34:35 -0800792 break;
793 }
q.huang8b33ed52022-04-19 20:27:44 -0400794#ifdef ECALL_SUPPORT
795 case RIL_UNSOL_ECALL_INDICATIONS:
796 {
q.huang70b76492022-06-02 14:49:02 +0800797 p->readInt32(&ecall_ind);
798 g_lynqIncomingEcallIndication = ecall_ind;
799 p->readInt32(&ecallId);
q.huangce82b972022-06-21 14:57:02 +0800800 g_lynqIncomingEcallId = ecallId;
q.huang70b76492022-06-02 14:49:02 +0800801 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);
q.huangce82b972022-06-21 14:57:02 +0800802 switch (g_lynqIncomingEcallIndication)
q.huang70b76492022-06-02 14:49:02 +0800803 {
q.huangce82b972022-06-21 14:57:02 +0800804 case LYNQ_ECALL_ACTIVE:
805 if(is_ecall_dial)
q.huang70b76492022-06-02 14:49:02 +0800806 {
q.huangce82b972022-06-21 14:57:02 +0800807 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_ANSWERED;
q.huang70b76492022-06-02 14:49:02 +0800808 }
q.huangce82b972022-06-21 14:57:02 +0800809 break;
810 case LYNQ_ECALL_LLACK_RECEIVED:
811 case LYNQ_ECALL_ALACK_POSITIVE_RECEIVED:
812 case LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED:
813 case LYNQ_ECALL_T5_TIMER_OUT:
814 case LYNQ_ECALL_T6_TIMER_OUT:
815 case LYNQ_ECALL_T7_TIMER_OUT:
816 if(is_ecall_dial)
817 {
818 LYINFLOG("ecall is dialing, recv suc indication");
819 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
820 if(ecallId >0 && find_call_id_with_call_id(ecallId)==INVALID_ID)
821 {
822 LYINFLOG("add ecall in loacl list");
823 g_ecallId = ecallId;
824 unused_callid=addAddr("ecall");
825 lynq_call_lists[unused_callid].call_id=g_ecallId;
826 }
827 sendSignalToWaitCallStateChange();
828 }
829 else if(ecallId >0 && (find_call_id_with_call_id(ecallId)==INVALID_ID))
830 {
831 LYERRLOG("ecall is not in dialing and first recv suc indication, hangup");
832 lynq_call_hungup(&ecallId);
833 }
834 else
835 {
836 LYERRLOG("ecall is not in dialing and not first recv suc indication");
837 }
838 break;
839 case LYNQ_ECALL_PSAP_CALLBACK_START:
840 if(lynq_ecall_is_running()==0)
841 {
842 LYINFLOG("ecall is not running, recv psap call back msd start, set ecall in dialing");
843 if(find_call_id_with_call_id(ecallId)!=INVALID_ID)
844 {
845 g_ecallId = ecallId;
846 if(isDial)
847 {
848 LYINFLOG("stop normal dial");
849 sendSignalToWaitCallStateChange();
850 }
851 else
852 {
853 LYINFLOG("no normal dial");
854 }
855 }
856 else
857 {
858 LYERRLOG("can't find ecall id in local list");
859 }
860 }
861 else
862 {
863 LYERRLOG("ecall is running, recv psap call back msd start");
864 }
865 break;
866 case LYNQ_ECALL_ABNORMAL_HANGUP:
867 if(is_ecall_dial == LYNQ_ECALL_DAILING_STATE_NONE)
868 {
869 LYERRLOG("ecall is not in dialing , recv abnormal hangup");
870 g_ecallId = INVALID_ID;
871 }
872 else if (is_ecall_dial == LYNQ_ECALL_DAILING_STATE_STARTED)
873 {
874 LYERRLOG("ecall is in dialing state, recv no answer, recv abnormal hangup, dont' redial");
875 g_ecallId = INVALID_ID;
876 sendSignalToWaitCallStateChange();
877 }
878 else {
879 LYINFLOG("ecall is in dialing and recv answer, recv abnormal hangup");
880 }
881 break;
882 case LYNQ_ECALL_DISCONNECTED:
883 case LYNQ_ECALL_REDIAL_TIMER_OUT:
884 case LYNQ_ECALL_T2_TIMER_OUT :
885 case LYNQ_ECALL_IMS_DISCONNECTED:
886 g_ecallId = INVALID_ID;
887 if(is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)
888 {
889 LYERRLOG("ecall is in dialing, recv like disconnect indication");
890 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
891 sendSignalToWaitCallStateChange();
892 }
893 else
894 {
895 LYINFLOG("ecall is not in dialing, recv like disconnect indication");
896 }
897 break;
898 default:
899 LYINFLOG("not special indication");
q.huang70b76492022-06-02 14:49:02 +0800900 }
q.huang8b33ed52022-04-19 20:27:44 -0400901 sendSignalIncomingECallEvent();
q.huang70b76492022-06-02 14:49:02 +0800902 LYINFLOG("**************:RIL_UNSOL_ECALL_INDICATIONS, local ecall id is %d", g_ecallId);
q.huang8b33ed52022-04-19 20:27:44 -0400903 break;
904 }
905#endif
lh7b0674a2022-01-10 00:34:35 -0800906 default:
907 break;
908 }
909 }
910 delete p;
911 p = NULL;
912 }
913 close(socket_fd);
914}
915int lynq_socket_urc_start()
916{
917 int socket_fd=0;
918 int rt=0;
919 int len=0;
920 int on=1;
921 struct sockaddr_in urc_local_addr;
lh7b0674a2022-01-10 00:34:35 -0800922 pthread_attr_t attr;
ll04ae4142022-01-27 05:54:38 +0000923 socket_fd = socket(AF_INET,SOCK_DGRAM,0);
ll04ae4142022-01-27 05:54:38 +0000924 if(socket_fd < 0)
925 {
q.huang70b76492022-06-02 14:49:02 +0800926 LYERRLOG("creaet socket for udp fail");
ll04ae4142022-01-27 05:54:38 +0000927 return -1;
lh7b0674a2022-01-10 00:34:35 -0800928 }
929 urc_local_addr.sin_family = AF_INET;
930 urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
931 urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
932 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
ll04ae4142022-01-27 05:54:38 +0000933 rt = setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
934 if(rt<0)
935 {
q.huang70b76492022-06-02 14:49:02 +0800936 LYERRLOG("SO_REUSEADDR fail");
lh7b0674a2022-01-10 00:34:35 -0800937 return -1;
938 }
939 rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
ll04ae4142022-01-27 05:54:38 +0000940 if (rt == -1)
941 {
lh21502f52022-01-27 00:27:12 -0800942 LYERRLOG("bind failed");
ll04ae4142022-01-27 05:54:38 +0000943 return -1;
lh7b0674a2022-01-10 00:34:35 -0800944 }
945 pthread_attr_init(&attr);
946 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
lhec17b0a2022-02-13 23:56:05 -0800947 rt = pthread_create(&lynq_call_urc_tid,&attr,thread_urc_recv,(void *)socket_fd);
lh7b0674a2022-01-10 00:34:35 -0800948 if(rt < 0)
949 {
q.huang70b76492022-06-02 14:49:02 +0800950 LYERRLOG("urc loop failure!!!");
lh7b0674a2022-01-10 00:34:35 -0800951 return -1;
952 }
q.huang70b76492022-06-02 14:49:02 +0800953 LYDBGLOG("urc loop success!!!");
lh7b0674a2022-01-10 00:34:35 -0800954 return 0;
955}
956int getSelfElement(char addr[])
957{
958 for(int i=0;i < LYNQ_CALL_MAX; i++)
959 {
960 if(lynq_call_lists[i].used==1)
961 {
962 if(strcmp(lynq_call_lists[i].addr,addr)==0)
963 {
964 return i;
965 }
966
967 }
968 }
969 return -1;
970}
971
972void lynq_call_state_change_test(int soc_id)
973{
q.huang70b76492022-06-02 14:49:02 +0800974 LYDBGLOG("call state change,sim:%d",soc_id);
lh7b0674a2022-01-10 00:34:35 -0800975}
q.huangcb7b7292022-06-28 20:12:01 +0800976
977void lynq_init_rtp()
978{
979 memset(&g_rtp_client_info,0,sizeof(g_rtp_client_info));
980 memset(&g_rtp_server_info,0,sizeof(g_rtp_server_info));
981
982
983 lynq_set_rtp_param(8000,1,400);
984
985 for(int i=0;i<RTP_MODE_MAX;i++)
986 {
q.huang0ae26e42022-06-30 09:55:45 +0800987 lynq_set_rtp_port(i,6666);
q.huangcb7b7292022-06-28 20:12:01 +0800988 g_rtp_thread_valid[i] = 0;
989 }
990
991 LYDBGLOG("lynq init rtp success!!!");
992 return;
993}
994
lh7b0674a2022-01-10 00:34:35 -0800995int lynq_init_call(int uToken)
lla8c25a82022-03-17 05:31:33 +0000996{
997 if(g_lynq_call_init_flag == 1){
998 LYDBGLOG("lynq init call failed!!!");
999 return -1;
1000 }
1001 g_lynq_call_init_flag = 1;
llc0c711a2022-07-13 09:39:44 +00001002 s_call_urc_event_complete = 1;
1003 call_list_loop = 1;
1004 LYINFLOG("liulei call_list_loop %d\n", call_list_loop);
1005 s_urc_call_state_change_mutex = new pthread_mutex_t;
1006 pthread_mutex_init(s_urc_call_state_change_mutex, NULL);
1007 s_urc_call_state_change_cond = new pthread_cond_t;
1008 LYINFLOG("liulei s_urc_call_state_change_mutex\n");
1009 pthread_cond_init(s_urc_call_state_change_cond, NULL);
1010 LYINFLOG("liulei s_urc_call_state_change_cond\n");
lh7b0674a2022-01-10 00:34:35 -08001011 int result = 0;
lh42c1e572022-01-25 18:47:39 -08001012 Global_uToken_call = uToken;
lh21502f52022-01-27 00:27:12 -08001013 urc_call_recive_status = 1;
rjw5d2a50e2022-02-28 15:01:49 +08001014 client_size = sizeof(client_t);
lh7b0674a2022-01-10 00:34:35 -08001015 LYLOGSET(LOG_INFO);
1016 LYLOGEINIT(USER_LOG_TAG);
1017 result = lynq_socket_client_start();
1018 if(result!=0)
1019 {
1020 return -1;
1021 }
1022 result = lynq_socket_urc_start();
1023 if(result!=0)
1024 {
1025 return -1;
1026 }
1027 result = lynq_update_call_list_loop();
1028 if(result!=0)
1029 {
1030 return -1;
1031 }
1032 memset(lynq_call_lists,0,sizeof(lynq_call_lists));
q.huangcb7b7292022-06-28 20:12:01 +08001033
1034 lynq_init_rtp();
1035
lh7b0674a2022-01-10 00:34:35 -08001036 LYDBGLOG("lynq init call success!!!");
1037 return 0;
1038}
1039int lynq_deinit_call()
1040{
q.huang70b76492022-06-02 14:49:02 +08001041 int ret;
lla8c25a82022-03-17 05:31:33 +00001042 if(g_lynq_call_init_flag == 0)
lhec17b0a2022-02-13 23:56:05 -08001043 {
lla8c25a82022-03-17 05:31:33 +00001044 LYDBGLOG("lynq_deinit_call failed!!!");
1045 return -1;
lhec17b0a2022-02-13 23:56:05 -08001046 }
lla8c25a82022-03-17 05:31:33 +00001047 else
llc0c711a2022-07-13 09:39:44 +00001048 {
lla8c25a82022-03-17 05:31:33 +00001049 g_lynq_call_init_flag = 0;
q.huang70b76492022-06-02 14:49:02 +08001050 lynq_call_hungup_all();
lla8c25a82022-03-17 05:31:33 +00001051 if(lynq_call_client_sockfd>0)
1052 {
1053 close(lynq_call_client_sockfd);
1054 }
1055 urc_call_recive_status = 0;
1056 call_list_loop = 0;
q.huangcb7b7292022-06-28 20:12:01 +08001057 lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);
lla8c25a82022-03-17 05:31:33 +00001058 if(lynq_call_urc_tid == -1 || lynq_call_list_loop_tid == -1)
1059 {
1060 return -1;
1061 }
1062 ret = pthread_cancel(lynq_call_urc_tid);
1063 LYDBGLOG("pthread cancel ret = %d",ret);
1064 ret = pthread_cancel(lynq_call_list_loop_tid);
1065 LYDBGLOG("pthread cancel ret = %d",ret);
1066 ret = pthread_join(lynq_call_urc_tid,NULL);
1067 LYDBGLOG("pthread join ret = %d",ret);
1068 ret = pthread_join(lynq_call_list_loop_tid,NULL);
1069 LYDBGLOG("pthread join ret = %d",ret);
llc0c711a2022-07-13 09:39:44 +00001070 pthread_mutex_destroy(s_urc_call_state_change_mutex);
1071 pthread_cond_destroy(s_urc_call_state_change_cond);
1072 delete s_urc_call_state_change_mutex;
1073 //s_urc_call_state_change_mutex = NULL;
1074 delete s_urc_call_state_change_cond;
1075 //s_urc_call_state_change_cond = NULL;
1076
lla8c25a82022-03-17 05:31:33 +00001077 return 0;
1078 }
rita98e2e9c2022-04-07 06:08:13 -04001079}
q.huang714145d2022-04-18 00:09:50 -04001080
1081int lynq_set_common_request(int request_id, int argc, const char* format,...)
rita089527e2022-04-07 01:55:39 -04001082{
1083 Parcel p;
1084 lynq_client_t client;
1085 int resp_type = -1;
1086 int request = -1;
1087 int slot_id = -1;
1088 int error = -1;
rita089527e2022-04-07 01:55:39 -04001089
1090 client.uToken = Global_uToken_call;
q.huang714145d2022-04-18 00:09:50 -04001091 client.request = request_id;
1092 client.paramLen = argc;
rita089527e2022-04-07 01:55:39 -04001093 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang714145d2022-04-18 00:09:50 -04001094 if(argc!=0)
1095 {
1096 va_list args;
1097 va_start(args, format);
1098 vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
1099 va_end(args);
1100 }
q.huang70b76492022-06-02 14:49:02 +08001101 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rita089527e2022-04-07 01:55:39 -04001102 if(send_request(lynq_call_client_sockfd,&client)==-1)
1103 {
1104 LYERRLOG("send request fail");
1105 return -1;
1106 }
q.huang714145d2022-04-18 00:09:50 -04001107 if(get_response(lynq_call_client_sockfd,p)==0)
1108 {
1109 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1110 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1111 }
rita089527e2022-04-07 01:55:39 -04001112 return error;
1113}
1114
q.huang714145d2022-04-18 00:09:50 -04001115int lynq_get_common_request(int request_id, int* status)
rita089527e2022-04-07 01:55:39 -04001116{
1117 Parcel p;
1118 lynq_client_t client;
1119 int resp_type = -1;
1120 int request = -1;
1121 int slot_id = -1;
1122 int error = -1;
q.huang714145d2022-04-18 00:09:50 -04001123 if(status==NULL)
1124 {
1125 LYERRLOG("status is null");
1126 return -1;
1127 }
rita089527e2022-04-07 01:55:39 -04001128 client.uToken = Global_uToken_call;
q.huang714145d2022-04-18 00:09:50 -04001129 client.request = request_id;
1130 client.paramLen = 0;
rita089527e2022-04-07 01:55:39 -04001131 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang70b76492022-06-02 14:49:02 +08001132 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rita089527e2022-04-07 01:55:39 -04001133 if(send_request(lynq_call_client_sockfd,&client)==-1)
1134 {
1135 LYERRLOG("send request fail");
1136 return -1;
1137 }
q.huang714145d2022-04-18 00:09:50 -04001138 if(get_response(lynq_call_client_sockfd,p)==0)
rita089527e2022-04-07 01:55:39 -04001139 {
q.huang714145d2022-04-18 00:09:50 -04001140 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1141 p.readInt32(status);
1142 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
rita089527e2022-04-07 01:55:39 -04001143 }
rita089527e2022-04-07 01:55:39 -04001144 return error;
1145}
1146
lh7b0674a2022-01-10 00:34:35 -08001147int lynq_call(int* handle,char addr[])
1148{
ll27dbe752022-08-10 00:33:52 -07001149 if(g_lynq_call_init_flag == 0)
1150 {
1151 return -1;
1152 }
lh7b0674a2022-01-10 00:34:35 -08001153 Parcel p;
1154 lynq_client_t client;
1155 int resp_type = -1;
1156 int request = -1;
1157 int slot_id = -1;
1158 int error = -1;
1159 int lynq_call_id = -1;
q.huang70b76492022-06-02 14:49:02 +08001160
1161 LYINFLOG("lynq_call begin addr %s",addr);
lh7b0674a2022-01-10 00:34:35 -08001162 if(addr==NULL)
1163 {
1164 LYERRLOG("Phone num is null!!!");
1165 return -1;
1166 }
q.huang70b76492022-06-02 14:49:02 +08001167
1168 if(find_call_id_with_addr(addr)!=INVALID_ID)
1169 {
1170 LYERRLOG("addr %s exists",addr);
1171 return LYNQ_E_CONFLICT;
1172 }
1173
1174#ifdef ECALL_SUPPORT
1175 if(lynq_ecall_is_running())
1176 {
1177 LYERRLOG("lynq_fast_ecall ecall is running");
1178 return LYNQ_E_ECALL_BEING_RUNNING;
1179 }
1180#endif
1181
lh42c1e572022-01-25 18:47:39 -08001182 client.uToken = Global_uToken_call;
lh7b0674a2022-01-10 00:34:35 -08001183 client.request = 10;//RIL_REQUEST_DIAL
1184 client.paramLen = 2;
1185 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1186 memcpy(client.param,addr,strlen(addr)+1);
1187 strcat(client.param," 0");
q.huang70b76492022-06-02 14:49:02 +08001188 lynq_call_id = addAddr(addr);
1189 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001190 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lh42c1e572022-01-25 18:47:39 -08001191 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh7b0674a2022-01-10 00:34:35 -08001192 {
1193 LYERRLOG("send request fail");
q.huang70b76492022-06-02 14:49:02 +08001194 cleanCallList(lynq_call_id);
lh7b0674a2022-01-10 00:34:35 -08001195 return -1;
1196 }
lh42c1e572022-01-25 18:47:39 -08001197 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001198 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
lh7b0674a2022-01-10 00:34:35 -08001199 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1200 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
lh7b0674a2022-01-10 00:34:35 -08001201 if(error==0)
1202 {
1203 isDial = 1;
ll72bf6c12022-03-24 10:22:25 +08001204 if(waitCallstateChange(6000)==ETIMEDOUT)//6000ms
lh7b0674a2022-01-10 00:34:35 -08001205 {
lhd1e457c2022-04-19 06:01:25 -07001206 //if timeout,this call need destroy.
1207 isDial = 0;
lh7b0674a2022-01-10 00:34:35 -08001208 error = LYNQ_E_TIME_OUT;
q.huang70b76492022-06-02 14:49:02 +08001209 LYERRLOG("lynq_call timeout:wait Call state fail!!! clear local idx %d",lynq_call_id);
1210 cleanCallList(lynq_call_id);
lh7b0674a2022-01-10 00:34:35 -08001211 return error;
1212 }
q.huang70b76492022-06-02 14:49:02 +08001213 isDial = 0;
1214 *handle = lynq_call_lists[lynq_call_id].call_id;
1215 if(*handle > 0)
1216 {
1217 LYINFLOG("lynq_call dial addr %s suc, id is %d",addr,*handle);
1218 return 0;
1219 }
1220 else
1221 {
1222 LYERRLOG("lynq_call dial addr %s fail, invalid id",addr);
1223 cleanCallList(lynq_call_id);
1224 return LYNQ_E_INVALID_ID_ANONALY;
1225 }
1226
lh7b0674a2022-01-10 00:34:35 -08001227 }
q.huang70b76492022-06-02 14:49:02 +08001228 LYERRLOG("lynq_call dial addr %s fail, service error %d",addr, error);
1229 cleanCallList(lynq_call_id);
lh7b0674a2022-01-10 00:34:35 -08001230 return error;
1231}
1232int lynq_call_answer()
1233{
ll27dbe752022-08-10 00:33:52 -07001234 if(g_lynq_call_init_flag == 0)
1235 {
1236 return -1;
1237 }
lh7b0674a2022-01-10 00:34:35 -08001238 Parcel p;
1239 lynq_client_t client;
1240 int resp_type = -1;
1241 int request = -1;
1242 int slot_id = -1;
1243 int error = -1;
lh42c1e572022-01-25 18:47:39 -08001244 client.uToken = Global_uToken_call;
lh7b0674a2022-01-10 00:34:35 -08001245 client.request = 40;//RIL_REQUEST_DIAL
1246 client.paramLen = 0;
1247 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang70b76492022-06-02 14:49:02 +08001248 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001249 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lh42c1e572022-01-25 18:47:39 -08001250 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh7b0674a2022-01-10 00:34:35 -08001251 {
1252 LYERRLOG("send request fail");
lh7b0674a2022-01-10 00:34:35 -08001253 return -1;
1254 }
lh42c1e572022-01-25 18:47:39 -08001255 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001256 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
lh7b0674a2022-01-10 00:34:35 -08001257 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1258 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1259 return error;
1260}
1261int lynq_call_hungup(int* handle)
1262{
ll27dbe752022-08-10 00:33:52 -07001263 if(g_lynq_call_init_flag == 0)
1264 {
1265 return -1;
1266 }
lh7b0674a2022-01-10 00:34:35 -08001267 Parcel p;
1268 lynq_client_t client;
1269 int resp_type = -1;
1270 int request = -1;
1271 int slot_id = -1;
1272 int error = -1;
1273 int call_id = 0;
q.huang70b76492022-06-02 14:49:02 +08001274 int lynq_call_id;
lh42c1e572022-01-25 18:47:39 -08001275 if(handle==NULL||!((*handle>=0)&&(*handle<10)))
1276 {
1277 LYERRLOG("[%s] illegal input!!!!",__FUNCTION__);
1278 return LYNQ_E_CONFLICT;
1279 }
1280 client.uToken = Global_uToken_call;
lh7b0674a2022-01-10 00:34:35 -08001281 client.request = 12;//RIL_REQUEST_HUNGUP
1282 client.paramLen = 1;
1283 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang70b76492022-06-02 14:49:02 +08001284 call_id = *handle;
lh7b0674a2022-01-10 00:34:35 -08001285 sprintf(client.param,"%d",call_id);
q.huang70b76492022-06-02 14:49:02 +08001286 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001287 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lh42c1e572022-01-25 18:47:39 -08001288 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh7b0674a2022-01-10 00:34:35 -08001289 {
1290 LYERRLOG("send request fail");
lh7b0674a2022-01-10 00:34:35 -08001291 return -1;
1292 }
lh42c1e572022-01-25 18:47:39 -08001293 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001294 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
lh7b0674a2022-01-10 00:34:35 -08001295 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1296 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1297 if(error==0)
1298 {
q.huang70b76492022-06-02 14:49:02 +08001299 lynq_call_id=find_call_id_with_call_id(call_id);
1300 if(lynq_call_id!=INVALID_ID)
1301 {
1302 cleanCallList(lynq_call_id);
1303 }
lh7b0674a2022-01-10 00:34:35 -08001304 }
1305 return error;
1306}
1307int lynq_call_hungup_all()
1308{
ll27dbe752022-08-10 00:33:52 -07001309 if(g_lynq_call_init_flag == 0)
1310 {
1311 return -1;
1312 }
lh7b0674a2022-01-10 00:34:35 -08001313 Parcel p;
1314 lynq_client_t client;
1315 int resp_type = -1;
1316 int request = -1;
1317 int slot_id = -1;
1318 int error = -1;
lh42c1e572022-01-25 18:47:39 -08001319 client.uToken = Global_uToken_call;
lh7b0674a2022-01-10 00:34:35 -08001320 client.request = 17;//RIL_REQUEST_UDUB
1321 client.paramLen = 0;
1322 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang70b76492022-06-02 14:49:02 +08001323 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001324 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lh42c1e572022-01-25 18:47:39 -08001325 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh7b0674a2022-01-10 00:34:35 -08001326 {
1327 LYERRLOG("send request fail");
lh7b0674a2022-01-10 00:34:35 -08001328 return -1;
1329 }
lh42c1e572022-01-25 18:47:39 -08001330 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001331 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
lh7b0674a2022-01-10 00:34:35 -08001332 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1333 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1334 return error;
1335}
1336int lynq_wait_incoming_call(int *handle)
1337{
ll27dbe752022-08-10 00:33:52 -07001338 if(g_lynq_call_init_flag == 0)
1339 {
1340 return -1;
1341 }
lh7b0674a2022-01-10 00:34:35 -08001342 waitIncomingCall();
1343 *handle = lynqIncomingCallId;
1344 LYINFLOG("lynq incoming call id:%d",lynqIncomingCallId);
1345 return 0;
1346}
1347
1348int lynq_set_auto_answercall(const int mode)
1349{
ll27dbe752022-08-10 00:33:52 -07001350 if(g_lynq_call_init_flag == 0)
1351 {
1352 return -1;
1353 }
lh7b0674a2022-01-10 00:34:35 -08001354 global_call_auto_answer = mode;
1355 LYINFLOG("auto answer call mode =%d",mode);
1356 return 0;
1357}
q.huangec88da92022-03-29 04:17:32 -04001358int lynq_get_current_call_state(int *handle, int *call_state,int *toa,int *direction,char addr[])
1359{
ll27dbe752022-08-10 00:33:52 -07001360 if(g_lynq_call_init_flag == 0)
1361 {
1362 return -1;
1363 }
q.huangec88da92022-03-29 04:17:32 -04001364 int lynq_call_id = 0;
q.huang70b76492022-06-02 14:49:02 +08001365 LYINFLOG("lynq_get_current_call_state begin ");
q.huangec88da92022-03-29 04:17:32 -04001366 if(handle==NULL)
1367 {
q.huang70b76492022-06-02 14:49:02 +08001368 LYERRLOG("handle is NULL");
q.huangec88da92022-03-29 04:17:32 -04001369 return LYNQ_E_NULL_ANONALY;
1370 }
q.huang70b76492022-06-02 14:49:02 +08001371 lynq_call_id = find_call_id_with_call_id(*handle);
1372 if(lynq_call_id==INVALID_ID)
1373 {
1374 return LYNQ_E_INVALID_ID_ANONALY;
1375 }
q.huangec88da92022-03-29 04:17:32 -04001376 *call_state = lynq_call_lists[lynq_call_id].call_state;
1377 *toa = lynq_call_lists[lynq_call_id].toa;
1378 *direction = lynq_call_lists[lynq_call_id].direction;
1379 memcpy(addr,lynq_call_lists[lynq_call_id].addr,strlen(lynq_call_lists[lynq_call_id].addr)+1);
1380 return 0;
1381}
1382
1383/*audio begin*/
lldc99c9b2022-01-24 12:16:22 +00001384static int judge_mic(const int enable){
llf512fa32022-02-14 08:58:16 +00001385 switch(enable){
1386 case 0:
1387 return 1;
1388 case 1:
1389 return 1;
1390 default:
1391 return 0;
lldc99c9b2022-01-24 12:16:22 +00001392 }
1393}
1394
lh7b0674a2022-01-10 00:34:35 -08001395int lynq_set_mute_mic(const int enable)
lldc99c9b2022-01-24 12:16:22 +00001396{
ll27dbe752022-08-10 00:33:52 -07001397 if(g_lynq_call_init_flag == 0)
1398 {
1399 return -1;
1400 }
lldc99c9b2022-01-24 12:16:22 +00001401 if(!judge_mic(enable)){
1402 return LYNQ_E_CONFLICT;
1403 }
q.huangec88da92022-03-29 04:17:32 -04001404 return lynq_set_common_request(53,1,"%d",enable); //RIL_REQUEST_SET_MUTE
1405}
1406int lynq_get_mute_mic(int *status)
1407{
ll27dbe752022-08-10 00:33:52 -07001408 if(g_lynq_call_init_flag == 0)
1409 {
1410 return -1;
1411 }
q.huangec88da92022-03-29 04:17:32 -04001412 return lynq_get_common_request(54,status);//RIL_REQUEST_GET_MUTE
lh7b0674a2022-01-10 00:34:35 -08001413}
ll72bf6c12022-03-24 10:22:25 +08001414
1415/**
1416 * @brief Check whether DTMF is valid
1417 *
1418 * @param callnum dtmf eg:0-9 * #
1419 * @return int
1420 */
1421static int judge_dtmf(const char callnum)
1422{
1423 if(callnum == '#')
1424 {
1425 return 1;
1426 }
1427 if(callnum == '*')
1428 {
1429 return 1;
1430 }
1431 if(callnum >= '0'&& callnum <= '9')
1432 {
1433 return 1;
1434 }
1435 return 0;
1436}
1437
ll209e6112022-07-20 09:30:19 +00001438int lynq_switch_waiting_or_holding_and_active(void)
1439{
ll27dbe752022-08-10 00:33:52 -07001440 if(g_lynq_call_init_flag == 0)
1441 {
1442 return -1;
1443 }
ll209e6112022-07-20 09:30:19 +00001444 Parcel p;
1445 lynq_client_t client;
1446 int resp_type = -1;
1447 int request = -1;
1448 int slot_id = -1;
1449 int error = -1;
1450 client.uToken = Global_uToken_call;
1451 client.request = RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE;
1452 client.paramLen = 0;
1453 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1454 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001455 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001456 if(send_request(lynq_call_client_sockfd,&client)==-1)
1457 {
1458 LYERRLOG("send request fail");
1459 return -1;
1460 }
1461 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001462 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001463 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1464 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1465 return error;
1466}
1467
1468int lynq_hangup_waiting_or_background(void)
1469{
ll27dbe752022-08-10 00:33:52 -07001470 if(g_lynq_call_init_flag == 0)
1471 {
1472 return -1;
1473 }
ll209e6112022-07-20 09:30:19 +00001474 Parcel p;
1475 lynq_client_t client;
1476 int resp_type = -1;
1477 int request = -1;
1478 int slot_id = -1;
1479 int error = -1;
1480 client.uToken = Global_uToken_call;
1481 client.request = RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND;
1482 client.paramLen = 0;
1483 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1484 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001485 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001486 if(send_request(lynq_call_client_sockfd,&client)==-1)
1487 {
1488 LYERRLOG("send request fail");
1489 return -1;
1490 }
1491 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001492 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001493 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1494 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1495 return error;
1496}
1497
1498int lynq_hangup_foreground_resume_background(void)
1499{
ll27dbe752022-08-10 00:33:52 -07001500 if(g_lynq_call_init_flag == 0)
1501 {
1502 return -1;
1503 }
ll209e6112022-07-20 09:30:19 +00001504 Parcel p;
1505 lynq_client_t client;
1506 int resp_type = -1;
1507 int request = -1;
1508 int slot_id = -1;
1509 int error = -1;
1510 client.uToken = Global_uToken_call;
1511 client.request = RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND;
1512 client.paramLen = 0;
1513 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1514 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001515 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001516 if(send_request(lynq_call_client_sockfd,&client)==-1)
1517 {
1518 LYERRLOG("send request fail");
1519 return -1;
1520 }
1521 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001522 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001523 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1524 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1525 return error;
1526}
1527
lh7b0674a2022-01-10 00:34:35 -08001528int lynq_set_DTMF(const char callnum)
1529{
ll27dbe752022-08-10 00:33:52 -07001530 if(g_lynq_call_init_flag == 0)
1531 {
1532 return -1;
1533 }
ll72bf6c12022-03-24 10:22:25 +08001534 if(!judge_dtmf(callnum))
1535 {
1536 return LYNQ_E_CONFLICT;
1537 }
lh7b0674a2022-01-10 00:34:35 -08001538 if(!lynq_call_state)
1539 {
1540 LYERRLOG("LYNQ_E_CONFLICT");
1541 return LYNQ_E_CONFLICT;
1542 }
q.huangec88da92022-03-29 04:17:32 -04001543 return lynq_set_common_request(24,1,"%c",callnum); //RIL_REQUEST_DTMF
lh7b0674a2022-01-10 00:34:35 -08001544}
q.huangec88da92022-03-29 04:17:32 -04001545static int judge_volume(LYNQ_E_VOLUMN_SET set,const int volume){
1546 if(set==LYNQ_E_VOLUMN_SET_DTMF){
1547 if(volume < 0 ||volume >36){
1548 return 0;
1549 }
1550 }
1551 else if (set==LYNQ_E_VOLUMN_SET_SPEECH)
1552 {
1553 if(volume < 1 ||volume >7){
1554 return 0;
1555 }
lldc99c9b2022-01-24 12:16:22 +00001556 }
ll04ae4142022-01-27 05:54:38 +00001557 return 1;
lldc99c9b2022-01-24 12:16:22 +00001558}
lh7b0674a2022-01-10 00:34:35 -08001559int lynq_set_DTMF_volume(const int volume)
lldc99c9b2022-01-24 12:16:22 +00001560{
q.huangec88da92022-03-29 04:17:32 -04001561 if(!judge_volume(LYNQ_E_VOLUMN_SET_DTMF,volume)){
lldc99c9b2022-01-24 12:16:22 +00001562 return LYNQ_E_CONFLICT;
1563 }
q.huangec88da92022-03-29 04:17:32 -04001564 return lynq_set_common_request(8003,1,"%d",volume);//LYNQ_REQUEST_SET_DTMF_VOLUME
lh7b0674a2022-01-10 00:34:35 -08001565}
q.huangb212fde2022-04-05 23:11:02 -04001566int lynq_set_speech_volume(const int volume)//mixer_set_volume
lh7b0674a2022-01-10 00:34:35 -08001567{
q.huangec88da92022-03-29 04:17:32 -04001568 if(!judge_volume(LYNQ_E_VOLUMN_SET_SPEECH,volume))
lh7b0674a2022-01-10 00:34:35 -08001569 {
q.huangec88da92022-03-29 04:17:32 -04001570 return LYNQ_E_CONFLICT;
lh7b0674a2022-01-10 00:34:35 -08001571 }
q.huangec88da92022-03-29 04:17:32 -04001572 return lynq_set_common_request(8009,1,"%d",volume); //LYNQ_REQUEST_SET_SPEECH_VOLUME
lh7b0674a2022-01-10 00:34:35 -08001573}
q.huangec88da92022-03-29 04:17:32 -04001574int lynq_get_speech_volume(int* volumn)//mixer_get_volume
1575{
1576 return lynq_get_common_request(8010,volumn);//LYNQ_REQUEST_GET_SPEECH_VOLUME
1577}
q.huangb212fde2022-04-05 23:11:02 -04001578int lynq_incall_record_start(const char* file_path)
q.huangec88da92022-03-29 04:17:32 -04001579{
q.huang70b76492022-06-02 14:49:02 +08001580 return lynq_set_common_request(8011,2,"%s %s","1",file_path); //LYNQ_REQUEST_RECORD
q.huangec88da92022-03-29 04:17:32 -04001581}
1582int lynq_incall_record_stop()
1583{
q.huangb212fde2022-04-05 23:11:02 -04001584 const char* unused_file="just_ocuupy_paramter_postion";
1585 return lynq_set_common_request(8011,2,"%s %s","0",unused_file); //LYNQ_REQUEST_RECORD
q.huangec88da92022-03-29 04:17:32 -04001586}
1587/*audio end*/
q.huang714145d2022-04-18 00:09:50 -04001588
1589#ifdef ECALL_SUPPORT
1590LYNQ_ECall_Variant lynq_get_lynq_ecall_variant_from_lynq_type(LYNQ_ECall_Type type)
1591{
1592 switch(type)
1593 {
1594 case LYNQ_ECALL_TYPE_TEST:
1595 return LYNQ_ECALL_TEST;
1596 case LYNQ_ECALL_TYPE_RECONFIG:
1597 return LYNQ_ECALL_RECONFIG;
1598 default:
1599 return LYNQ_ECALL_EMERGENCY;
1600 }
1601}
1602
1603RIL_ECall_Variant lynq_get_ril_ecall_variant_from_lynq_variant(LYNQ_ECall_Variant type)
1604{
1605 switch(type)
1606 {
1607 case LYNQ_ECALL_TEST:
1608 return ECALL_TEST;
1609 case LYNQ_ECALL_RECONFIG:
1610 return ECALL_RECONFIG;
1611 default:
1612 return ECALL_EMERGENCY;
1613 }
1614}
1615
1616RIL_ECall_Category lynq_get_ril_ecall_cat_from_lynq_cat(LYNQ_ECall_Category cat)
1617{
1618 switch(cat)
1619 {
1620 case LYNQ_EMER_CAT_MANUAL_ECALL:
1621 return EMER_CAT_MANUAL_ECALL;
1622 default:
1623 return EMER_CAT_AUTO_ECALL;
1624 }
1625}
1626
1627
1628int lynq_set_test_num(LYNQ_ECall_Set_Type type, const char *test_num, int test_num_length)
1629{
1630 int error;
1631
1632 if(test_num==NULL || test_num_length > LYNQ_PHONE_NUMBER_MAX )
1633 {
q.huang70b76492022-06-02 14:49:02 +08001634 LYERRLOG("test_num is null or test_num_length %d s greater than %d ",test_num_length,LYNQ_PHONE_NUMBER_MAX);
q.huang714145d2022-04-18 00:09:50 -04001635 return -1;
1636 }
1637
1638 error=lynq_set_common_request(RIL_REQUEST_ECALL_SET_TEST_NUM,2,"%d %s",type,test_num);
1639
1640 if(error==0)
1641 {
1642 snprintf(e_call_addr[LYNQ_ECALL_TEST],LYNQ_PHONE_NUMBER_MAX,"%s",test_num);
1643 }
1644
1645 return error;
1646}
1647
q.huang633b9af2022-05-10 20:37:21 +08001648int 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)
q.huang714145d2022-04-18 00:09:50 -04001649{
q.huang70b76492022-06-02 14:49:02 +08001650 int error;
q.huang714145d2022-04-18 00:09:50 -04001651 RIL_ECall_Variant ril_ecall_variant = lynq_get_ril_ecall_variant_from_lynq_variant (lynq_ecall_variant);
q.huang52473032022-04-19 05:20:12 -04001652 RIL_ECall_Category ril_ecall_cat = lynq_get_ril_ecall_cat_from_lynq_cat(lynq_ecall_cat);
q.huang497c9772022-05-11 20:10:38 +08001653 char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};
1654 unsigned int i;
q.huang70b76492022-06-02 14:49:02 +08001655 if(lynq_ecall_is_running())
q.huang633b9af2022-05-10 20:37:21 +08001656 {
q.huang70b76492022-06-02 14:49:02 +08001657 LYERRLOG("lynq_fast_ecall ecall is running");
1658 return LYNQ_E_ECALL_BEING_RUNNING;
1659 }
1660
1661 if(msd_length > MSD_MAX_LENGTH || msd_length <=0)
1662 {
1663 LYERRLOG("lynq_fast_ecall msd_length %d is greater than %d or <= 0, parameter error",msd_length,MSD_MAX_LENGTH);
1664 return LYNQ_E_ECALL_MSD_LENGTH_ERROR;
q.huang633b9af2022-05-10 20:37:21 +08001665 }
q.huang633b9af2022-05-10 20:37:21 +08001666
q.huang497c9772022-05-11 20:10:38 +08001667 for(i =0; i<msd_length;i++)
q.huang633b9af2022-05-10 20:37:21 +08001668 {
q.huang497c9772022-05-11 20:10:38 +08001669 sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);
q.huang633b9af2022-05-10 20:37:21 +08001670 }
1671
q.huang8b33ed52022-04-19 20:27:44 -04001672
q.huang70b76492022-06-02 14:49:02 +08001673 LYINFLOG("lynq_fast_ecall addr is %s",e_call_addr[lynq_ecall_variant]);
q.huang8b33ed52022-04-19 20:27:44 -04001674
q.huang633b9af2022-05-10 20:37:21 +08001675 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);
q.huang714145d2022-04-18 00:09:50 -04001676
1677 if(error==0)
q.huang70b76492022-06-02 14:49:02 +08001678 {
q.huangce82b972022-06-21 14:57:02 +08001679 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_STARTED;
q.huang33ec0562022-07-01 11:38:26 +08001680 if(waitCallstateChange(270000)==ETIMEDOUT)//4.5 min, dailing 1 min, alerting 1 min, sending msd 30s, redial 2min
q.huang714145d2022-04-18 00:09:50 -04001681 {
q.huang70b76492022-06-02 14:49:02 +08001682 LYERRLOG("lynq_fast_ecall timeout:wait Call state time out!!!");
q.huangce82b972022-06-21 14:57:02 +08001683 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
q.huang70b76492022-06-02 14:49:02 +08001684 lynqRespWatingEvent();
1685 return LYNQ_E_TIME_OUT;
q.huang714145d2022-04-18 00:09:50 -04001686 }
q.huangce82b972022-06-21 14:57:02 +08001687 if(is_ecall_dial == LYNQ_ECALL_DAILING_STATE_STARTED)
1688 {
1689 /*just dail, no recv answer*/
1690 LYERRLOG("lynq_fast_ecall, no answer!");
1691 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
1692 lynqRespWatingEvent();
1693 return LYNQ_E_ECALL_DAILING_NO_ANSWER;
1694 }
1695
1696 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
q.huang70b76492022-06-02 14:49:02 +08001697 lynqRespWatingEvent();
q.huang8b33ed52022-04-19 20:27:44 -04001698
q.huang70b76492022-06-02 14:49:02 +08001699 if(g_ecallId != INVALID_ID)
1700 {
1701 *handle=g_ecallId;
1702 LYINFLOG("lynq_fast_ecall id is %d",g_ecallId);
1703 return 0;
1704 }
1705 else
1706 {
1707 LYERRLOG("lynq_fast_ecall service return fail");
1708 return LYNQ_E_INVALID_ID_ANONALY;
1709 }
q.huang714145d2022-04-18 00:09:50 -04001710 }
1711
1712 return error;
1713}
1714
1715int lynq_set_psap(int enable)
1716{
1717 return lynq_set_common_request(RIL_REQUEST_ECALL_SET_PSAP,1,"%d",enable);
1718}
1719
1720int lynq_psap_pull_msd()
1721{
1722 return lynq_set_common_request(RIL_REQUEST_ECALL_PSAP_PULL_MSD,0,"");
1723}
1724
1725int lynq_make_ecall(int* handle, LYNQ_ECall_Type type)
1726{
1727 LYNQ_ECall_Variant lynq_ecall_variant;
1728 int error = -1;
1729 int lynq_call_id = -1;
1730
1731 if(handle==NULL)
1732 {
q.huang70b76492022-06-02 14:49:02 +08001733 LYERRLOG("handle is NULL, parameter error ");
q.huang714145d2022-04-18 00:09:50 -04001734 return -1;
1735 }
1736
1737 error=lynq_set_common_request(RIL_REQUEST_ECALL_MAKE_ECALL,1,"%d",type);
1738
1739 if(error==0)
1740 {
1741 lynq_ecall_variant=lynq_get_lynq_ecall_variant_from_lynq_type(type);
1742
q.huang70b76492022-06-02 14:49:02 +08001743 lynq_call_id = addAddr(e_call_addr[lynq_ecall_variant]);
q.huang714145d2022-04-18 00:09:50 -04001744 isDial = 1;
1745 if(waitCallstateChange(10000)==ETIMEDOUT)//10000ms
1746 {
1747 error = LYNQ_E_TIME_OUT;
1748 LYERRLOG("timeout:wait Call state fail!!!");
q.huang714145d2022-04-18 00:09:50 -04001749 return error;
1750 }
1751
1752 *handle = lynq_call_id;
1753 }
1754
1755 return error;
1756}
1757
1758
q.huang8f0978b2022-05-10 20:49:46 +08001759int lynq_set_msd(int* handle, const unsigned char *msd_data, int msd_length)
q.huang714145d2022-04-18 00:09:50 -04001760{
q.huang497c9772022-05-11 20:10:38 +08001761 char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};
1762 unsigned int i;
1763
q.huang70b76492022-06-02 14:49:02 +08001764 if(handle==NULL || ((*handle) >= LYNQ_CALL_MAX) || msd_length > MSD_MAX_LENGTH || msd_length == 0 || msd_data ==NULL)
q.huang714145d2022-04-18 00:09:50 -04001765 {
q.huang70b76492022-06-02 14:49:02 +08001766 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);
q.huang8f0978b2022-05-10 20:49:46 +08001767 return -1;
1768 }
q.huang8f0978b2022-05-10 20:49:46 +08001769
q.huang497c9772022-05-11 20:10:38 +08001770 for(i=0; i<msd_length;i++)
q.huang8f0978b2022-05-10 20:49:46 +08001771 {
q.huang497c9772022-05-11 20:10:38 +08001772 sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);
q.huang70b76492022-06-02 14:49:02 +08001773 }
1774
1775 LYINFLOG("lynq_set_msd ");
q.huang714145d2022-04-18 00:09:50 -04001776
q.huang8f0978b2022-05-10 20:49:46 +08001777 return lynq_set_common_request(RIL_REQUEST_ECALL_SET_MSD,2,"%d %s",lynq_call_lists[(*handle)].call_id,lynq_msd_data);
q.huang714145d2022-04-18 00:09:50 -04001778}
1779
1780int lynq_set_ivs(int enable)
1781{
q.huang70b76492022-06-02 14:49:02 +08001782 if(enable<0)
1783 {
1784 lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);
1785 return 0;
1786 }
1787
1788 return lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);
q.huang714145d2022-04-18 00:09:50 -04001789}
1790
1791int lynq_reset_ivs()
1792{
1793 return lynq_set_common_request(RIL_REQUEST_ECALL_RESET_IVS,0,"");
1794}
1795
1796int lynq_ivs_push_msd()
1797{
1798 return lynq_set_common_request(RIL_REQUEST_ECALL_IVS_PUSH_MSD,0,"");
1799}
q.huang8b33ed52022-04-19 20:27:44 -04001800
1801int wait_ecall_event()
1802{
1803 int ret = 0;
1804 pthread_mutex_lock(&s_incoming_e_call_mutex);
1805 ret = pthread_cond_wait(&s_incoming_e_call_cond,&s_incoming_e_call_mutex);
q.huang70b76492022-06-02 14:49:02 +08001806 pthread_mutex_unlock(&s_incoming_e_call_mutex);
q.huang8b33ed52022-04-19 20:27:44 -04001807 return ret;
1808}
1809
q.huang476aae62022-06-30 19:39:20 +08001810int lynq_wait_ecall_indication(int* handle, LYNQ_ECall_Indication *eCall_Indication)
q.huang8b33ed52022-04-19 20:27:44 -04001811{
1812 wait_ecall_event();
q.huang476aae62022-06-30 19:39:20 +08001813 *handle = g_lynqIncomingEcallId;
q.huangce82b972022-06-21 14:57:02 +08001814 *eCall_Indication = g_lynqIncomingEcallIndication;
q.huang476aae62022-06-30 19:39:20 +08001815 LYINFLOG("lynq_wait_ecall_indication handle %d, Ind id: %d", *handle, *eCall_Indication);
q.huang8b33ed52022-04-19 20:27:44 -04001816 return 0;
1817}
1818
q.huang714145d2022-04-18 00:09:50 -04001819#endif
1820
q.huang5ca6c072022-06-06 16:15:31 +08001821/*Audio Path setting begin*/
q.huangcb7b7292022-06-28 20:12:01 +08001822/*sub function*/
1823void lynq_set_rtp_mixer_ctrl(int enable_rtp)
1824{
1825 char cmd[256];
1826 LYINFLOG("set_rtp_mixer_ctrl %d", enable_rtp);
1827 if(enable_rtp)
1828 {
1829 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 0);
1830 system(cmd);
1831 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 1);
1832 system(cmd);
1833 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 1);
1834 system(cmd);
1835 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH2 DL2_CH2\" %d", 1);
1836 system(cmd);
1837 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH1 PCM_2_CAP_CH1\" %d", 1);
1838 system(cmd);
1839 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 1);
1840 system(cmd);
1841 }
1842 else
1843 {
1844 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 1);
1845 system(cmd);
1846 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 0);
1847 system(cmd);
1848 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 0);
1849 system(cmd);
1850 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH2 DL2_CH2\" %d", 0);
1851 system(cmd);
1852 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH1 PCM_2_CAP_CH1\" %d", 0);
1853 system(cmd);
1854 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 0);
1855 system(cmd);
1856 }
1857}
1858
1859void* lynq_start_rtp_cmd(void *arg)
1860{
ll27dbe752022-08-10 00:33:52 -07001861 if(g_lynq_call_init_flag == 0)
1862 {
1863 return -1;
1864 }
q.huangcb7b7292022-06-28 20:12:01 +08001865 int* rtp_mode= (int*) arg;
1866 char cmd[384];
1867 LYINFLOG("lynq_start_rtp_cmd: rtp_mode is %d",(*rtp_mode));
1868 if ((*rtp_mode) == RTP_CLIENT)
1869 {
1870 sprintf(cmd,RTP_FROM_CMD, \
1871 g_rtp_client_info.port,g_rtp_client_info.clockrate,g_rtp_client_info.channels, \
1872 g_rtp_client_info.latency);
1873 LYINFLOG("start from rtp play: cmd is %s",cmd);
1874 system(cmd);
1875 }
1876 else if ((*rtp_mode) == RTP_SERVER)
1877 {
1878 sprintf(cmd,RTP_TO_CMD, \
1879 g_rtp_server_info.ip,g_rtp_server_info.port);
1880 LYINFLOG("start to rtp play: cmd is %s",cmd);
1881 system(cmd);
1882 }
1883 return NULL;
1884}
1885
1886int lynq_start_rtp_thread(int rtp_mode)
1887{
1888 int ret;
1889 pthread_attr_t attr;
1890 static int start_mode[RTP_MODE_MAX]={0,1};
1891
1892 pthread_attr_init(&attr);
1893 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1894 ret = pthread_create(&(g_rtp_thread[rtp_mode]),&attr,lynq_start_rtp_cmd,&(start_mode[rtp_mode]));
1895 if(ret != 0)
1896 {
1897 g_rtp_thread_valid[rtp_mode]=0;
1898 LYERRLOG("rtp create %d pthread error, ret is %d",rtp_mode, ret);
1899 return ret;
1900 }
1901 g_rtp_thread_valid[rtp_mode]=1;
1902 return 0;
1903}
1904
q.huang5ca6c072022-06-06 16:15:31 +08001905/*set*/
1906int lynq_set_voice_audio_mode(const LYNQ_Audio_Mode audio_mode)
1907{
ll27dbe752022-08-10 00:33:52 -07001908 if(g_lynq_call_init_flag == 0)
1909 {
1910 return -1;
1911 }
q.huangcb7b7292022-06-28 20:12:01 +08001912 int ret;
1913 int i;
1914
1915 if(audio_mode==AUDIO_MODE_RTP)
1916 {
1917 lynq_set_rtp_mixer_ctrl(1);
1918 for(i=0;i<RTP_MODE_MAX;i++)
1919 {
1920 if(!g_rtp_thread_valid[i])
1921 {
1922 if(lynq_start_rtp_thread(i)!= 0)
1923 {
1924 LYERRLOG("start rtp %d fail",i);
1925 break;
1926 }
1927 else
1928 {
1929 LYINFLOG("start rtp %d suc",i);
1930 }
1931 }
1932 else
1933 {
1934 LYERRLOG("rtp %d needn't start",i);
1935 }
1936 }
1937 if(i!= RTP_MODE_MAX)
1938 {
1939 LYERRLOG("start rtp whole fail");
1940 lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);
1941 return 1;
1942 }
1943 LYINFLOG("start rtp whole suc");
1944 return 0;
1945 }
1946 else if(audio_mode==AUDIO_MODE_CODEC)
1947 {
1948 for(i=0;i<RTP_MODE_MAX;i++)
1949 {
1950 if(g_rtp_thread_valid[i])
1951 {
1952 ret = pthread_cancel(g_rtp_thread[i]);
1953 LYINFLOG("pthread cancel rtp %d ret = %d",i,ret);
1954 ret = pthread_join(g_rtp_thread[i],NULL);
1955 LYINFLOG("pthread join rtp %d ret = %d",i,ret);
1956 g_rtp_thread_valid[i] = 0;
1957 }
1958 else
1959 {
1960 LYINFLOG("rtp %d needn't stop",i);
1961 }
1962 }
1963 lynq_set_rtp_mixer_ctrl(0);
1964 LYINFLOG("stop rtp suc");
1965 }
1966 return 0;
q.huang5ca6c072022-06-06 16:15:31 +08001967}
q.huangcb7b7292022-06-28 20:12:01 +08001968int lynq_set_remote_rtp_ip(const char* ip, const int ip_length)
q.huang5ca6c072022-06-06 16:15:31 +08001969{
q.huangcb7b7292022-06-28 20:12:01 +08001970 if (NULL == ip)
1971 {
1972 LYERRLOG("ip is NULL!!!");
1973 return -1;
1974 }
1975 if ((ip_length < strlen(ip)+1) || (ip_length > MAX_IP_LENGTH))
1976 {
1977 LYERRLOG("incoming ip length error %d", ip_length);
1978 return -1;
1979 }
1980
1981 bzero(g_rtp_server_info.ip,MAX_IP_LENGTH);
1982 strcpy(g_rtp_server_info.ip,ip);
1983
1984 LYINFLOG("lynq_set_remote_rtp_ip suc: ip is %s, length is %d", ip,ip_length);
1985
q.huang5ca6c072022-06-06 16:15:31 +08001986 return 0;
1987}
q.huang2d5b28c2022-06-06 20:23:15 +08001988int lynq_set_rtp_port(const LYNQ_Rtp_Mode rtp_mode, const int port)
q.huang5ca6c072022-06-06 16:15:31 +08001989{
q.huangcb7b7292022-06-28 20:12:01 +08001990 if (port < 0)
1991 {
1992 LYERRLOG("invalid port number %d", port);
1993 return -1;
1994 }
1995 if (rtp_mode == 0)
1996 {
1997 g_rtp_client_info.port = port;
1998 }
1999 else if (rtp_mode == 1)
2000 {
2001 g_rtp_server_info.port = port;
2002 }
2003 LYINFLOG("lynq_set_rtp_port suc: LYNQ_Rtp_Mode is %d, port is %d", rtp_mode, port);
q.huang5ca6c072022-06-06 16:15:31 +08002004 return 0;
2005}
2006int lynq_set_rtp_param(const int clock_rate,const int channels,const int latency) //only for client mode
2007{
q.huangcb7b7292022-06-28 20:12:01 +08002008 g_rtp_client_info.clockrate = clock_rate;
2009 g_rtp_client_info.channels = channels;
2010 g_rtp_client_info.latency = latency;
2011 LYINFLOG("lynq_set_rtp_param suc: clockrate is %d, channels is %d, latency is %d", clock_rate, channels, latency);
q.huang5ca6c072022-06-06 16:15:31 +08002012 return 0;
2013}
2014/*get*/
2015LYNQ_Audio_Mode lynq_get_voice_audio_mode()
2016{
ll27dbe752022-08-10 00:33:52 -07002017 if(g_lynq_call_init_flag == 0)
2018 {
2019 return -1;
2020 }
q.huangcb7b7292022-06-28 20:12:01 +08002021 if(g_rtp_thread_valid[0])
2022 {
2023 return AUDIO_MODE_RTP;
2024 }
2025 else
2026 {
2027 return AUDIO_MODE_CODEC;
2028 }
q.huang5ca6c072022-06-06 16:15:31 +08002029}
q.huangcb7b7292022-06-28 20:12:01 +08002030int lynq_get_remote_rtp_ip(char* ip, const int ip_length)
q.huang5ca6c072022-06-06 16:15:31 +08002031{
ll27dbe752022-08-10 00:33:52 -07002032 if(g_lynq_call_init_flag == 0)
2033 {
2034 return -1;
2035 }
q.huang5ca6c072022-06-06 16:15:31 +08002036 if(ip==NULL)
2037 {
q.huangcb7b7292022-06-28 20:12:01 +08002038 LYERRLOG("ip is NULL");
q.huang5ca6c072022-06-06 16:15:31 +08002039 return 1;
2040 }
q.huangcb7b7292022-06-28 20:12:01 +08002041
2042 if(ip_length < strlen(g_rtp_server_info.ip)+1)
2043 {
2044 LYERRLOG("ip lenght %d is shorter than saved ip length %d",ip_length,strlen(g_rtp_server_info.ip)+1);
2045 return 1;
2046 }
2047 bzero(ip,ip_length);
2048 strcpy(ip,g_rtp_server_info.ip);
q.huang5ca6c072022-06-06 16:15:31 +08002049 return 0;
2050}
2051int lynq_get_rtp_port(const LYNQ_Rtp_Mode rtp_mode, int* port)
2052{
ll27dbe752022-08-10 00:33:52 -07002053 if(g_lynq_call_init_flag == 0)
2054 {
2055 return -1;
2056 }
q.huang5ca6c072022-06-06 16:15:31 +08002057 if(port==NULL)
2058 {
2059 return 1;
q.huangcb7b7292022-06-28 20:12:01 +08002060 }
2061 if (rtp_mode == 0)
2062 {
2063 *port = g_rtp_client_info.port;
2064 }
2065 else if (rtp_mode == 1)
2066 {
2067 *port = g_rtp_server_info.port;
2068 }
q.huang5ca6c072022-06-06 16:15:31 +08002069 return 0;
2070}
2071int lynq_get_rtp_param(int* clock_rate, int* channels, int* latency)//only for client mode
2072{
ll27dbe752022-08-10 00:33:52 -07002073 if(g_lynq_call_init_flag == 0)
2074 {
2075 return -1;
2076 }
q.huang5ca6c072022-06-06 16:15:31 +08002077 if(clock_rate == NULL || channels ==NULL || latency ==NULL)
2078 {
q.huangcb7b7292022-06-28 20:12:01 +08002079 LYERRLOG("input parameter is NULL");
q.huang5ca6c072022-06-06 16:15:31 +08002080 return 1;
2081 }
2082
q.huangcb7b7292022-06-28 20:12:01 +08002083 *clock_rate = g_rtp_client_info.clockrate;
2084 *channels = g_rtp_client_info.channels ;
2085 *latency = g_rtp_client_info.latency;
2086
q.huang5ca6c072022-06-06 16:15:31 +08002087 return 0;
2088}
2089/*Audio Path setting end*/
2090
lh7b0674a2022-01-10 00:34:35 -08002091#if 0
2092int main(int argc,char **argv)
2093{
2094 int n = 0;
2095 n = lynq_init_call(lynq_call_state_change_test,2222);
2096 if(n<0)
2097 {
q.huang70b76492022-06-02 14:49:02 +08002098 LYDBGLOG("lynq init call fail!!!");
lh7b0674a2022-01-10 00:34:35 -08002099 return -1;
2100 }
q.huang70b76492022-06-02 14:49:02 +08002101 LYDBGLOG("lynq call init success!!!");
lh7b0674a2022-01-10 00:34:35 -08002102 char phoneNum[LYNQ_PHONE_NUMBER_MAX];
2103 sprintf(phoneNum,"18180053406 0",strlen("18180053406 0")+1);
2104 lynq_call(phoneNum);
2105 while(1)
2106 {
2107 sleep(1);
2108 }
2109 return 0;
2110}
2111#endif
2112/*Warren add for T800 platform 2021/11/19 end*/