blob: c91bea30b04a95e3c70f1dd662644422eb10d178 [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;
q.huange97cfcf2022-08-29 20:04:31 +0800182static pthread_mutex_t s_ecall_variable_mutex = PTHREAD_MUTEX_INITIALIZER;
q.huang8b33ed52022-04-19 20:27:44 -0400183
q.huang70b76492022-06-02 14:49:02 +0800184LYNQ_ECall_Indication g_lynqIncomingEcallIndication;
q.huange97cfcf2022-08-29 20:04:31 +0800185int g_lynqIncomingEcallId=INVALID_ID;
186LYNQ_ECall_Variant g_lynqEcallVariant=LYNQ_ECALL_VAR_NONE;
187int g_ecall_whether_preempt=0;
q.huang8b33ed52022-04-19 20:27:44 -0400188
189void sendSignalIncomingECallEvent()
190{
q.huangcb7b7292022-06-28 20:12:01 +0800191 LYINFLOG("send incoming ecall event signal");
q.huang8b33ed52022-04-19 20:27:44 -0400192 pthread_mutex_lock(&s_incoming_e_call_mutex);
193 pthread_cond_signal(&s_incoming_e_call_cond);
194 pthread_mutex_unlock(&s_incoming_e_call_mutex);
195}
q.huang70b76492022-06-02 14:49:02 +0800196
197int lynq_is_msd_suc(LYNQ_ECall_Indication lynqIncomingEcallIndication)
198{
199 if(LYNQ_ECALL_LLACK_RECEIVED == lynqIncomingEcallIndication ||
200 LYNQ_ECALL_ALACK_POSITIVE_RECEIVED == lynqIncomingEcallIndication ||
201 LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED == lynqIncomingEcallIndication ||
q.huange97cfcf2022-08-29 20:04:31 +0800202 //LYNQ_ECALL_T5_TIMER_OUT == lynqIncomingEcallIndication ||
q.huang70b76492022-06-02 14:49:02 +0800203 LYNQ_ECALL_T6_TIMER_OUT == lynqIncomingEcallIndication ||
204 LYNQ_ECALL_T7_TIMER_OUT == lynqIncomingEcallIndication)
205 {
206 return 1;
207 }
208
209 return 0;
210}
211
212int lynq_ecall_is_running()
213{
q.huange97cfcf2022-08-29 20:04:31 +0800214 return (is_ecall_dial!=LYNQ_ECALL_DAILING_STATE_NONE) || (g_ecallId !=INVALID_ID || g_lynqEcallVariant == LYNQ_ECALL_CALLBACK);
215}
216
217void print_ecall_info()
218{
219 LYERRLOG("%s is ecall dial is %d, ecall id is %d, ecall vairant is %d, incoming ecall ind is %d, incoming ecall id is %d, whether preempt is %d",__func__,is_ecall_dial,g_ecallId,g_lynqEcallVariant,g_lynqIncomingEcallIndication,g_lynqIncomingEcallId,g_ecall_whether_preempt);
220}
221
222int lynq_ecall_is_permit_in_call(int ecall_id)
223{
224 return g_lynqEcallVariant == LYNQ_ECALL_CALLBACK && (g_ecallId ==INVALID_ID || g_ecallId ==ecall_id);
225}
226
227int lynq_ecall_is_in_voice()
228{
229 return (is_ecall_dial==LYNQ_ECALL_DAILING_STATE_NONE) && (g_ecallId !=INVALID_ID);
q.huang70b76492022-06-02 14:49:02 +0800230}
q.huang8b33ed52022-04-19 20:27:44 -0400231#endif
q.huang714145d2022-04-18 00:09:50 -0400232
lla8c25a82022-03-17 05:31:33 +0000233/**
234 * @brief mark call initialization state
235 * 0: deinit state
236 * 1: init state
237 */
238int g_lynq_call_init_flag = 0;
lh7b0674a2022-01-10 00:34:35 -0800239
q.huang7de1d662022-09-13 14:19:24 +0800240int JumpHeader(Parcel &p,int *resp_type,int* token,int *request,int *slot_id,int *error)
lh7b0674a2022-01-10 00:34:35 -0800241{
242 if(p.dataAvail() > 0)
243 {
244 p.readInt32(resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800245 p.readInt32(token);
lh7b0674a2022-01-10 00:34:35 -0800246 p.readInt32(request);
247 p.readInt32(slot_id);
248 p.readInt32(error);
249 return 0;
250 }
251 else
252 {
253 return -1;
254 }
255}
256int send_request(int sockfd,lynq_client_t *client_tmp)
257{
258 int ret=0;
rjw5d2a50e2022-02-28 15:01:49 +0800259 ret = sendto(sockfd, client_tmp, client_size, 0, (struct sockaddr *)&addr_serv, len_addr_serv);
lh7b0674a2022-01-10 00:34:35 -0800260 if(ret==-1)
261 {
q.huang70b76492022-06-02 14:49:02 +0800262 LYERRLOG("sendto error");
lh7b0674a2022-01-10 00:34:35 -0800263 return -1;
264 }
265 return 0;
266}
267
268int get_response(int sockfd,Parcel &p)
269{
270 int len = 0;
271 char recvline[LYNQ_REC_BUF];
272 bzero(recvline,LYNQ_REC_BUF);
273 /* receive data from server */
rjw5d2a50e2022-02-28 15:01:49 +0800274 len = recvfrom(sockfd,recvline,LYNQ_REC_BUF, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
lh7b0674a2022-01-10 00:34:35 -0800275 if(len == -1)
276 {
q.huang70b76492022-06-02 14:49:02 +0800277 LYERRLOG("recvfrom error");
lh7b0674a2022-01-10 00:34:35 -0800278 return -1;
279 }
lh7b0674a2022-01-10 00:34:35 -0800280 if (recvline != NULL) {
281 p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
282 p.setDataPosition(0);
283 }
284 return 0;
285}
286static char *strdupReadString(Parcel &p) {
ll04ae4142022-01-27 05:54:38 +0000287 size_t stringlen;
lh7b0674a2022-01-10 00:34:35 -0800288 const char16_t *s16;
289 s16 = p.readString16Inplace(&stringlen);
ll04ae4142022-01-27 05:54:38 +0000290 return strndup16to8(s16, stringlen);
lh7b0674a2022-01-10 00:34:35 -0800291}
292
293int lynq_get_current_call_list(lynq_call_list_t call_list[LYNQ_CALL_MAX])
294{
295 Parcel p;
296 lynq_client_t client;
297 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +0800298 int token;
lh7b0674a2022-01-10 00:34:35 -0800299 int request = -1;
300 int slot_id = -1;
301 int error = -1;
302 int call_num = 0;
303 int temp = 0;
304 char *remote_phoneNum = NULL;
305 char *remote_name= NULL;
306 char *uusData = NULL;
lh42c1e572022-01-25 18:47:39 -0800307 client.uToken = Global_uToken_call;
lh7b0674a2022-01-10 00:34:35 -0800308 client.request = 9;//RIL_REQUEST_GET_CURRENT_CALLS
309 client.paramLen = 0;
310 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang70b76492022-06-02 14:49:02 +0800311 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
lh42c1e572022-01-25 18:47:39 -0800312 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh7b0674a2022-01-10 00:34:35 -0800313 {
314 LYERRLOG("send request fail");
lh7b0674a2022-01-10 00:34:35 -0800315 return -1;
316 }
lh42c1e572022-01-25 18:47:39 -0800317 get_response(lynq_call_client_sockfd,p);
q.huang7de1d662022-09-13 14:19:24 +0800318 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
lh7b0674a2022-01-10 00:34:35 -0800319 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
320 if(error == 0)
321 {
322 p.readInt32(&call_num);
323 global_call_count = call_num;
324 if(call_num<=0)
325 {
326 lynq_call_state = CALL_OFF;
lhec17b0a2022-02-13 23:56:05 -0800327 LYINFLOG("lynq_call_state:%d",lynq_call_state);
lh7b0674a2022-01-10 00:34:35 -0800328 return 0;
329 }
lhec17b0a2022-02-13 23:56:05 -0800330 lynq_call_state = CALL_ON;
q.huang70b76492022-06-02 14:49:02 +0800331 LYINFLOG("lynq_call_state:%d, call num is %d ",lynq_call_state,call_num);
lh7b0674a2022-01-10 00:34:35 -0800332 for(int i = 0;i < call_num;i++)
333 {
334 p.readInt32(&temp);
335 call_list[i].call_state = temp;
336 p.readInt32(&call_list[i].call_id);
337 p.readInt32(&call_list[i].toa);
338 p.readInt32(&temp);
339 p.readInt32(&temp);
340 call_list[i].direction = temp;
341 p.readInt32(&temp);
342 p.readInt32(&temp);
343 p.readInt32(&temp);
344 remote_phoneNum = strdupReadString(p);
345 memcpy(call_list[i].addr,remote_phoneNum,strlen(remote_phoneNum));
346 LYINFLOG("call_id=%d,call_state=%d,direction=%d,addr=%s,toa=%d",call_list[i].call_id,call_list[i].call_state,
347 call_list[i].direction,call_list[i].addr,call_list[i].toa);
348 p.readInt32(&temp);
349 remote_name = strdupReadString(p);
350 p.readInt32(&temp);
351 p.readInt32(&temp);
352 if(temp==0)
353 {
354 continue;
355 }
356 p.readInt32(&temp); /* UUS Information is present */
357 p.readInt32(&temp);
358 p.readInt32(&temp);
359 p.read(uusData,temp);
360 }
361 }
362 return 0;
363}
364
365void cleanCallList(int lynq_call_id)
366{
q.huang70b76492022-06-02 14:49:02 +0800367 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 -0800368 lynq_call_lists[lynq_call_id].call_id = 0;
lhe45b7002022-04-26 00:45:44 -0700369 lynq_call_lists[lynq_call_id].call_state = (int)LYNQ_CALL_END;
lh7b0674a2022-01-10 00:34:35 -0800370 lynq_call_lists[lynq_call_id].toa = 0;
371 lynq_call_lists[lynq_call_id].direction = 0;
372 lynq_call_lists[lynq_call_id].used = 0;
lh7b0674a2022-01-10 00:34:35 -0800373 memset(lynq_call_lists[lynq_call_id].addr,0,sizeof(lynq_call_lists[lynq_call_id].addr));
374}
375int getUnusedElement()
376{
377 for(int i=0;i < LYNQ_CALL_MAX; i++)
378 {
379 if(lynq_call_lists[i].used!=1)
380 {
381 return i;
382 }
383 }
384 return -1;
385}
q.huang70b76492022-06-02 14:49:02 +0800386int addAddr(char addr[])
lh7b0674a2022-01-10 00:34:35 -0800387{
388 int ret = 0;
389 ret = getUnusedElement();
390 memcpy(lynq_call_lists[ret].addr,addr,strlen(addr)+1);
391 lynq_call_lists[ret].used = 1;
q.huang70b76492022-06-02 14:49:02 +0800392 LYINFLOG("add local idx is %d addr is %s",ret,addr);
lh7b0674a2022-01-10 00:34:35 -0800393 return ret;
394}
395void updateCallList(lynq_call_list_e_t *callList, int call_id,int call_state,int toa,int direction)
396{
q.huang70b76492022-06-02 14:49:02 +0800397 LYINFLOG("Update original local id is %d, new local id is %d",callList->call_id,call_id);
lh7b0674a2022-01-10 00:34:35 -0800398 callList->call_id = call_id;
399 callList->call_state = call_state;
400 callList->toa = toa;
q.huang70b76492022-06-02 14:49:02 +0800401 callList->direction = direction;
lh7b0674a2022-01-10 00:34:35 -0800402 return;
403}
404int waitCallstateChange(int mtime)
405{
lhd1e457c2022-04-19 06:01:25 -0700406 LYINFLOG("wait Call state Change");
lh7b0674a2022-01-10 00:34:35 -0800407 int ret = 0;
408 int sec = 0;
409 int usec = 0;
lh2afc7732022-01-10 02:24:31 -0800410 struct timeval now;
411 struct timespec timeout;
412 gettimeofday(&now,NULL);
lh7b0674a2022-01-10 00:34:35 -0800413 sec = mtime/1000;
414 usec = mtime%1000;
lh2afc7732022-01-10 02:24:31 -0800415 timeout.tv_sec = now.tv_sec+sec;
416 timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
lh7b0674a2022-01-10 00:34:35 -0800417 pthread_mutex_lock(&call_state_change_mutex);
lh2afc7732022-01-10 02:24:31 -0800418 ret = pthread_cond_timedwait(&call_state_change_cond,&call_state_change_mutex,&timeout);
lh7b0674a2022-01-10 00:34:35 -0800419 pthread_mutex_unlock(&call_state_change_mutex);
420 return ret;
421}
422int waitIncomingCall()
423{
lhd1e457c2022-04-19 06:01:25 -0700424 LYINFLOG("wait incming call");
lh7b0674a2022-01-10 00:34:35 -0800425 int ret = 0;
426 pthread_mutex_lock(&s_incoming_call_mutex);
427 ret = pthread_cond_wait(&s_incoming_call_cond,&s_incoming_call_mutex);
428 pthread_mutex_unlock(&s_incoming_call_mutex);
429 return ret;
430}
431int checkHasCall(char addr[])
432{
433 for(int i = 0;i<LYNQ_CALL_MAX;i++)
434 {
435 if(strcmp(lynq_call_lists[i].addr,addr)==0)
436 {
q.huang70b76492022-06-02 14:49:02 +0800437 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 -0800438 return 1;
439 }
440 }
q.huang70b76492022-06-02 14:49:02 +0800441 LYINFLOG("checkHasCall addr is %s , no idx is found",addr);
lh7b0674a2022-01-10 00:34:35 -0800442 return 0;
443}
lhd1e457c2022-04-19 06:01:25 -0700444int find_call_id_with_addr(char *addr)
445{
lhd1e457c2022-04-19 06:01:25 -0700446 for(int id = 0; id < LYNQ_CALL_MAX; id++)
447 {
q.huang70b76492022-06-02 14:49:02 +0800448 if(lynq_call_lists[id].used && (strcmp(lynq_call_lists[id].addr,addr) == 0))
lhd1e457c2022-04-19 06:01:25 -0700449 {
q.huang70b76492022-06-02 14:49:02 +0800450 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 -0700451 return id;
452 }
453 }
q.huang70b76492022-06-02 14:49:02 +0800454 LYINFLOG("find addr %s in local list , not found",addr);
lhd1e457c2022-04-19 06:01:25 -0700455 return -1;
456}
q.huang70b76492022-06-02 14:49:02 +0800457int find_call_id_with_call_id(int call_id)
458{
459 for(int id = 0; id < LYNQ_CALL_MAX; id++)
460 {
461 if(lynq_call_lists[id].used && (lynq_call_lists[id].call_id == call_id))
462 {
463 LYINFLOG("find id %d in local list, local idx is %d, addr is %s",call_id,id,lynq_call_lists[id].addr);
464 return id;
465 }
466 }
467 LYINFLOG("find id %d in local list , not found",call_id);
468 return INVALID_ID;
469}
lh7b0674a2022-01-10 00:34:35 -0800470void sendSignalToWaitCallStateChange()
471{
lhd1e457c2022-04-19 06:01:25 -0700472 LYINFLOG("send Signal To Wait Call State Change");
lh7b0674a2022-01-10 00:34:35 -0800473 pthread_mutex_lock(&call_state_change_mutex);
474 pthread_cond_signal(&call_state_change_cond);
475 pthread_mutex_unlock(&call_state_change_mutex);
476}
477void sendSignalIncomingCall()
478{
lhd1e457c2022-04-19 06:01:25 -0700479 LYINFLOG("send incoming call signal");
lh7b0674a2022-01-10 00:34:35 -0800480 pthread_mutex_lock(&s_incoming_call_mutex);
481 pthread_cond_signal(&s_incoming_call_cond);
482 pthread_mutex_unlock(&s_incoming_call_mutex);
483}
484
485void addCallListToLynqCallList(lynq_call_list_e_t *callList, int call_id,int call_state,int toa,int direction,char addr[LYNQ_PHONE_NUMBER_MAX])
486{
487 callList->call_id = call_id;
488 callList->call_state = call_state;
489 callList->toa = toa;
490 callList->direction = direction;
491 memcpy(callList->addr,addr,strlen(addr)+1);
492 callList->used = 1;
lh7b0674a2022-01-10 00:34:35 -0800493 return;
494}
495
496void *triggerGetCallList(void *parg)
ll04ae4142022-01-27 05:54:38 +0000497{
498 int ret=0;
lhd1e457c2022-04-19 06:01:25 -0700499 bool call_end;
ll04ae4142022-01-27 05:54:38 +0000500 lynq_call_list_t call_list[LYNQ_CALL_MAX];
q.huang8b33ed52022-04-19 20:27:44 -0400501 int update=0;
q.huang70b76492022-06-02 14:49:02 +0800502 int cnt;
503 int i,n;
q.huange97cfcf2022-08-29 20:04:31 +0800504#ifdef ECALL_SUPPORT
505 int handupIncomingMT=0;
506#endif
q.huang70b76492022-06-02 14:49:02 +0800507
lh7b0674a2022-01-10 00:34:35 -0800508 while(call_list_loop)
ll04ae4142022-01-27 05:54:38 +0000509 {
q.huang8b33ed52022-04-19 20:27:44 -0400510 update=0;
llc0c711a2022-07-13 09:39:44 +0000511 pthread_mutex_lock(s_urc_call_state_change_mutex);
512 pthread_cond_wait(s_urc_call_state_change_cond, s_urc_call_state_change_mutex);
q.huang70b76492022-06-02 14:49:02 +0800513 LYDBGLOG("triggerGetCallList event!!!");
ll04ae4142022-01-27 05:54:38 +0000514 memset(call_list,0,sizeof(call_list));
515 ret = lynq_get_current_call_list(call_list);
516 if(ret != 0)
517 {
q.huang70b76492022-06-02 14:49:02 +0800518 LYDBGLOG("get current call list failure!!!");
llbc035332022-04-11 05:49:51 +0000519 continue;
ll04ae4142022-01-27 05:54:38 +0000520 }
lhd1e457c2022-04-19 06:01:25 -0700521 LYINFLOG("++++++++++++++triggerGetCallList++++++++++++++");
q.huang70b76492022-06-02 14:49:02 +0800522 LYINFLOG("clear local index begin");
523 cnt=0;
524 for(i = 0;i < LYNQ_CALL_MAX;i++)
lh7b0674a2022-01-10 00:34:35 -0800525 {
q.huang70b76492022-06-02 14:49:02 +0800526 if(lynq_call_lists[i].used ==0)
527 {
528 continue;
529 }
530 cnt++;
531 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);
532
533 if(lynq_call_lists[i].call_id > 0)
lhd1e457c2022-04-19 06:01:25 -0700534 {
535 call_end = 0;
q.huang70b76492022-06-02 14:49:02 +0800536 for(n = 0; n < LYNQ_CALL_MAX; n++)
lhd1e457c2022-04-19 06:01:25 -0700537 {
q.huang70b76492022-06-02 14:49:02 +0800538 if(call_list[n].call_id == lynq_call_lists[i].call_id)
lhd1e457c2022-04-19 06:01:25 -0700539 {
540 call_end = 1;
q.huang70b76492022-06-02 14:49:02 +0800541 LYINFLOG("find lynq call local idx %d, service idx %d id is %d!!!",i,n,lynq_call_lists[i].call_id);
542 break;
lhd1e457c2022-04-19 06:01:25 -0700543 }
544 }
545 if(call_end == 0)
546 {
q.huang70b76492022-06-02 14:49:02 +0800547 LYINFLOG("MT hungup,then clean call info local idx is %d id is %d",i, lynq_call_lists[i].call_id);
548 cleanCallList(i);
lhd1e457c2022-04-19 06:01:25 -0700549 }
550 } //fix bug API-54
q.huang70b76492022-06-02 14:49:02 +0800551 else
552 {
553 LYINFLOG("local id is 0");
554 }
555 }
556 LYINFLOG("clear local index end, local used cnt is %d", cnt);
557
558 LYINFLOG("add or update local index begin ");
559 for (i = 0;i < LYNQ_CALL_MAX;i++)
560 {
561 if(call_list[i].call_id==0)
562 {
563 break;
564 }
565
566 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,
567 call_list[i].direction,call_list[i].addr,call_list[i].toa);
568
lh7b0674a2022-01-10 00:34:35 -0800569 if(call_list[i].direction == 1)//MT call
570 {
q.huang70b76492022-06-02 14:49:02 +0800571 LYINFLOG("This is a MT CALL");
lh0fd3b012022-05-13 03:02:19 -0700572 /*MT CALL state code
573 **LYNQ_CALL_INCOMING = 4,
574 **LYNQ_CALL_WAITING = 5,
575 */
q.huange97cfcf2022-08-29 20:04:31 +0800576#ifdef ECALL_SUPPORT
lh0fd3b012022-05-13 03:02:19 -0700577 if((call_list[i].call_state ==4) || (call_list[i].call_state ==5))
lh7b0674a2022-01-10 00:34:35 -0800578 {
q.huange97cfcf2022-08-29 20:04:31 +0800579
580 pthread_mutex_lock(&s_ecall_variable_mutex);
581 handupIncomingMT=lynq_ecall_is_running() && (lynq_ecall_is_permit_in_call(call_list[i].call_id)==false);
582 pthread_mutex_unlock(&s_ecall_variable_mutex);
583 LYINFLOG("handupIncomingMT is %d",handupIncomingMT);
584 if(handupIncomingMT)
lh7b0674a2022-01-10 00:34:35 -0800585 {
q.huang70b76492022-06-02 14:49:02 +0800586 lynq_call_hungup(&(call_list[i].call_id));
587 continue;
q.huange97cfcf2022-08-29 20:04:31 +0800588 }
q.huang70b76492022-06-02 14:49:02 +0800589 }
q.huange97cfcf2022-08-29 20:04:31 +0800590#endif
q.huang70b76492022-06-02 14:49:02 +0800591 /*you call me, and i call you,One party failed to dial*/
592 n = find_call_id_with_addr(call_list[i].addr);
593 if(n ==INVALID_ID)
594 {
595 n = addAddr(call_list[i].addr);
596 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
597 lynqIncomingCallId = call_list[i].call_id;
598 sendSignalIncomingCall();
599 }
600 else if(lynq_call_lists[n].call_state == call_list[i].call_state)
601 {
602 LYINFLOG("state not changed, state is %d ",call_list[i].call_state);
603 if(call_list[i].call_state ==4 || call_list[i].call_state ==5)
lhd1e457c2022-04-19 06:01:25 -0700604 {
lhd1e457c2022-04-19 06:01:25 -0700605 /*if call state not change,Maybe this call was ignored, so we need to continue to inform the user of
606 **an incoming call until the status changes.
607 **fix bug API-54
608 */
q.huang70b76492022-06-02 14:49:02 +0800609 LYINFLOG("resend incoming call signal");
610 sendSignalIncomingCall();
lhd1e457c2022-04-19 06:01:25 -0700611 }
lh7b0674a2022-01-10 00:34:35 -0800612 }
q.huang70b76492022-06-02 14:49:02 +0800613 else
ll72bf6c12022-03-24 10:22:25 +0800614 {
q.huang70b76492022-06-02 14:49:02 +0800615 LYINFLOG("state changed from %d to %d",lynq_call_lists[n].call_state,call_list[i].call_state);
616
617 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
618 }
lh7b0674a2022-01-10 00:34:35 -0800619 }
620 else
q.huang70b76492022-06-02 14:49:02 +0800621 {
622 LYINFLOG("This is a MO CALL");
623 call_end = 0;
624 for(n = 0 ; n < LYNQ_CALL_MAX; n++)
lh7b0674a2022-01-10 00:34:35 -0800625 {
q.huang70b76492022-06-02 14:49:02 +0800626 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 -0800627 {
q.huang70b76492022-06-02 14:49:02 +0800628 if(lynq_call_lists[n].call_id==0)
629 {
630 LYINFLOG("add a call id");
631 update=1;
632 }
633 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);
634 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
635 call_end = 1;
636 break;
637 }
638 }
639
640 if(call_end == 0)
641 {
642 LYINFLOG("need to hangup id %d", call_list[i].call_id);
643#ifdef ECALL_SUPPORT
q.huangce82b972022-06-21 14:57:02 +0800644 if(is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)
q.huang70b76492022-06-02 14:49:02 +0800645 {
646 LYINFLOG("ecall is dialing, for the timebeing, don't huangup");
lh7b0674a2022-01-10 00:34:35 -0800647 continue;
648 }
q.huang70b76492022-06-02 14:49:02 +0800649#endif
650 LYINFLOG("hang up service call id %d",call_list[i].call_id);
651 lynq_call_hungup(&(call_list[i].call_id));
lh7b0674a2022-01-10 00:34:35 -0800652 }
lh7b0674a2022-01-10 00:34:35 -0800653 }
q.huang70b76492022-06-02 14:49:02 +0800654 LYDBGLOG("servie idx %d end",i);
ll04ae4142022-01-27 05:54:38 +0000655 }
q.huang70b76492022-06-02 14:49:02 +0800656 LYINFLOG("add or update local index end ");
lh42c1e572022-01-25 18:47:39 -0800657 s_call_urc_event_complete = 1;
q.huang70b76492022-06-02 14:49:02 +0800658 if(isDial==1)
lh7b0674a2022-01-10 00:34:35 -0800659 {
q.huang70b76492022-06-02 14:49:02 +0800660 LYINFLOG("now is dialing");
661 if(update==1)
662 {
663 LYINFLOG("find added call");
664 sendSignalToWaitCallStateChange();
665 isDial = 0;
666 }
667 else
668 {
669 LYINFLOG("not find added call");
670 }
671 }
672 else
673 {
674 LYINFLOG("now is not dialing");
lh7b0674a2022-01-10 00:34:35 -0800675 }
llc0c711a2022-07-13 09:39:44 +0000676 pthread_mutex_unlock(s_urc_call_state_change_mutex);
ll04ae4142022-01-27 05:54:38 +0000677 }
678 return NULL;
lh7b0674a2022-01-10 00:34:35 -0800679}
680
681void lynqRespWatingEvent()
ll04ae4142022-01-27 05:54:38 +0000682{
683 if(s_call_urc_event_complete==1)
684 {
llc0c711a2022-07-13 09:39:44 +0000685 pthread_mutex_lock(s_urc_call_state_change_mutex);
686 pthread_cond_signal(s_urc_call_state_change_cond);
ll04ae4142022-01-27 05:54:38 +0000687 s_call_urc_event_complete = 0;
llc0c711a2022-07-13 09:39:44 +0000688 pthread_mutex_unlock(s_urc_call_state_change_mutex);
lh7b0674a2022-01-10 00:34:35 -0800689 }
ll04ae4142022-01-27 05:54:38 +0000690 return;
lh7b0674a2022-01-10 00:34:35 -0800691}
692
693/*Warren add for T800 platform 2021/11/19 start*/
694int lynq_socket_client_start()
rjw5d2a50e2022-02-28 15:01:49 +0800695{
696 #if 0
lh7b0674a2022-01-10 00:34:35 -0800697 struct sockaddr_in lynq_socket_server_addr;
698 /* init lynq_socket_server_addr */
699 bzero(&lynq_socket_server_addr, sizeof(lynq_socket_server_addr));
700 lynq_socket_server_addr.sin_family = AF_INET;
701 lynq_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
702 lynq_socket_server_addr.sin_addr.s_addr = htons(INADDR_ANY);
rjw5d2a50e2022-02-28 15:01:49 +0800703
lh7b0674a2022-01-10 00:34:35 -0800704 /*
705 if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)
706 {
q.huang70b76492022-06-02 14:49:02 +0800707 LYDBGLOG("[%s] is not a valid IPaddress", argv[1]);
lh7b0674a2022-01-10 00:34:35 -0800708 exit(1);
709 }
710*/
lh42c1e572022-01-25 18:47:39 -0800711 lynq_call_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
712 if(connect(lynq_call_client_sockfd, (struct sockaddr *)&lynq_socket_server_addr, sizeof(lynq_socket_server_addr)) == -1)
lh7b0674a2022-01-10 00:34:35 -0800713 {
q.huang70b76492022-06-02 14:49:02 +0800714 LYERRLOG("connect error");
lh7b0674a2022-01-10 00:34:35 -0800715 return -1;
716 }
rjw5d2a50e2022-02-28 15:01:49 +0800717 #endif
718 lynq_call_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
719 if (-1 == lynq_call_client_sockfd)
720 {
721 return lynq_call_client_sockfd;
722 }
ll630be412022-07-25 05:52:14 +0000723 struct timeval timeOut;
724 timeOut.tv_sec = 60;
725 timeOut.tv_usec = 0;
726 if (setsockopt(lynq_call_client_sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
727 {
728 RLOGD("time out setting failed\n");
729 return -1;
730 }
rjw5d2a50e2022-02-28 15:01:49 +0800731 /* 设置address */
732 memset(&addr_serv, 0, sizeof(addr_serv));
733 addr_serv.sin_family = AF_INET;
734 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
735 addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);
736 len_addr_serv = sizeof(addr_serv);
lh7b0674a2022-01-10 00:34:35 -0800737 return 0;
738}
739int lynq_update_call_list_loop()
740{
741 int ret = 0;
lh7b0674a2022-01-10 00:34:35 -0800742 pthread_attr_t attr;
743 pthread_attr_init(&attr);
744 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
lhec17b0a2022-02-13 23:56:05 -0800745 ret = pthread_create(&lynq_call_list_loop_tid,&attr,triggerGetCallList,NULL);
lh7b0674a2022-01-10 00:34:35 -0800746 if(ret < 0)
747 {
748 LYERRLOG("lynq_update_call_list_loop fail!!!");
749 return -1;
750 }
q.huang70b76492022-06-02 14:49:02 +0800751 LYDBGLOG("lynq_update_call_list_loop success!!!");
lh7b0674a2022-01-10 00:34:35 -0800752 return 0;
753
754}
q.huang70b76492022-06-02 14:49:02 +0800755
lh7b0674a2022-01-10 00:34:35 -0800756void *thread_urc_recv(void *parg)
ll04ae4142022-01-27 05:54:38 +0000757{
lh7b0674a2022-01-10 00:34:35 -0800758 int socket_fd = (int64_t)parg;
759 int len=0;
760 socklen_t addr_len=0;
761 uint8_t *dataLength = NULL;
762 char urc_data[LYNQ_REC_BUF];
763 int slot_id = -1;
764 int resp_type = -1;
765 int urcid = -1;
766 Parcel *p = NULL;
767 struct sockaddr_in dest_addr;
q.huang8b33ed52022-04-19 20:27:44 -0400768#ifdef ECALL_SUPPORT
q.huang70b76492022-06-02 14:49:02 +0800769 int ecall_ind;
770 int ecallId;
771 int unused_callid;
q.huange97cfcf2022-08-29 20:04:31 +0800772 int send_signal_to_wait_call_state;
773 int handup_ecall_id;
q.huang8b33ed52022-04-19 20:27:44 -0400774#endif
775
q.huang70b76492022-06-02 14:49:02 +0800776 LYINFLOG("thread_urc_recv in running....");
lh42c1e572022-01-25 18:47:39 -0800777 while(urc_call_recive_status)
lh7b0674a2022-01-10 00:34:35 -0800778 {
779 bzero(urc_data,LYNQ_REC_BUF);
780 //get data msg
781 len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);
782 if(len <= 0)
ll04ae4142022-01-27 05:54:38 +0000783 {
q.huang70b76492022-06-02 14:49:02 +0800784 LYERRLOG("thread_urc_recv step2 fail");
ll04ae4142022-01-27 05:54:38 +0000785 break;
lh7b0674a2022-01-10 00:34:35 -0800786 }
q.huang70b76492022-06-02 14:49:02 +0800787 LYDBGLOG("=====>urc data len<=====:%d",len);
lh7b0674a2022-01-10 00:34:35 -0800788 p = new Parcel();
789 if(p==NULL)
790 {
lh21502f52022-01-27 00:27:12 -0800791 LYERRLOG("new parcel failure!!!");
lh7b0674a2022-01-10 00:34:35 -0800792 break;
793 }
794 p->setData((uint8_t *)urc_data,len); // p.setData((uint8_t *) buffer, buflen);
795 p->setDataPosition(0);
796 if(p->dataAvail() > 0)
797 {
798 p->readInt32(&resp_type);
799 p->readInt32(&urcid);
800 p->readInt32(&slot_id);
q.huang70b76492022-06-02 14:49:02 +0800801 //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lh7b0674a2022-01-10 00:34:35 -0800802 switch (urcid)
803 {
804 case 1001://RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED
805 {
q.huang70b76492022-06-02 14:49:02 +0800806 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lh7b0674a2022-01-10 00:34:35 -0800807 lynqRespWatingEvent();
808 break;
809 }
810 case 1018://RIL_UNSOL_CALL_RING
811 {
812 if(global_call_auto_answer==1)
813 {
814 lynq_call_answer();
815 }
816 break;
817 }
818 case 1029://RIL_UNSOL_RINGBACK_TONE
819 case 3049://RIL_UNSOL_CALL_INFO_INDICATION
820 {
q.huang70b76492022-06-02 14:49:02 +0800821 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lh7b0674a2022-01-10 00:34:35 -0800822 break;
823 }
q.huang8b33ed52022-04-19 20:27:44 -0400824#ifdef ECALL_SUPPORT
825 case RIL_UNSOL_ECALL_INDICATIONS:
826 {
q.huange97cfcf2022-08-29 20:04:31 +0800827 pthread_mutex_lock(&s_ecall_variable_mutex);
828 send_signal_to_wait_call_state = false;
829 handup_ecall_id=false;
q.huang70b76492022-06-02 14:49:02 +0800830 p->readInt32(&ecall_ind);
831 g_lynqIncomingEcallIndication = ecall_ind;
832 p->readInt32(&ecallId);
q.huangce82b972022-06-21 14:57:02 +0800833 g_lynqIncomingEcallId = ecallId;
q.huang70b76492022-06-02 14:49:02 +0800834 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 +0800835 switch (g_lynqIncomingEcallIndication)
q.huang70b76492022-06-02 14:49:02 +0800836 {
q.huangce82b972022-06-21 14:57:02 +0800837 case LYNQ_ECALL_ACTIVE:
838 if(is_ecall_dial)
q.huang70b76492022-06-02 14:49:02 +0800839 {
q.huangce82b972022-06-21 14:57:02 +0800840 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_ANSWERED;
q.huang70b76492022-06-02 14:49:02 +0800841 }
q.huangce82b972022-06-21 14:57:02 +0800842 break;
q.huange97cfcf2022-08-29 20:04:31 +0800843 case LYNQ_ECALL_SENDING_START:
844 if(lynq_ecall_is_in_voice())
845 {
846 LYINFLOG("recv msd in voice, ind is changed to %d",LYNQ_ECALL_SENDING_START_IN_VOICE);
847 g_lynqIncomingEcallIndication = LYNQ_ECALL_SENDING_START_IN_VOICE;
848 }
849 break;
q.huangce82b972022-06-21 14:57:02 +0800850 case LYNQ_ECALL_LLACK_RECEIVED:
851 case LYNQ_ECALL_ALACK_POSITIVE_RECEIVED:
852 case LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED:
q.huange97cfcf2022-08-29 20:04:31 +0800853 //case LYNQ_ECALL_T5_TIMER_OUT: /*when Certificate CP 1.1.10.2, no msd start (ind 1), so T5 timeout is not regard as success*/
q.huangce82b972022-06-21 14:57:02 +0800854 case LYNQ_ECALL_T6_TIMER_OUT:
855 case LYNQ_ECALL_T7_TIMER_OUT:
856 if(is_ecall_dial)
857 {
858 LYINFLOG("ecall is dialing, recv suc indication");
859 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
860 if(ecallId >0 && find_call_id_with_call_id(ecallId)==INVALID_ID)
861 {
862 LYINFLOG("add ecall in loacl list");
863 g_ecallId = ecallId;
864 unused_callid=addAddr("ecall");
865 lynq_call_lists[unused_callid].call_id=g_ecallId;
q.huange97cfcf2022-08-29 20:04:31 +0800866 }
867 send_signal_to_wait_call_state=true;
q.huangce82b972022-06-21 14:57:02 +0800868 }
q.huange97cfcf2022-08-29 20:04:31 +0800869 else if(ecallId >0 && (find_call_id_with_call_id(ecallId)==INVALID_ID) && (g_lynqEcallVariant != LYNQ_ECALL_CALLBACK))
q.huangce82b972022-06-21 14:57:02 +0800870 {
871 LYERRLOG("ecall is not in dialing and first recv suc indication, hangup");
q.huange97cfcf2022-08-29 20:04:31 +0800872 handup_ecall_id=true;
q.huangce82b972022-06-21 14:57:02 +0800873 }
874 else
875 {
876 LYERRLOG("ecall is not in dialing and not first recv suc indication");
877 }
878 break;
879 case LYNQ_ECALL_PSAP_CALLBACK_START:
880 if(lynq_ecall_is_running()==0)
881 {
q.huange97cfcf2022-08-29 20:04:31 +0800882 if(ecallId>0)
883 {
884 LYINFLOG("ecall is not running, recv psap call back msd start, set ecall running");
885 g_lynqEcallVariant = LYNQ_ECALL_CALLBACK;
q.huangce82b972022-06-21 14:57:02 +0800886 g_ecallId = ecallId;
887 if(isDial)
888 {
889 LYINFLOG("stop normal dial");
q.huange97cfcf2022-08-29 20:04:31 +0800890 send_signal_to_wait_call_state=true;
q.huangce82b972022-06-21 14:57:02 +0800891 }
892 else
893 {
894 LYINFLOG("no normal dial");
q.huange97cfcf2022-08-29 20:04:31 +0800895 }
q.huangce82b972022-06-21 14:57:02 +0800896 }
897 else
898 {
q.huange97cfcf2022-08-29 20:04:31 +0800899 LYERRLOG("ecallId is abnormal in psap callback");
900 }
901 }
q.huangce82b972022-06-21 14:57:02 +0800902 else
903 {
904 LYERRLOG("ecall is running, recv psap call back msd start");
905 }
906 break;
907 case LYNQ_ECALL_ABNORMAL_HANGUP:
908 if(is_ecall_dial == LYNQ_ECALL_DAILING_STATE_NONE)
909 {
910 LYERRLOG("ecall is not in dialing , recv abnormal hangup");
911 g_ecallId = INVALID_ID;
912 }
913 else if (is_ecall_dial == LYNQ_ECALL_DAILING_STATE_STARTED)
914 {
915 LYERRLOG("ecall is in dialing state, recv no answer, recv abnormal hangup, dont' redial");
916 g_ecallId = INVALID_ID;
q.huange97cfcf2022-08-29 20:04:31 +0800917 send_signal_to_wait_call_state=true;
q.huangce82b972022-06-21 14:57:02 +0800918 }
919 else {
920 LYINFLOG("ecall is in dialing and recv answer, recv abnormal hangup");
921 }
922 break;
923 case LYNQ_ECALL_DISCONNECTED:
924 case LYNQ_ECALL_REDIAL_TIMER_OUT:
925 case LYNQ_ECALL_T2_TIMER_OUT :
q.huange97cfcf2022-08-29 20:04:31 +0800926 case LYNQ_ECALL_IMS_DISCONNECTED:
q.huangce82b972022-06-21 14:57:02 +0800927 g_ecallId = INVALID_ID;
q.huange97cfcf2022-08-29 20:04:31 +0800928 if(g_lynqEcallVariant == LYNQ_ECALL_CALLBACK)
929 {
930 g_lynqEcallVariant = LYNQ_ECALL_VAR_NONE; /*other type, needn't re-initialize*/
931 }
q.huangce82b972022-06-21 14:57:02 +0800932 if(is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)
933 {
934 LYERRLOG("ecall is in dialing, recv like disconnect indication");
q.huange97cfcf2022-08-29 20:04:31 +0800935 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
936 send_signal_to_wait_call_state=true;
q.huangce82b972022-06-21 14:57:02 +0800937 }
938 else
939 {
940 LYINFLOG("ecall is not in dialing, recv like disconnect indication");
941 }
942 break;
943 default:
944 LYINFLOG("not special indication");
q.huange97cfcf2022-08-29 20:04:31 +0800945 }
946 pthread_mutex_unlock(&s_ecall_variable_mutex);
947 if(send_signal_to_wait_call_state)
948 {
949 sendSignalToWaitCallStateChange();
q.huang70b76492022-06-02 14:49:02 +0800950 }
q.huang8b33ed52022-04-19 20:27:44 -0400951 sendSignalIncomingECallEvent();
q.huange97cfcf2022-08-29 20:04:31 +0800952 if(handup_ecall_id)
953 {
954 lynq_call_hungup(&ecallId);
955 }
q.huang70b76492022-06-02 14:49:02 +0800956 LYINFLOG("**************:RIL_UNSOL_ECALL_INDICATIONS, local ecall id is %d", g_ecallId);
q.huang8b33ed52022-04-19 20:27:44 -0400957 break;
958 }
959#endif
lh7b0674a2022-01-10 00:34:35 -0800960 default:
961 break;
962 }
963 }
964 delete p;
965 p = NULL;
966 }
967 close(socket_fd);
968}
969int lynq_socket_urc_start()
970{
971 int socket_fd=0;
972 int rt=0;
973 int len=0;
974 int on=1;
975 struct sockaddr_in urc_local_addr;
lh7b0674a2022-01-10 00:34:35 -0800976 pthread_attr_t attr;
ll04ae4142022-01-27 05:54:38 +0000977 socket_fd = socket(AF_INET,SOCK_DGRAM,0);
ll04ae4142022-01-27 05:54:38 +0000978 if(socket_fd < 0)
979 {
q.huang70b76492022-06-02 14:49:02 +0800980 LYERRLOG("creaet socket for udp fail");
ll04ae4142022-01-27 05:54:38 +0000981 return -1;
lh7b0674a2022-01-10 00:34:35 -0800982 }
983 urc_local_addr.sin_family = AF_INET;
984 urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
985 urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
986 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
ll04ae4142022-01-27 05:54:38 +0000987 rt = setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
988 if(rt<0)
989 {
q.huang70b76492022-06-02 14:49:02 +0800990 LYERRLOG("SO_REUSEADDR fail");
lh7b0674a2022-01-10 00:34:35 -0800991 return -1;
992 }
993 rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
ll04ae4142022-01-27 05:54:38 +0000994 if (rt == -1)
995 {
lh21502f52022-01-27 00:27:12 -0800996 LYERRLOG("bind failed");
ll04ae4142022-01-27 05:54:38 +0000997 return -1;
lh7b0674a2022-01-10 00:34:35 -0800998 }
999 pthread_attr_init(&attr);
1000 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
lhec17b0a2022-02-13 23:56:05 -08001001 rt = pthread_create(&lynq_call_urc_tid,&attr,thread_urc_recv,(void *)socket_fd);
lh7b0674a2022-01-10 00:34:35 -08001002 if(rt < 0)
1003 {
q.huang70b76492022-06-02 14:49:02 +08001004 LYERRLOG("urc loop failure!!!");
lh7b0674a2022-01-10 00:34:35 -08001005 return -1;
1006 }
q.huang70b76492022-06-02 14:49:02 +08001007 LYDBGLOG("urc loop success!!!");
lh7b0674a2022-01-10 00:34:35 -08001008 return 0;
1009}
1010int getSelfElement(char addr[])
1011{
1012 for(int i=0;i < LYNQ_CALL_MAX; i++)
1013 {
1014 if(lynq_call_lists[i].used==1)
1015 {
1016 if(strcmp(lynq_call_lists[i].addr,addr)==0)
1017 {
1018 return i;
1019 }
1020
1021 }
1022 }
1023 return -1;
1024}
1025
1026void lynq_call_state_change_test(int soc_id)
1027{
q.huang70b76492022-06-02 14:49:02 +08001028 LYDBGLOG("call state change,sim:%d",soc_id);
lh7b0674a2022-01-10 00:34:35 -08001029}
q.huangcb7b7292022-06-28 20:12:01 +08001030
1031void lynq_init_rtp()
1032{
1033 memset(&g_rtp_client_info,0,sizeof(g_rtp_client_info));
1034 memset(&g_rtp_server_info,0,sizeof(g_rtp_server_info));
1035
1036
1037 lynq_set_rtp_param(8000,1,400);
1038
1039 for(int i=0;i<RTP_MODE_MAX;i++)
1040 {
q.huang0ae26e42022-06-30 09:55:45 +08001041 lynq_set_rtp_port(i,6666);
q.huangcb7b7292022-06-28 20:12:01 +08001042 g_rtp_thread_valid[i] = 0;
1043 }
1044
1045 LYDBGLOG("lynq init rtp success!!!");
1046 return;
1047}
1048
lh7b0674a2022-01-10 00:34:35 -08001049int lynq_init_call(int uToken)
lla8c25a82022-03-17 05:31:33 +00001050{
1051 if(g_lynq_call_init_flag == 1){
1052 LYDBGLOG("lynq init call failed!!!");
1053 return -1;
1054 }
1055 g_lynq_call_init_flag = 1;
llc0c711a2022-07-13 09:39:44 +00001056 s_call_urc_event_complete = 1;
1057 call_list_loop = 1;
1058 LYINFLOG("liulei call_list_loop %d\n", call_list_loop);
1059 s_urc_call_state_change_mutex = new pthread_mutex_t;
1060 pthread_mutex_init(s_urc_call_state_change_mutex, NULL);
1061 s_urc_call_state_change_cond = new pthread_cond_t;
1062 LYINFLOG("liulei s_urc_call_state_change_mutex\n");
1063 pthread_cond_init(s_urc_call_state_change_cond, NULL);
1064 LYINFLOG("liulei s_urc_call_state_change_cond\n");
lh7b0674a2022-01-10 00:34:35 -08001065 int result = 0;
lh42c1e572022-01-25 18:47:39 -08001066 Global_uToken_call = uToken;
lh21502f52022-01-27 00:27:12 -08001067 urc_call_recive_status = 1;
rjw5d2a50e2022-02-28 15:01:49 +08001068 client_size = sizeof(client_t);
lh7b0674a2022-01-10 00:34:35 -08001069 LYLOGSET(LOG_INFO);
1070 LYLOGEINIT(USER_LOG_TAG);
1071 result = lynq_socket_client_start();
1072 if(result!=0)
1073 {
1074 return -1;
1075 }
1076 result = lynq_socket_urc_start();
1077 if(result!=0)
1078 {
1079 return -1;
1080 }
1081 result = lynq_update_call_list_loop();
1082 if(result!=0)
1083 {
1084 return -1;
1085 }
1086 memset(lynq_call_lists,0,sizeof(lynq_call_lists));
q.huangcb7b7292022-06-28 20:12:01 +08001087
1088 lynq_init_rtp();
1089
lh7b0674a2022-01-10 00:34:35 -08001090 LYDBGLOG("lynq init call success!!!");
1091 return 0;
1092}
1093int lynq_deinit_call()
1094{
q.huang70b76492022-06-02 14:49:02 +08001095 int ret;
lla8c25a82022-03-17 05:31:33 +00001096 if(g_lynq_call_init_flag == 0)
lhec17b0a2022-02-13 23:56:05 -08001097 {
lla8c25a82022-03-17 05:31:33 +00001098 LYDBGLOG("lynq_deinit_call failed!!!");
1099 return -1;
lhec17b0a2022-02-13 23:56:05 -08001100 }
lla8c25a82022-03-17 05:31:33 +00001101 else
llc0c711a2022-07-13 09:39:44 +00001102 {
lla8c25a82022-03-17 05:31:33 +00001103 g_lynq_call_init_flag = 0;
q.huang70b76492022-06-02 14:49:02 +08001104 lynq_call_hungup_all();
lla8c25a82022-03-17 05:31:33 +00001105 if(lynq_call_client_sockfd>0)
1106 {
1107 close(lynq_call_client_sockfd);
1108 }
1109 urc_call_recive_status = 0;
1110 call_list_loop = 0;
q.huangcb7b7292022-06-28 20:12:01 +08001111 lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);
lla8c25a82022-03-17 05:31:33 +00001112 if(lynq_call_urc_tid == -1 || lynq_call_list_loop_tid == -1)
1113 {
1114 return -1;
1115 }
1116 ret = pthread_cancel(lynq_call_urc_tid);
1117 LYDBGLOG("pthread cancel ret = %d",ret);
1118 ret = pthread_cancel(lynq_call_list_loop_tid);
1119 LYDBGLOG("pthread cancel ret = %d",ret);
1120 ret = pthread_join(lynq_call_urc_tid,NULL);
1121 LYDBGLOG("pthread join ret = %d",ret);
1122 ret = pthread_join(lynq_call_list_loop_tid,NULL);
1123 LYDBGLOG("pthread join ret = %d",ret);
llc0c711a2022-07-13 09:39:44 +00001124 pthread_mutex_destroy(s_urc_call_state_change_mutex);
1125 pthread_cond_destroy(s_urc_call_state_change_cond);
1126 delete s_urc_call_state_change_mutex;
1127 //s_urc_call_state_change_mutex = NULL;
1128 delete s_urc_call_state_change_cond;
1129 //s_urc_call_state_change_cond = NULL;
1130
lla8c25a82022-03-17 05:31:33 +00001131 return 0;
1132 }
rita98e2e9c2022-04-07 06:08:13 -04001133}
q.huang714145d2022-04-18 00:09:50 -04001134
1135int lynq_set_common_request(int request_id, int argc, const char* format,...)
rita089527e2022-04-07 01:55:39 -04001136{
1137 Parcel p;
1138 lynq_client_t client;
1139 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001140 int token;
rita089527e2022-04-07 01:55:39 -04001141 int request = -1;
1142 int slot_id = -1;
1143 int error = -1;
rita089527e2022-04-07 01:55:39 -04001144
1145 client.uToken = Global_uToken_call;
q.huang714145d2022-04-18 00:09:50 -04001146 client.request = request_id;
1147 client.paramLen = argc;
rita089527e2022-04-07 01:55:39 -04001148 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang714145d2022-04-18 00:09:50 -04001149 if(argc!=0)
1150 {
1151 va_list args;
1152 va_start(args, format);
1153 vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
1154 va_end(args);
1155 }
q.huang70b76492022-06-02 14:49:02 +08001156 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rita089527e2022-04-07 01:55:39 -04001157 if(send_request(lynq_call_client_sockfd,&client)==-1)
1158 {
1159 LYERRLOG("send request fail");
1160 return -1;
1161 }
q.huang714145d2022-04-18 00:09:50 -04001162 if(get_response(lynq_call_client_sockfd,p)==0)
1163 {
q.huang7de1d662022-09-13 14:19:24 +08001164 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
q.huang714145d2022-04-18 00:09:50 -04001165 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1166 }
rita089527e2022-04-07 01:55:39 -04001167 return error;
1168}
1169
q.huang714145d2022-04-18 00:09:50 -04001170int lynq_get_common_request(int request_id, int* status)
rita089527e2022-04-07 01:55:39 -04001171{
1172 Parcel p;
1173 lynq_client_t client;
1174 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001175 int token;
rita089527e2022-04-07 01:55:39 -04001176 int request = -1;
1177 int slot_id = -1;
1178 int error = -1;
q.huang714145d2022-04-18 00:09:50 -04001179 if(status==NULL)
1180 {
1181 LYERRLOG("status is null");
1182 return -1;
1183 }
rita089527e2022-04-07 01:55:39 -04001184 client.uToken = Global_uToken_call;
q.huang714145d2022-04-18 00:09:50 -04001185 client.request = request_id;
1186 client.paramLen = 0;
rita089527e2022-04-07 01:55:39 -04001187 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang70b76492022-06-02 14:49:02 +08001188 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rita089527e2022-04-07 01:55:39 -04001189 if(send_request(lynq_call_client_sockfd,&client)==-1)
1190 {
1191 LYERRLOG("send request fail");
1192 return -1;
1193 }
q.huang714145d2022-04-18 00:09:50 -04001194 if(get_response(lynq_call_client_sockfd,p)==0)
rita089527e2022-04-07 01:55:39 -04001195 {
q.huang7de1d662022-09-13 14:19:24 +08001196 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
q.huang714145d2022-04-18 00:09:50 -04001197 p.readInt32(status);
1198 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
rita089527e2022-04-07 01:55:39 -04001199 }
rita089527e2022-04-07 01:55:39 -04001200 return error;
1201}
1202
lh7b0674a2022-01-10 00:34:35 -08001203int lynq_call(int* handle,char addr[])
1204{
ll27dbe752022-08-10 00:33:52 -07001205 if(g_lynq_call_init_flag == 0)
1206 {
1207 return -1;
1208 }
lh7b0674a2022-01-10 00:34:35 -08001209 Parcel p;
1210 lynq_client_t client;
1211 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001212 int token;
lh7b0674a2022-01-10 00:34:35 -08001213 int request = -1;
1214 int slot_id = -1;
1215 int error = -1;
1216 int lynq_call_id = -1;
q.huang70b76492022-06-02 14:49:02 +08001217
1218 LYINFLOG("lynq_call begin addr %s",addr);
lh7b0674a2022-01-10 00:34:35 -08001219 if(addr==NULL)
1220 {
1221 LYERRLOG("Phone num is null!!!");
1222 return -1;
1223 }
q.huang70b76492022-06-02 14:49:02 +08001224
1225 if(find_call_id_with_addr(addr)!=INVALID_ID)
1226 {
1227 LYERRLOG("addr %s exists",addr);
1228 return LYNQ_E_CONFLICT;
1229 }
1230
1231#ifdef ECALL_SUPPORT
1232 if(lynq_ecall_is_running())
1233 {
1234 LYERRLOG("lynq_fast_ecall ecall is running");
1235 return LYNQ_E_ECALL_BEING_RUNNING;
1236 }
1237#endif
1238
lh42c1e572022-01-25 18:47:39 -08001239 client.uToken = Global_uToken_call;
lh7b0674a2022-01-10 00:34:35 -08001240 client.request = 10;//RIL_REQUEST_DIAL
1241 client.paramLen = 2;
1242 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1243 memcpy(client.param,addr,strlen(addr)+1);
1244 strcat(client.param," 0");
q.huang70b76492022-06-02 14:49:02 +08001245 lynq_call_id = addAddr(addr);
1246 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001247 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lh42c1e572022-01-25 18:47:39 -08001248 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh7b0674a2022-01-10 00:34:35 -08001249 {
1250 LYERRLOG("send request fail");
q.huang70b76492022-06-02 14:49:02 +08001251 cleanCallList(lynq_call_id);
lh7b0674a2022-01-10 00:34:35 -08001252 return -1;
1253 }
lh42c1e572022-01-25 18:47:39 -08001254 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001255 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001256 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
lh7b0674a2022-01-10 00:34:35 -08001257 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
lh7b0674a2022-01-10 00:34:35 -08001258 if(error==0)
1259 {
1260 isDial = 1;
ll72bf6c12022-03-24 10:22:25 +08001261 if(waitCallstateChange(6000)==ETIMEDOUT)//6000ms
lh7b0674a2022-01-10 00:34:35 -08001262 {
lhd1e457c2022-04-19 06:01:25 -07001263 //if timeout,this call need destroy.
1264 isDial = 0;
lh7b0674a2022-01-10 00:34:35 -08001265 error = LYNQ_E_TIME_OUT;
q.huang70b76492022-06-02 14:49:02 +08001266 LYERRLOG("lynq_call timeout:wait Call state fail!!! clear local idx %d",lynq_call_id);
1267 cleanCallList(lynq_call_id);
lh7b0674a2022-01-10 00:34:35 -08001268 return error;
1269 }
q.huang70b76492022-06-02 14:49:02 +08001270 isDial = 0;
1271 *handle = lynq_call_lists[lynq_call_id].call_id;
1272 if(*handle > 0)
1273 {
1274 LYINFLOG("lynq_call dial addr %s suc, id is %d",addr,*handle);
1275 return 0;
1276 }
1277 else
1278 {
1279 LYERRLOG("lynq_call dial addr %s fail, invalid id",addr);
1280 cleanCallList(lynq_call_id);
1281 return LYNQ_E_INVALID_ID_ANONALY;
1282 }
1283
lh7b0674a2022-01-10 00:34:35 -08001284 }
q.huang70b76492022-06-02 14:49:02 +08001285 LYERRLOG("lynq_call dial addr %s fail, service error %d",addr, error);
1286 cleanCallList(lynq_call_id);
lh7b0674a2022-01-10 00:34:35 -08001287 return error;
1288}
1289int lynq_call_answer()
1290{
ll27dbe752022-08-10 00:33:52 -07001291 if(g_lynq_call_init_flag == 0)
1292 {
1293 return -1;
1294 }
lh7b0674a2022-01-10 00:34:35 -08001295 Parcel p;
1296 lynq_client_t client;
1297 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001298 int token;
1299 int request = -1;
1300 int slot_id = -1;
lh7b0674a2022-01-10 00:34:35 -08001301 int error = -1;
lh42c1e572022-01-25 18:47:39 -08001302 client.uToken = Global_uToken_call;
lh7b0674a2022-01-10 00:34:35 -08001303 client.request = 40;//RIL_REQUEST_DIAL
1304 client.paramLen = 0;
1305 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang70b76492022-06-02 14:49:02 +08001306 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001307 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lh42c1e572022-01-25 18:47:39 -08001308 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh7b0674a2022-01-10 00:34:35 -08001309 {
1310 LYERRLOG("send request fail");
lh7b0674a2022-01-10 00:34:35 -08001311 return -1;
1312 }
lh42c1e572022-01-25 18:47:39 -08001313 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001314 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001315 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
lh7b0674a2022-01-10 00:34:35 -08001316 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1317 return error;
1318}
1319int lynq_call_hungup(int* handle)
1320{
ll27dbe752022-08-10 00:33:52 -07001321 if(g_lynq_call_init_flag == 0)
1322 {
1323 return -1;
1324 }
lh7b0674a2022-01-10 00:34:35 -08001325 Parcel p;
1326 lynq_client_t client;
1327 int resp_type = -1;
1328 int request = -1;
q.huang7de1d662022-09-13 14:19:24 +08001329 int token;
lh7b0674a2022-01-10 00:34:35 -08001330 int slot_id = -1;
1331 int error = -1;
1332 int call_id = 0;
q.huang70b76492022-06-02 14:49:02 +08001333 int lynq_call_id;
lh42c1e572022-01-25 18:47:39 -08001334 if(handle==NULL||!((*handle>=0)&&(*handle<10)))
1335 {
1336 LYERRLOG("[%s] illegal input!!!!",__FUNCTION__);
1337 return LYNQ_E_CONFLICT;
1338 }
1339 client.uToken = Global_uToken_call;
lh7b0674a2022-01-10 00:34:35 -08001340 client.request = 12;//RIL_REQUEST_HUNGUP
1341 client.paramLen = 1;
1342 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang70b76492022-06-02 14:49:02 +08001343 call_id = *handle;
lh7b0674a2022-01-10 00:34:35 -08001344 sprintf(client.param,"%d",call_id);
q.huang70b76492022-06-02 14:49:02 +08001345 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001346 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lh42c1e572022-01-25 18:47:39 -08001347 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh7b0674a2022-01-10 00:34:35 -08001348 {
1349 LYERRLOG("send request fail");
lh7b0674a2022-01-10 00:34:35 -08001350 return -1;
1351 }
lh42c1e572022-01-25 18:47:39 -08001352 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001353 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001354 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
lh7b0674a2022-01-10 00:34:35 -08001355 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1356 if(error==0)
1357 {
q.huang70b76492022-06-02 14:49:02 +08001358 lynq_call_id=find_call_id_with_call_id(call_id);
1359 if(lynq_call_id!=INVALID_ID)
1360 {
1361 cleanCallList(lynq_call_id);
1362 }
lh7b0674a2022-01-10 00:34:35 -08001363 }
1364 return error;
1365}
1366int lynq_call_hungup_all()
1367{
ll27dbe752022-08-10 00:33:52 -07001368 if(g_lynq_call_init_flag == 0)
1369 {
1370 return -1;
1371 }
lh7b0674a2022-01-10 00:34:35 -08001372 Parcel p;
1373 lynq_client_t client;
1374 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001375 int token=-1;
lh7b0674a2022-01-10 00:34:35 -08001376 int request = -1;
1377 int slot_id = -1;
1378 int error = -1;
lh42c1e572022-01-25 18:47:39 -08001379 client.uToken = Global_uToken_call;
lh7b0674a2022-01-10 00:34:35 -08001380 client.request = 17;//RIL_REQUEST_UDUB
1381 client.paramLen = 0;
1382 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang70b76492022-06-02 14:49:02 +08001383 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001384 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lh42c1e572022-01-25 18:47:39 -08001385 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh7b0674a2022-01-10 00:34:35 -08001386 {
1387 LYERRLOG("send request fail");
lh7b0674a2022-01-10 00:34:35 -08001388 return -1;
1389 }
lh42c1e572022-01-25 18:47:39 -08001390 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001391 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001392 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
lh7b0674a2022-01-10 00:34:35 -08001393 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1394 return error;
1395}
1396int lynq_wait_incoming_call(int *handle)
1397{
ll27dbe752022-08-10 00:33:52 -07001398 if(g_lynq_call_init_flag == 0)
1399 {
1400 return -1;
1401 }
lh7b0674a2022-01-10 00:34:35 -08001402 waitIncomingCall();
1403 *handle = lynqIncomingCallId;
1404 LYINFLOG("lynq incoming call id:%d",lynqIncomingCallId);
1405 return 0;
1406}
1407
1408int lynq_set_auto_answercall(const int mode)
1409{
ll27dbe752022-08-10 00:33:52 -07001410 if(g_lynq_call_init_flag == 0)
1411 {
1412 return -1;
1413 }
lh7b0674a2022-01-10 00:34:35 -08001414 global_call_auto_answer = mode;
1415 LYINFLOG("auto answer call mode =%d",mode);
1416 return 0;
1417}
q.huangec88da92022-03-29 04:17:32 -04001418int lynq_get_current_call_state(int *handle, int *call_state,int *toa,int *direction,char addr[])
1419{
ll27dbe752022-08-10 00:33:52 -07001420 if(g_lynq_call_init_flag == 0)
1421 {
1422 return -1;
1423 }
q.huangec88da92022-03-29 04:17:32 -04001424 int lynq_call_id = 0;
q.huang70b76492022-06-02 14:49:02 +08001425 LYINFLOG("lynq_get_current_call_state begin ");
q.huangec88da92022-03-29 04:17:32 -04001426 if(handle==NULL)
1427 {
q.huang70b76492022-06-02 14:49:02 +08001428 LYERRLOG("handle is NULL");
q.huangec88da92022-03-29 04:17:32 -04001429 return LYNQ_E_NULL_ANONALY;
1430 }
q.huang70b76492022-06-02 14:49:02 +08001431 lynq_call_id = find_call_id_with_call_id(*handle);
1432 if(lynq_call_id==INVALID_ID)
1433 {
1434 return LYNQ_E_INVALID_ID_ANONALY;
1435 }
q.huangec88da92022-03-29 04:17:32 -04001436 *call_state = lynq_call_lists[lynq_call_id].call_state;
1437 *toa = lynq_call_lists[lynq_call_id].toa;
1438 *direction = lynq_call_lists[lynq_call_id].direction;
1439 memcpy(addr,lynq_call_lists[lynq_call_id].addr,strlen(lynq_call_lists[lynq_call_id].addr)+1);
1440 return 0;
1441}
1442
q.huange97cfcf2022-08-29 20:04:31 +08001443int lynq_get_current_call_number()
1444{
1445 int cnt=0;
1446 int i;
1447 for(i = 0;i < LYNQ_CALL_MAX;i++)
1448 {
1449 if(lynq_call_lists[i].used !=0)
1450 {
1451 cnt++;
1452 }
1453 }
1454
1455 return cnt;
1456}
1457
q.huangec88da92022-03-29 04:17:32 -04001458/*audio begin*/
lldc99c9b2022-01-24 12:16:22 +00001459static int judge_mic(const int enable){
llf512fa32022-02-14 08:58:16 +00001460 switch(enable){
1461 case 0:
1462 return 1;
1463 case 1:
1464 return 1;
1465 default:
1466 return 0;
lldc99c9b2022-01-24 12:16:22 +00001467 }
1468}
1469
lh7b0674a2022-01-10 00:34:35 -08001470int lynq_set_mute_mic(const int enable)
lldc99c9b2022-01-24 12:16:22 +00001471{
ll27dbe752022-08-10 00:33:52 -07001472 if(g_lynq_call_init_flag == 0)
1473 {
1474 return -1;
1475 }
lldc99c9b2022-01-24 12:16:22 +00001476 if(!judge_mic(enable)){
1477 return LYNQ_E_CONFLICT;
1478 }
q.huangec88da92022-03-29 04:17:32 -04001479 return lynq_set_common_request(53,1,"%d",enable); //RIL_REQUEST_SET_MUTE
1480}
1481int lynq_get_mute_mic(int *status)
1482{
ll27dbe752022-08-10 00:33:52 -07001483 if(g_lynq_call_init_flag == 0)
1484 {
1485 return -1;
1486 }
q.huangec88da92022-03-29 04:17:32 -04001487 return lynq_get_common_request(54,status);//RIL_REQUEST_GET_MUTE
lh7b0674a2022-01-10 00:34:35 -08001488}
ll72bf6c12022-03-24 10:22:25 +08001489
1490/**
1491 * @brief Check whether DTMF is valid
1492 *
1493 * @param callnum dtmf eg:0-9 * #
1494 * @return int
1495 */
1496static int judge_dtmf(const char callnum)
1497{
1498 if(callnum == '#')
1499 {
1500 return 1;
1501 }
1502 if(callnum == '*')
1503 {
1504 return 1;
1505 }
1506 if(callnum >= '0'&& callnum <= '9')
1507 {
1508 return 1;
1509 }
1510 return 0;
1511}
1512
ll209e6112022-07-20 09:30:19 +00001513int lynq_switch_waiting_or_holding_and_active(void)
1514{
ll27dbe752022-08-10 00:33:52 -07001515 if(g_lynq_call_init_flag == 0)
1516 {
1517 return -1;
1518 }
ll209e6112022-07-20 09:30:19 +00001519 Parcel p;
1520 lynq_client_t client;
1521 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001522 int token;
ll209e6112022-07-20 09:30:19 +00001523 int request = -1;
1524 int slot_id = -1;
1525 int error = -1;
1526 client.uToken = Global_uToken_call;
1527 client.request = RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE;
1528 client.paramLen = 0;
1529 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1530 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001531 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001532 if(send_request(lynq_call_client_sockfd,&client)==-1)
1533 {
1534 LYERRLOG("send request fail");
1535 return -1;
1536 }
1537 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001538 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001539 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
ll209e6112022-07-20 09:30:19 +00001540 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1541 return error;
1542}
1543
1544int lynq_hangup_waiting_or_background(void)
1545{
ll27dbe752022-08-10 00:33:52 -07001546 if(g_lynq_call_init_flag == 0)
1547 {
1548 return -1;
1549 }
ll209e6112022-07-20 09:30:19 +00001550 Parcel p;
1551 lynq_client_t client;
1552 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001553 int token;
ll209e6112022-07-20 09:30:19 +00001554 int request = -1;
1555 int slot_id = -1;
1556 int error = -1;
1557 client.uToken = Global_uToken_call;
1558 client.request = RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND;
1559 client.paramLen = 0;
1560 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1561 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001562 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001563 if(send_request(lynq_call_client_sockfd,&client)==-1)
1564 {
1565 LYERRLOG("send request fail");
1566 return -1;
1567 }
1568 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001569 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001570 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
ll209e6112022-07-20 09:30:19 +00001571 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1572 return error;
1573}
1574
1575int lynq_hangup_foreground_resume_background(void)
1576{
ll27dbe752022-08-10 00:33:52 -07001577 if(g_lynq_call_init_flag == 0)
1578 {
1579 return -1;
1580 }
ll209e6112022-07-20 09:30:19 +00001581 Parcel p;
1582 lynq_client_t client;
1583 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001584 int token;
ll209e6112022-07-20 09:30:19 +00001585 int request = -1;
1586 int slot_id = -1;
1587 int error = -1;
1588 client.uToken = Global_uToken_call;
1589 client.request = RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND;
1590 client.paramLen = 0;
1591 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1592 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001593 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001594 if(send_request(lynq_call_client_sockfd,&client)==-1)
1595 {
1596 LYERRLOG("send request fail");
1597 return -1;
1598 }
1599 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001600 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001601 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
ll209e6112022-07-20 09:30:19 +00001602 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1603 return error;
1604}
1605
lh7b0674a2022-01-10 00:34:35 -08001606int lynq_set_DTMF(const char callnum)
1607{
ll27dbe752022-08-10 00:33:52 -07001608 if(g_lynq_call_init_flag == 0)
1609 {
1610 return -1;
1611 }
ll72bf6c12022-03-24 10:22:25 +08001612 if(!judge_dtmf(callnum))
1613 {
1614 return LYNQ_E_CONFLICT;
1615 }
lh7b0674a2022-01-10 00:34:35 -08001616 if(!lynq_call_state)
1617 {
1618 LYERRLOG("LYNQ_E_CONFLICT");
1619 return LYNQ_E_CONFLICT;
1620 }
q.huangec88da92022-03-29 04:17:32 -04001621 return lynq_set_common_request(24,1,"%c",callnum); //RIL_REQUEST_DTMF
lh7b0674a2022-01-10 00:34:35 -08001622}
q.huangec88da92022-03-29 04:17:32 -04001623static int judge_volume(LYNQ_E_VOLUMN_SET set,const int volume){
1624 if(set==LYNQ_E_VOLUMN_SET_DTMF){
1625 if(volume < 0 ||volume >36){
1626 return 0;
1627 }
1628 }
1629 else if (set==LYNQ_E_VOLUMN_SET_SPEECH)
1630 {
1631 if(volume < 1 ||volume >7){
1632 return 0;
1633 }
lldc99c9b2022-01-24 12:16:22 +00001634 }
ll04ae4142022-01-27 05:54:38 +00001635 return 1;
lldc99c9b2022-01-24 12:16:22 +00001636}
lh7b0674a2022-01-10 00:34:35 -08001637int lynq_set_DTMF_volume(const int volume)
lldc99c9b2022-01-24 12:16:22 +00001638{
q.huangec88da92022-03-29 04:17:32 -04001639 if(!judge_volume(LYNQ_E_VOLUMN_SET_DTMF,volume)){
lldc99c9b2022-01-24 12:16:22 +00001640 return LYNQ_E_CONFLICT;
1641 }
q.huangec88da92022-03-29 04:17:32 -04001642 return lynq_set_common_request(8003,1,"%d",volume);//LYNQ_REQUEST_SET_DTMF_VOLUME
lh7b0674a2022-01-10 00:34:35 -08001643}
q.huangb212fde2022-04-05 23:11:02 -04001644int lynq_set_speech_volume(const int volume)//mixer_set_volume
lh7b0674a2022-01-10 00:34:35 -08001645{
q.huangec88da92022-03-29 04:17:32 -04001646 if(!judge_volume(LYNQ_E_VOLUMN_SET_SPEECH,volume))
lh7b0674a2022-01-10 00:34:35 -08001647 {
q.huangec88da92022-03-29 04:17:32 -04001648 return LYNQ_E_CONFLICT;
lh7b0674a2022-01-10 00:34:35 -08001649 }
q.huangec88da92022-03-29 04:17:32 -04001650 return lynq_set_common_request(8009,1,"%d",volume); //LYNQ_REQUEST_SET_SPEECH_VOLUME
lh7b0674a2022-01-10 00:34:35 -08001651}
q.huangec88da92022-03-29 04:17:32 -04001652int lynq_get_speech_volume(int* volumn)//mixer_get_volume
1653{
1654 return lynq_get_common_request(8010,volumn);//LYNQ_REQUEST_GET_SPEECH_VOLUME
1655}
q.huangb212fde2022-04-05 23:11:02 -04001656int lynq_incall_record_start(const char* file_path)
q.huangec88da92022-03-29 04:17:32 -04001657{
q.huang70b76492022-06-02 14:49:02 +08001658 return lynq_set_common_request(8011,2,"%s %s","1",file_path); //LYNQ_REQUEST_RECORD
q.huangec88da92022-03-29 04:17:32 -04001659}
1660int lynq_incall_record_stop()
1661{
q.huangb212fde2022-04-05 23:11:02 -04001662 const char* unused_file="just_ocuupy_paramter_postion";
1663 return lynq_set_common_request(8011,2,"%s %s","0",unused_file); //LYNQ_REQUEST_RECORD
q.huangec88da92022-03-29 04:17:32 -04001664}
1665/*audio end*/
q.huang714145d2022-04-18 00:09:50 -04001666
1667#ifdef ECALL_SUPPORT
1668LYNQ_ECall_Variant lynq_get_lynq_ecall_variant_from_lynq_type(LYNQ_ECall_Type type)
1669{
1670 switch(type)
1671 {
1672 case LYNQ_ECALL_TYPE_TEST:
1673 return LYNQ_ECALL_TEST;
1674 case LYNQ_ECALL_TYPE_RECONFIG:
1675 return LYNQ_ECALL_RECONFIG;
1676 default:
1677 return LYNQ_ECALL_EMERGENCY;
1678 }
1679}
1680
1681RIL_ECall_Variant lynq_get_ril_ecall_variant_from_lynq_variant(LYNQ_ECall_Variant type)
1682{
1683 switch(type)
1684 {
1685 case LYNQ_ECALL_TEST:
1686 return ECALL_TEST;
1687 case LYNQ_ECALL_RECONFIG:
1688 return ECALL_RECONFIG;
1689 default:
1690 return ECALL_EMERGENCY;
1691 }
1692}
1693
1694RIL_ECall_Category lynq_get_ril_ecall_cat_from_lynq_cat(LYNQ_ECall_Category cat)
1695{
1696 switch(cat)
1697 {
1698 case LYNQ_EMER_CAT_MANUAL_ECALL:
1699 return EMER_CAT_MANUAL_ECALL;
1700 default:
1701 return EMER_CAT_AUTO_ECALL;
1702 }
1703}
1704
1705
1706int lynq_set_test_num(LYNQ_ECall_Set_Type type, const char *test_num, int test_num_length)
1707{
1708 int error;
1709
1710 if(test_num==NULL || test_num_length > LYNQ_PHONE_NUMBER_MAX )
1711 {
q.huang70b76492022-06-02 14:49:02 +08001712 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 -04001713 return -1;
1714 }
1715
1716 error=lynq_set_common_request(RIL_REQUEST_ECALL_SET_TEST_NUM,2,"%d %s",type,test_num);
1717
1718 if(error==0)
1719 {
1720 snprintf(e_call_addr[LYNQ_ECALL_TEST],LYNQ_PHONE_NUMBER_MAX,"%s",test_num);
1721 }
1722
1723 return error;
1724}
1725
q.huange97cfcf2022-08-29 20:04:31 +08001726int lynq_ecall_can_be_preempted(LYNQ_ECall_Variant old_variant,LYNQ_ECall_Variant new_variant)
1727{
1728 int ret;
1729
1730 if(old_variant == LYNQ_ECALL_EMERGENCY)
1731 {
1732 return false;
1733 }
1734 else if(new_variant == LYNQ_ECALL_EMERGENCY)
1735 {
1736 return true;
1737 }
1738 else if(old_variant==LYNQ_ECALL_DAILING_STATE_NONE)
1739 {
1740 return true;
1741 }
1742 else
1743 {
1744 ret = (g_ecall_whether_preempt & 0x01);
1745 }
1746 LYINFLOG("ecall clear conflict call, lynq_ecall_can_be_preempted is true");
1747 return ret;
1748}
1749
1750int lynq_clear_current_call()
1751{
1752 int cnt;
1753 if(lynq_call_hungup_all()!=0)
1754 {
1755 LYERRLOG("ecall clear conflict call, hangup all failure");
1756 return -1;
1757 }
1758 cnt=0;
1759 while(lynq_get_current_call_number()!=0 && cnt<80)
1760 {
1761 lynqRespWatingEvent();
1762 usleep(200 * 1000);//200ms
1763 cnt++;
1764 }
1765 if(lynq_get_current_call_number()!=0)
1766 {
1767 LYERRLOG("ecall clear conflict call, current call list can't cleared after 15s");
1768 return -2;
1769 }
1770
1771 LYINFLOG("ecall clear conflict call, after %d 0.2s, call list is cleared", cnt);
1772 return 0;
1773}
1774
1775int lynq_clear_current_conflict_call(LYNQ_ECall_Variant old_variant,LYNQ_ECall_Variant new_variant)
1776{
1777 int cnt;
1778 int ret;
1779
1780 if(lynq_ecall_is_running()==false)
1781 {
1782 if(lynq_get_current_call_number()==0)
1783 {
1784 LYINFLOG("ecall clear conflict call, no conflict ecall and normal call");
1785 }
1786 else if(g_ecall_whether_preempt & 0x02)
1787 {
1788 ret=lynq_clear_current_call();
1789 LYERRLOG("ecall clear conflict call, relase current normal call ret is %d",ret);
1790 }
1791 return 0;
1792 }
1793
1794 LYINFLOG("ecall clear conflict call, two ecall occure at the same time, new is %d, old is %d, g_preempt is %d",new_variant,old_variant,g_ecall_whether_preempt);
1795
1796 if(lynq_ecall_can_be_preempted(old_variant,new_variant)==false)
1797 {
1798 LYERRLOG("ecall clear conflict call, new ecall %d can't preempt old ecall %d",new_variant,old_variant);
1799 return -1;
1800 }
1801
1802 ret=lynq_clear_current_call();
1803 LYINFLOG("ecall clear conflict call, relase current call(including ecall) ret is %d",ret);
1804
1805 if(is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)
1806 {
1807 sendSignalToWaitCallStateChange();
1808 LYINFLOG("ecall clear conflict call, stop ecall in dailing status");
1809 }
1810
1811 cnt=0;
1812 while(lynq_ecall_is_running() && cnt<80)
1813 {
1814 usleep(200 * 1000);//200ms
1815 cnt++;
1816 }
1817
1818 if(lynq_ecall_is_running())
1819 {
1820 LYERRLOG("ecall clear conflict call, after 16s, lynq ecall is still running");
1821 }
1822 else
1823 {
1824 LYINFLOG("ecall clear conflict call, after %d 0.2s, ecall info is cleared", cnt);
1825 }
1826
1827 sleep(3);// for ecall disconnect
1828 print_ecall_info();
1829 return 0;
1830}
1831
q.huang633b9af2022-05-10 20:37:21 +08001832int 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 -04001833{
q.huang70b76492022-06-02 14:49:02 +08001834 int error;
q.huang714145d2022-04-18 00:09:50 -04001835 RIL_ECall_Variant ril_ecall_variant = lynq_get_ril_ecall_variant_from_lynq_variant (lynq_ecall_variant);
q.huang52473032022-04-19 05:20:12 -04001836 RIL_ECall_Category ril_ecall_cat = lynq_get_ril_ecall_cat_from_lynq_cat(lynq_ecall_cat);
q.huang497c9772022-05-11 20:10:38 +08001837 char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};
q.huange97cfcf2022-08-29 20:04:31 +08001838 unsigned int i;
1839
1840 if(msd_length > MSD_MAX_LENGTH || msd_length <=0 || lynq_ecall_variant >=LYNQ_ECALL_MO_MAX)
q.huang633b9af2022-05-10 20:37:21 +08001841 {
q.huange97cfcf2022-08-29 20:04:31 +08001842 LYERRLOG("lynq_fast_ecall msd_length %d or ecall variant %d parameter error",msd_length,lynq_ecall_variant);
q.huang70b76492022-06-02 14:49:02 +08001843 return LYNQ_E_ECALL_MSD_LENGTH_ERROR;
q.huange97cfcf2022-08-29 20:04:31 +08001844 }
1845
1846 if(lynq_clear_current_conflict_call(g_lynqEcallVariant,lynq_ecall_variant)!=0)
1847 {
1848 LYERRLOG("%s call lynq_clear_current_conflict_call false, old is %d, new is %d",__func__,g_lynqEcallVariant,lynq_ecall_variant);
1849 return LYNQ_E_ECALL_BEING_RUNNING;
1850 }
1851
1852 pthread_mutex_lock(&s_ecall_variable_mutex);
1853 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_STARTED;
1854 g_lynqEcallVariant = lynq_ecall_variant;
1855 g_ecallId = INVALID_ID;
1856 pthread_mutex_unlock(&s_ecall_variable_mutex);
q.huang633b9af2022-05-10 20:37:21 +08001857
q.huang497c9772022-05-11 20:10:38 +08001858 for(i =0; i<msd_length;i++)
q.huang633b9af2022-05-10 20:37:21 +08001859 {
q.huang497c9772022-05-11 20:10:38 +08001860 sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);
q.huang633b9af2022-05-10 20:37:21 +08001861 }
1862
q.huang8b33ed52022-04-19 20:27:44 -04001863
q.huang70b76492022-06-02 14:49:02 +08001864 LYINFLOG("lynq_fast_ecall addr is %s",e_call_addr[lynq_ecall_variant]);
q.huang8b33ed52022-04-19 20:27:44 -04001865
q.huang633b9af2022-05-10 20:37:21 +08001866 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 -04001867
1868 if(error==0)
q.huang70b76492022-06-02 14:49:02 +08001869 {
q.huang33ec0562022-07-01 11:38:26 +08001870 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 -04001871 {
q.huange97cfcf2022-08-29 20:04:31 +08001872 pthread_mutex_lock(&s_ecall_variable_mutex);
1873 LYERRLOG("lynq_fast_ecall timeout:wait Call state time out!!!");
1874 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
1875 lynqRespWatingEvent();
1876 pthread_mutex_unlock(&s_ecall_variable_mutex);
q.huang70b76492022-06-02 14:49:02 +08001877 return LYNQ_E_TIME_OUT;
q.huang714145d2022-04-18 00:09:50 -04001878 }
q.huange97cfcf2022-08-29 20:04:31 +08001879 pthread_mutex_lock(&s_ecall_variable_mutex);
q.huangce82b972022-06-21 14:57:02 +08001880 if(is_ecall_dial == LYNQ_ECALL_DAILING_STATE_STARTED)
1881 {
1882 /*just dail, no recv answer*/
1883 LYERRLOG("lynq_fast_ecall, no answer!");
1884 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
q.huange97cfcf2022-08-29 20:04:31 +08001885 lynqRespWatingEvent();
1886 pthread_mutex_unlock(&s_ecall_variable_mutex);
q.huangce82b972022-06-21 14:57:02 +08001887 return LYNQ_E_ECALL_DAILING_NO_ANSWER;
1888 }
1889
1890 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
q.huang70b76492022-06-02 14:49:02 +08001891 lynqRespWatingEvent();
q.huang8b33ed52022-04-19 20:27:44 -04001892
q.huang70b76492022-06-02 14:49:02 +08001893 if(g_ecallId != INVALID_ID)
1894 {
1895 *handle=g_ecallId;
1896 LYINFLOG("lynq_fast_ecall id is %d",g_ecallId);
q.huange97cfcf2022-08-29 20:04:31 +08001897 pthread_mutex_unlock(&s_ecall_variable_mutex);
q.huang70b76492022-06-02 14:49:02 +08001898 return 0;
1899 }
q.huange97cfcf2022-08-29 20:04:31 +08001900
1901 LYERRLOG("lynq_fast_ecall service return fail");
1902 pthread_mutex_unlock(&s_ecall_variable_mutex);
1903 return LYNQ_E_INVALID_ID_ANONALY;
q.huang714145d2022-04-18 00:09:50 -04001904 }
1905
q.huange97cfcf2022-08-29 20:04:31 +08001906 pthread_mutex_lock(&s_ecall_variable_mutex);
1907 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
1908 g_lynqEcallVariant = LYNQ_ECALL_VAR_NONE;
1909 g_ecallId = INVALID_ID;
1910 pthread_mutex_unlock(&s_ecall_variable_mutex);
1911
q.huang714145d2022-04-18 00:09:50 -04001912 return error;
1913}
1914
1915int lynq_set_psap(int enable)
1916{
1917 return lynq_set_common_request(RIL_REQUEST_ECALL_SET_PSAP,1,"%d",enable);
1918}
1919
1920int lynq_psap_pull_msd()
1921{
1922 return lynq_set_common_request(RIL_REQUEST_ECALL_PSAP_PULL_MSD,0,"");
1923}
1924
1925int lynq_make_ecall(int* handle, LYNQ_ECall_Type type)
1926{
1927 LYNQ_ECall_Variant lynq_ecall_variant;
1928 int error = -1;
1929 int lynq_call_id = -1;
1930
1931 if(handle==NULL)
1932 {
q.huang70b76492022-06-02 14:49:02 +08001933 LYERRLOG("handle is NULL, parameter error ");
q.huang714145d2022-04-18 00:09:50 -04001934 return -1;
1935 }
1936
1937 error=lynq_set_common_request(RIL_REQUEST_ECALL_MAKE_ECALL,1,"%d",type);
1938
1939 if(error==0)
1940 {
1941 lynq_ecall_variant=lynq_get_lynq_ecall_variant_from_lynq_type(type);
1942
q.huang70b76492022-06-02 14:49:02 +08001943 lynq_call_id = addAddr(e_call_addr[lynq_ecall_variant]);
q.huang714145d2022-04-18 00:09:50 -04001944 isDial = 1;
1945 if(waitCallstateChange(10000)==ETIMEDOUT)//10000ms
1946 {
1947 error = LYNQ_E_TIME_OUT;
1948 LYERRLOG("timeout:wait Call state fail!!!");
q.huang714145d2022-04-18 00:09:50 -04001949 return error;
1950 }
1951
1952 *handle = lynq_call_id;
1953 }
1954
1955 return error;
1956}
1957
1958
q.huang8f0978b2022-05-10 20:49:46 +08001959int lynq_set_msd(int* handle, const unsigned char *msd_data, int msd_length)
q.huang714145d2022-04-18 00:09:50 -04001960{
q.huang497c9772022-05-11 20:10:38 +08001961 char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};
1962 unsigned int i;
1963
q.huange97cfcf2022-08-29 20:04:31 +08001964 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 -04001965 {
q.huang70b76492022-06-02 14:49:02 +08001966 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 +08001967 return -1;
1968 }
q.huang8f0978b2022-05-10 20:49:46 +08001969
q.huang497c9772022-05-11 20:10:38 +08001970 for(i=0; i<msd_length;i++)
q.huang8f0978b2022-05-10 20:49:46 +08001971 {
q.huang497c9772022-05-11 20:10:38 +08001972 sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);
q.huang70b76492022-06-02 14:49:02 +08001973 }
1974
1975 LYINFLOG("lynq_set_msd ");
q.huang714145d2022-04-18 00:09:50 -04001976
q.huange97cfcf2022-08-29 20:04:31 +08001977 return lynq_set_common_request(RIL_REQUEST_ECALL_SET_MSD,2,"%d %s",*handle,lynq_msd_data);
q.huang714145d2022-04-18 00:09:50 -04001978}
1979
1980int lynq_set_ivs(int enable)
1981{
q.huange97cfcf2022-08-29 20:04:31 +08001982#ifdef ECALL_SUPPORT
q.huang70b76492022-06-02 14:49:02 +08001983 if(enable<0)
1984 {
q.huange97cfcf2022-08-29 20:04:31 +08001985 if(enable >-100)
1986 {
1987 lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);
1988 }
1989 else if(enable== -1000)
1990 {
1991 print_ecall_info();
1992 }
1993 else
1994 {
1995 g_ecall_whether_preempt= ((-100-enable) & 0x11);
1996 }
q.huang70b76492022-06-02 14:49:02 +08001997 return 0;
1998 }
q.huange97cfcf2022-08-29 20:04:31 +08001999#endif
q.huang70b76492022-06-02 14:49:02 +08002000
2001 return lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);
q.huang714145d2022-04-18 00:09:50 -04002002}
2003
2004int lynq_reset_ivs()
2005{
2006 return lynq_set_common_request(RIL_REQUEST_ECALL_RESET_IVS,0,"");
2007}
2008
2009int lynq_ivs_push_msd()
2010{
2011 return lynq_set_common_request(RIL_REQUEST_ECALL_IVS_PUSH_MSD,0,"");
2012}
q.huang8b33ed52022-04-19 20:27:44 -04002013
2014int wait_ecall_event()
2015{
2016 int ret = 0;
2017 pthread_mutex_lock(&s_incoming_e_call_mutex);
2018 ret = pthread_cond_wait(&s_incoming_e_call_cond,&s_incoming_e_call_mutex);
q.huang70b76492022-06-02 14:49:02 +08002019 pthread_mutex_unlock(&s_incoming_e_call_mutex);
q.huang8b33ed52022-04-19 20:27:44 -04002020 return ret;
2021}
2022
q.huang476aae62022-06-30 19:39:20 +08002023int lynq_wait_ecall_indication(int* handle, LYNQ_ECall_Indication *eCall_Indication)
q.huang8b33ed52022-04-19 20:27:44 -04002024{
2025 wait_ecall_event();
q.huang476aae62022-06-30 19:39:20 +08002026 *handle = g_lynqIncomingEcallId;
q.huangce82b972022-06-21 14:57:02 +08002027 *eCall_Indication = g_lynqIncomingEcallIndication;
q.huang476aae62022-06-30 19:39:20 +08002028 LYINFLOG("lynq_wait_ecall_indication handle %d, Ind id: %d", *handle, *eCall_Indication);
q.huang8b33ed52022-04-19 20:27:44 -04002029 return 0;
2030}
2031
q.huang714145d2022-04-18 00:09:50 -04002032#endif
2033
q.huang5ca6c072022-06-06 16:15:31 +08002034/*Audio Path setting begin*/
q.huangcb7b7292022-06-28 20:12:01 +08002035/*sub function*/
2036void lynq_set_rtp_mixer_ctrl(int enable_rtp)
2037{
2038 char cmd[256];
2039 LYINFLOG("set_rtp_mixer_ctrl %d", enable_rtp);
2040 if(enable_rtp)
2041 {
2042 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 0);
2043 system(cmd);
2044 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 1);
2045 system(cmd);
2046 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 1);
2047 system(cmd);
2048 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH2 DL2_CH2\" %d", 1);
2049 system(cmd);
2050 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH1 PCM_2_CAP_CH1\" %d", 1);
2051 system(cmd);
2052 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 1);
2053 system(cmd);
2054 }
2055 else
2056 {
2057 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 1);
2058 system(cmd);
2059 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 0);
2060 system(cmd);
2061 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 0);
2062 system(cmd);
2063 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH2 DL2_CH2\" %d", 0);
2064 system(cmd);
2065 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH1 PCM_2_CAP_CH1\" %d", 0);
2066 system(cmd);
2067 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 0);
2068 system(cmd);
2069 }
2070}
2071
2072void* lynq_start_rtp_cmd(void *arg)
2073{
ll27dbe752022-08-10 00:33:52 -07002074 if(g_lynq_call_init_flag == 0)
2075 {
2076 return -1;
2077 }
q.huangcb7b7292022-06-28 20:12:01 +08002078 int* rtp_mode= (int*) arg;
2079 char cmd[384];
2080 LYINFLOG("lynq_start_rtp_cmd: rtp_mode is %d",(*rtp_mode));
2081 if ((*rtp_mode) == RTP_CLIENT)
2082 {
2083 sprintf(cmd,RTP_FROM_CMD, \
2084 g_rtp_client_info.port,g_rtp_client_info.clockrate,g_rtp_client_info.channels, \
2085 g_rtp_client_info.latency);
q.huange97cfcf2022-08-29 20:04:31 +08002086 // LYINFLOG("start from rtp play: cmd is %s",cmd);
q.huangcb7b7292022-06-28 20:12:01 +08002087 system(cmd);
2088 }
2089 else if ((*rtp_mode) == RTP_SERVER)
2090 {
2091 sprintf(cmd,RTP_TO_CMD, \
2092 g_rtp_server_info.ip,g_rtp_server_info.port);
q.huange97cfcf2022-08-29 20:04:31 +08002093 // LYINFLOG("start to rtp play: cmd is %s",cmd);
q.huangcb7b7292022-06-28 20:12:01 +08002094 system(cmd);
2095 }
2096 return NULL;
2097}
2098
2099int lynq_start_rtp_thread(int rtp_mode)
2100{
2101 int ret;
2102 pthread_attr_t attr;
2103 static int start_mode[RTP_MODE_MAX]={0,1};
2104
2105 pthread_attr_init(&attr);
2106 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
2107 ret = pthread_create(&(g_rtp_thread[rtp_mode]),&attr,lynq_start_rtp_cmd,&(start_mode[rtp_mode]));
2108 if(ret != 0)
2109 {
2110 g_rtp_thread_valid[rtp_mode]=0;
2111 LYERRLOG("rtp create %d pthread error, ret is %d",rtp_mode, ret);
2112 return ret;
2113 }
2114 g_rtp_thread_valid[rtp_mode]=1;
2115 return 0;
2116}
2117
q.huang5ca6c072022-06-06 16:15:31 +08002118/*set*/
2119int lynq_set_voice_audio_mode(const LYNQ_Audio_Mode audio_mode)
2120{
ll27dbe752022-08-10 00:33:52 -07002121 if(g_lynq_call_init_flag == 0)
2122 {
2123 return -1;
2124 }
q.huangcb7b7292022-06-28 20:12:01 +08002125 int ret;
2126 int i;
2127
2128 if(audio_mode==AUDIO_MODE_RTP)
2129 {
2130 lynq_set_rtp_mixer_ctrl(1);
2131 for(i=0;i<RTP_MODE_MAX;i++)
2132 {
2133 if(!g_rtp_thread_valid[i])
2134 {
2135 if(lynq_start_rtp_thread(i)!= 0)
2136 {
2137 LYERRLOG("start rtp %d fail",i);
2138 break;
2139 }
2140 else
2141 {
2142 LYINFLOG("start rtp %d suc",i);
2143 }
2144 }
2145 else
2146 {
2147 LYERRLOG("rtp %d needn't start",i);
2148 }
2149 }
2150 if(i!= RTP_MODE_MAX)
2151 {
2152 LYERRLOG("start rtp whole fail");
2153 lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);
2154 return 1;
2155 }
2156 LYINFLOG("start rtp whole suc");
2157 return 0;
2158 }
2159 else if(audio_mode==AUDIO_MODE_CODEC)
2160 {
2161 for(i=0;i<RTP_MODE_MAX;i++)
2162 {
2163 if(g_rtp_thread_valid[i])
2164 {
2165 ret = pthread_cancel(g_rtp_thread[i]);
2166 LYINFLOG("pthread cancel rtp %d ret = %d",i,ret);
2167 ret = pthread_join(g_rtp_thread[i],NULL);
2168 LYINFLOG("pthread join rtp %d ret = %d",i,ret);
2169 g_rtp_thread_valid[i] = 0;
2170 }
2171 else
2172 {
2173 LYINFLOG("rtp %d needn't stop",i);
2174 }
2175 }
2176 lynq_set_rtp_mixer_ctrl(0);
2177 LYINFLOG("stop rtp suc");
2178 }
2179 return 0;
q.huang5ca6c072022-06-06 16:15:31 +08002180}
q.huangcb7b7292022-06-28 20:12:01 +08002181int lynq_set_remote_rtp_ip(const char* ip, const int ip_length)
q.huang5ca6c072022-06-06 16:15:31 +08002182{
q.huangcb7b7292022-06-28 20:12:01 +08002183 if (NULL == ip)
2184 {
2185 LYERRLOG("ip is NULL!!!");
2186 return -1;
2187 }
2188 if ((ip_length < strlen(ip)+1) || (ip_length > MAX_IP_LENGTH))
2189 {
2190 LYERRLOG("incoming ip length error %d", ip_length);
2191 return -1;
2192 }
2193
2194 bzero(g_rtp_server_info.ip,MAX_IP_LENGTH);
2195 strcpy(g_rtp_server_info.ip,ip);
2196
2197 LYINFLOG("lynq_set_remote_rtp_ip suc: ip is %s, length is %d", ip,ip_length);
2198
q.huang5ca6c072022-06-06 16:15:31 +08002199 return 0;
2200}
q.huang2d5b28c2022-06-06 20:23:15 +08002201int lynq_set_rtp_port(const LYNQ_Rtp_Mode rtp_mode, const int port)
q.huang5ca6c072022-06-06 16:15:31 +08002202{
q.huangcb7b7292022-06-28 20:12:01 +08002203 if (port < 0)
2204 {
2205 LYERRLOG("invalid port number %d", port);
2206 return -1;
2207 }
2208 if (rtp_mode == 0)
2209 {
2210 g_rtp_client_info.port = port;
2211 }
2212 else if (rtp_mode == 1)
2213 {
2214 g_rtp_server_info.port = port;
2215 }
2216 LYINFLOG("lynq_set_rtp_port suc: LYNQ_Rtp_Mode is %d, port is %d", rtp_mode, port);
q.huang5ca6c072022-06-06 16:15:31 +08002217 return 0;
2218}
2219int lynq_set_rtp_param(const int clock_rate,const int channels,const int latency) //only for client mode
2220{
q.huangcb7b7292022-06-28 20:12:01 +08002221 g_rtp_client_info.clockrate = clock_rate;
2222 g_rtp_client_info.channels = channels;
2223 g_rtp_client_info.latency = latency;
2224 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 +08002225 return 0;
2226}
2227/*get*/
2228LYNQ_Audio_Mode lynq_get_voice_audio_mode()
2229{
ll27dbe752022-08-10 00:33:52 -07002230 if(g_lynq_call_init_flag == 0)
2231 {
2232 return -1;
2233 }
q.huangcb7b7292022-06-28 20:12:01 +08002234 if(g_rtp_thread_valid[0])
2235 {
2236 return AUDIO_MODE_RTP;
2237 }
2238 else
2239 {
2240 return AUDIO_MODE_CODEC;
2241 }
q.huang5ca6c072022-06-06 16:15:31 +08002242}
q.huangcb7b7292022-06-28 20:12:01 +08002243int lynq_get_remote_rtp_ip(char* ip, const int ip_length)
q.huang5ca6c072022-06-06 16:15:31 +08002244{
ll27dbe752022-08-10 00:33:52 -07002245 if(g_lynq_call_init_flag == 0)
2246 {
2247 return -1;
2248 }
q.huang5ca6c072022-06-06 16:15:31 +08002249 if(ip==NULL)
2250 {
q.huangcb7b7292022-06-28 20:12:01 +08002251 LYERRLOG("ip is NULL");
q.huang5ca6c072022-06-06 16:15:31 +08002252 return 1;
2253 }
q.huangcb7b7292022-06-28 20:12:01 +08002254
2255 if(ip_length < strlen(g_rtp_server_info.ip)+1)
2256 {
2257 LYERRLOG("ip lenght %d is shorter than saved ip length %d",ip_length,strlen(g_rtp_server_info.ip)+1);
2258 return 1;
2259 }
2260 bzero(ip,ip_length);
2261 strcpy(ip,g_rtp_server_info.ip);
q.huang5ca6c072022-06-06 16:15:31 +08002262 return 0;
2263}
2264int lynq_get_rtp_port(const LYNQ_Rtp_Mode rtp_mode, int* port)
2265{
ll27dbe752022-08-10 00:33:52 -07002266 if(g_lynq_call_init_flag == 0)
2267 {
2268 return -1;
2269 }
q.huang5ca6c072022-06-06 16:15:31 +08002270 if(port==NULL)
2271 {
2272 return 1;
q.huangcb7b7292022-06-28 20:12:01 +08002273 }
2274 if (rtp_mode == 0)
2275 {
2276 *port = g_rtp_client_info.port;
2277 }
2278 else if (rtp_mode == 1)
2279 {
2280 *port = g_rtp_server_info.port;
2281 }
q.huang5ca6c072022-06-06 16:15:31 +08002282 return 0;
2283}
2284int lynq_get_rtp_param(int* clock_rate, int* channels, int* latency)//only for client mode
2285{
ll27dbe752022-08-10 00:33:52 -07002286 if(g_lynq_call_init_flag == 0)
2287 {
2288 return -1;
2289 }
q.huang5ca6c072022-06-06 16:15:31 +08002290 if(clock_rate == NULL || channels ==NULL || latency ==NULL)
2291 {
q.huangcb7b7292022-06-28 20:12:01 +08002292 LYERRLOG("input parameter is NULL");
q.huang5ca6c072022-06-06 16:15:31 +08002293 return 1;
2294 }
2295
q.huangcb7b7292022-06-28 20:12:01 +08002296 *clock_rate = g_rtp_client_info.clockrate;
2297 *channels = g_rtp_client_info.channels ;
2298 *latency = g_rtp_client_info.latency;
2299
q.huang5ca6c072022-06-06 16:15:31 +08002300 return 0;
2301}
2302/*Audio Path setting end*/
2303
lh7b0674a2022-01-10 00:34:35 -08002304#if 0
2305int main(int argc,char **argv)
2306{
2307 int n = 0;
2308 n = lynq_init_call(lynq_call_state_change_test,2222);
2309 if(n<0)
2310 {
q.huang70b76492022-06-02 14:49:02 +08002311 LYDBGLOG("lynq init call fail!!!");
lh7b0674a2022-01-10 00:34:35 -08002312 return -1;
2313 }
q.huang70b76492022-06-02 14:49:02 +08002314 LYDBGLOG("lynq call init success!!!");
lh7b0674a2022-01-10 00:34:35 -08002315 char phoneNum[LYNQ_PHONE_NUMBER_MAX];
2316 sprintf(phoneNum,"18180053406 0",strlen("18180053406 0")+1);
2317 lynq_call(phoneNum);
2318 while(1)
2319 {
2320 sleep(1);
2321 }
2322 return 0;
2323}
2324#endif
2325/*Warren add for T800 platform 2021/11/19 end*/