blob: 2b575332478a817bdf6c287d53f5741f127de93b [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"
q.huang52921662022-10-20 15:25:45 +080021#include "lynq_module_common.h"
22#include "lynq_module_socket.h"
23#include "lynq_call_common.h"
q.huang714145d2022-04-18 00:09:50 -040024
q.huang52921662022-10-20 15:25:45 +080025#define CALL_OFF (0)
26#define CALL_ON (1)
lh7b0674a2022-01-10 00:34:35 -080027#define USER_LOG_TAG "LYNQ_CALL"
28
lh3b6f7ea2023-11-08 01:16:42 -080029#define AP_SPEECH "/tmp/ap_speech"
30#define AUDIO_CTRL_SER "/tmp/audio_ctrl_service"
31#define LIBMODEM_AFE "/tmp/libmodem-afe-ctrl"
32#define TELE_DEMO_LOCK "/tmp/tel_demo_single_proc.lock"
33
lh7b0674a2022-01-10 00:34:35 -080034using ::android::Parcel;
q.huang52921662022-10-20 15:25:45 +080035
36/**
37 * @brief mark call initialization state
38 * 0: deinit state
39 * 1: init state
40 */
41int g_module_init_flag = 0;
42
lh7b0674a2022-01-10 00:34:35 -080043 typedef enum {
44 LYNQ_CALL_ACTIVE = 0,
45 LYNQ_CALL_HOLDING = 1,
46 LYNQ_CALL_DIALING = 2, /* MO call only */
47 LYNQ_CALL_ALERTING = 3, /* MO call only */
48 LYNQ_CALL_INCOMING = 4, /* MT call only */
lhe45b7002022-04-26 00:45:44 -070049 LYNQ_CALL_WAITING = 5, /* MT call only */
50 /*warren add for T800 platform 2022/04/26 start*/
51 LYNQ_CALL_END = 6, /*CALL END*/
52 /*warren add for T800 platform 2022/04/26 end*/
lh7b0674a2022-01-10 00:34:35 -080053}lynq_call_state_t;
54
lh7b0674a2022-01-10 00:34:35 -080055typedef struct
56{
57 int used;
58 int call_id;
59 int call_state;
60 int toa;
61 int direction;/*0: MO call,1:MT call*/
62 char addr[LYNQ_PHONE_NUMBER_MAX];
lh7b0674a2022-01-10 00:34:35 -080063}lynq_call_list_e_t;
64typedef struct
65{
66 int call_id;
67 int call_state;
68 int toa;
69 int direction;/*0: MO call,1:MT call*/
70 char addr[LYNQ_PHONE_NUMBER_MAX];
71}lynq_call_list_t;
72
q.huang52921662022-10-20 15:25:45 +080073static lynq_call_list_e_t s_call_lists[LYNQ_CALL_MAX]={};
74static bool s_call_list_loop = 0;
75static pthread_t s_call_list_loop_tid = -1;
76static pthread_mutex_t s_notice_get_call_list_mutex = PTHREAD_MUTEX_INITIALIZER;
77static pthread_cond_t s_notice_get_call_list_cond = PTHREAD_COND_INITIALIZER;
78
79static int s_module_isDial = 0;
lh7b0674a2022-01-10 00:34:35 -080080static pthread_mutex_t call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
81static pthread_cond_t call_state_change_cond = PTHREAD_COND_INITIALIZER;
llb3921072023-01-10 14:47:46 +080082static int s_CallId = 0;
83static pthread_mutex_t s_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
84static pthread_cond_t s_call_state_change_cond = PTHREAD_COND_INITIALIZER;
lhec17b0a2022-02-13 23:56:05 -080085
q.huang52921662022-10-20 15:25:45 +080086static int s_module_call_state =CALL_OFF;
87static int s_call_auto_answer = 0;
lh7b0674a2022-01-10 00:34:35 -080088
q.huangec88da92022-03-29 04:17:32 -040089typedef enum{
90 LYNQ_E_VOLUMN_SET_DTMF,
91 LYNQ_E_VOLUMN_SET_SPEECH
q.huang52921662022-10-20 15:25:45 +080092}LYNQ_E_VOLUMN_SET;
lh7b0674a2022-01-10 00:34:35 -080093
q.huang52921662022-10-20 15:25:45 +080094#if 0
q.huang7de1d662022-09-13 14:19:24 +080095int JumpHeader(Parcel &p,int *resp_type,int* token,int *request,int *slot_id,int *error)
lh7b0674a2022-01-10 00:34:35 -080096{
97 if(p.dataAvail() > 0)
98 {
99 p.readInt32(resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800100 p.readInt32(token);
lh7b0674a2022-01-10 00:34:35 -0800101 p.readInt32(request);
102 p.readInt32(slot_id);
103 p.readInt32(error);
104 return 0;
105 }
106 else
107 {
108 return -1;
109 }
110}
111int send_request(int sockfd,lynq_client_t *client_tmp)
112{
113 int ret=0;
rjw5d2a50e2022-02-28 15:01:49 +0800114 ret = sendto(sockfd, client_tmp, client_size, 0, (struct sockaddr *)&addr_serv, len_addr_serv);
lh7b0674a2022-01-10 00:34:35 -0800115 if(ret==-1)
116 {
q.huang70b76492022-06-02 14:49:02 +0800117 LYERRLOG("sendto error");
lh7b0674a2022-01-10 00:34:35 -0800118 return -1;
119 }
120 return 0;
121}
122
123int get_response(int sockfd,Parcel &p)
124{
125 int len = 0;
126 char recvline[LYNQ_REC_BUF];
127 bzero(recvline,LYNQ_REC_BUF);
128 /* receive data from server */
rjw5d2a50e2022-02-28 15:01:49 +0800129 len = recvfrom(sockfd,recvline,LYNQ_REC_BUF, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
lh7b0674a2022-01-10 00:34:35 -0800130 if(len == -1)
131 {
q.huang70b76492022-06-02 14:49:02 +0800132 LYERRLOG("recvfrom error");
lh7b0674a2022-01-10 00:34:35 -0800133 return -1;
134 }
lh7b0674a2022-01-10 00:34:35 -0800135 if (recvline != NULL) {
136 p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
137 p.setDataPosition(0);
138 }
139 return 0;
140}
q.huang52921662022-10-20 15:25:45 +0800141#endif
142static char *strdupReadString(Parcel* &p) {
ll04ae4142022-01-27 05:54:38 +0000143 size_t stringlen;
lh7b0674a2022-01-10 00:34:35 -0800144 const char16_t *s16;
q.huang52921662022-10-20 15:25:45 +0800145 s16 = p->readString16Inplace(&stringlen);
ll04ae4142022-01-27 05:54:38 +0000146 return strndup16to8(s16, stringlen);
lh7b0674a2022-01-10 00:34:35 -0800147}
148
149int lynq_get_current_call_list(lynq_call_list_t call_list[LYNQ_CALL_MAX])
150{
q.huang52921662022-10-20 15:25:45 +0800151 Parcel* p=NULL;
152 int ret=lynq_send_common_request(p,8,RIL_REQUEST_GET_CURRENT_CALLS,0,"");
153 if(ret!=0)
154 {
155 return ret;
156 }
157
158 int call_num = 0;
159 int temp = 0;
160 char *remote_phoneNum;
161 char *remote_name;
162 char uusData[128];
163
164 p->readInt32(&call_num);
165
166 if(call_num<=0)
167 {
168 s_module_call_state = CALL_OFF;
169 LYINFLOG("lynq_call_state:%d",s_module_call_state);
170 delete p;
171 return RESULT_OK;
172 }
173 s_module_call_state = CALL_ON;
174 LYINFLOG("lynq_call_state:%d, call num is %d ",s_module_call_state,call_num);
175 for(int i = 0;i < call_num;i++)
176 {
177 p->readInt32(&temp);
178 call_list[i].call_state = temp;
179 p->readInt32(&call_list[i].call_id);
180 p->readInt32(&call_list[i].toa);
181 p->readInt32(&temp);
182 p->readInt32(&temp);
183 call_list[i].direction = temp;
184 p->readInt32(&temp);
185 p->readInt32(&temp);
186 p->readInt32(&temp);
187 remote_phoneNum = strdupReadString(p);
188 memcpy(call_list[i].addr,remote_phoneNum,strlen(remote_phoneNum));
189 if(remote_phoneNum !=NULL)
190 {
191 free(remote_phoneNum);
192 }
193 LYINFLOG("call_id=%d,call_state=%d,direction=%d,addr=%s,toa=%d",call_list[i].call_id,call_list[i].call_state,
194 call_list[i].direction,call_list[i].addr,call_list[i].toa);
195 p->readInt32(&temp);
196 remote_name = strdupReadString(p);
197 if(remote_name !=NULL)
198 {
199 free(remote_name);
200 }
201 p->readInt32(&temp);
202 p->readInt32(&temp);
203 if(temp==0)
204 {
205 continue;
206 }
207 p->readInt32(&temp); /* UUS Information is present */
208 p->readInt32(&temp);
209 p->readInt32(&temp);
210 if(temp<=128)
211 {
212 p->read(uusData,temp);
213 }
214 else
215 {
216 LYERRLOG("%s len %d is too great",__func__,temp);
217 delete p;
218 return LYNQ_E_MALLOC_ERROR;
219 }
220 }
221
222 delete p;
223 return RESULT_OK;
224
225#if 0
lh7b0674a2022-01-10 00:34:35 -0800226 Parcel p;
227 lynq_client_t client;
228 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +0800229 int token;
lh7b0674a2022-01-10 00:34:35 -0800230 int request = -1;
231 int slot_id = -1;
232 int error = -1;
233 int call_num = 0;
234 int temp = 0;
235 char *remote_phoneNum = NULL;
236 char *remote_name= NULL;
237 char *uusData = NULL;
lh42c1e572022-01-25 18:47:39 -0800238 client.uToken = Global_uToken_call;
lh7b0674a2022-01-10 00:34:35 -0800239 client.request = 9;//RIL_REQUEST_GET_CURRENT_CALLS
240 client.paramLen = 0;
241 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang70b76492022-06-02 14:49:02 +0800242 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
lh42c1e572022-01-25 18:47:39 -0800243 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh7b0674a2022-01-10 00:34:35 -0800244 {
245 LYERRLOG("send request fail");
lh7b0674a2022-01-10 00:34:35 -0800246 return -1;
247 }
lh42c1e572022-01-25 18:47:39 -0800248 get_response(lynq_call_client_sockfd,p);
q.huang7de1d662022-09-13 14:19:24 +0800249 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
lh7b0674a2022-01-10 00:34:35 -0800250 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
251 if(error == 0)
252 {
253 p.readInt32(&call_num);
254 global_call_count = call_num;
255 if(call_num<=0)
256 {
257 lynq_call_state = CALL_OFF;
lhec17b0a2022-02-13 23:56:05 -0800258 LYINFLOG("lynq_call_state:%d",lynq_call_state);
lh7b0674a2022-01-10 00:34:35 -0800259 return 0;
260 }
lhec17b0a2022-02-13 23:56:05 -0800261 lynq_call_state = CALL_ON;
q.huang70b76492022-06-02 14:49:02 +0800262 LYINFLOG("lynq_call_state:%d, call num is %d ",lynq_call_state,call_num);
lh7b0674a2022-01-10 00:34:35 -0800263 for(int i = 0;i < call_num;i++)
264 {
265 p.readInt32(&temp);
266 call_list[i].call_state = temp;
267 p.readInt32(&call_list[i].call_id);
268 p.readInt32(&call_list[i].toa);
269 p.readInt32(&temp);
270 p.readInt32(&temp);
271 call_list[i].direction = temp;
272 p.readInt32(&temp);
273 p.readInt32(&temp);
274 p.readInt32(&temp);
275 remote_phoneNum = strdupReadString(p);
276 memcpy(call_list[i].addr,remote_phoneNum,strlen(remote_phoneNum));
277 LYINFLOG("call_id=%d,call_state=%d,direction=%d,addr=%s,toa=%d",call_list[i].call_id,call_list[i].call_state,
278 call_list[i].direction,call_list[i].addr,call_list[i].toa);
279 p.readInt32(&temp);
280 remote_name = strdupReadString(p);
281 p.readInt32(&temp);
282 p.readInt32(&temp);
283 if(temp==0)
284 {
285 continue;
286 }
287 p.readInt32(&temp); /* UUS Information is present */
288 p.readInt32(&temp);
289 p.readInt32(&temp);
290 p.read(uusData,temp);
291 }
292 }
293 return 0;
q.huang52921662022-10-20 15:25:45 +0800294#endif
lh7b0674a2022-01-10 00:34:35 -0800295}
296
297void cleanCallList(int lynq_call_id)
298{
q.huang52921662022-10-20 15:25:45 +0800299 LYINFLOG("cleanCall local idx is %d, id is %d",lynq_call_id,s_call_lists[lynq_call_id].call_id);
300 s_call_lists[lynq_call_id].call_id = 0;
301 s_call_lists[lynq_call_id].call_state = (int)LYNQ_CALL_END;
302 s_call_lists[lynq_call_id].toa = 0;
303 s_call_lists[lynq_call_id].direction = 0;
304 s_call_lists[lynq_call_id].used = 0;
305 memset(s_call_lists[lynq_call_id].addr,0,sizeof(s_call_lists[lynq_call_id].addr));
lh7b0674a2022-01-10 00:34:35 -0800306}
llb3921072023-01-10 14:47:46 +0800307
308
lh7b0674a2022-01-10 00:34:35 -0800309int getUnusedElement()
310{
311 for(int i=0;i < LYNQ_CALL_MAX; i++)
312 {
q.huang52921662022-10-20 15:25:45 +0800313 if(s_call_lists[i].used!=1)
lh7b0674a2022-01-10 00:34:35 -0800314 {
315 return i;
316 }
317 }
q.huang52921662022-10-20 15:25:45 +0800318 return INVALID_ID;
lh7b0674a2022-01-10 00:34:35 -0800319}
q.huang52921662022-10-20 15:25:45 +0800320int addAddr(char addr[], int call_id)
lh7b0674a2022-01-10 00:34:35 -0800321{
322 int ret = 0;
323 ret = getUnusedElement();
q.huang52921662022-10-20 15:25:45 +0800324 memcpy(s_call_lists[ret].addr,addr,strlen(addr)+1);
325 s_call_lists[ret].call_id=call_id;
326 s_call_lists[ret].used = 1;
q.huang70b76492022-06-02 14:49:02 +0800327 LYINFLOG("add local idx is %d addr is %s",ret,addr);
lh7b0674a2022-01-10 00:34:35 -0800328 return ret;
329}
330void updateCallList(lynq_call_list_e_t *callList, int call_id,int call_state,int toa,int direction)
331{
q.huang70b76492022-06-02 14:49:02 +0800332 LYINFLOG("Update original local id is %d, new local id is %d",callList->call_id,call_id);
lh7b0674a2022-01-10 00:34:35 -0800333 callList->call_id = call_id;
334 callList->call_state = call_state;
335 callList->toa = toa;
q.huang70b76492022-06-02 14:49:02 +0800336 callList->direction = direction;
lh7b0674a2022-01-10 00:34:35 -0800337 return;
338}
llb3921072023-01-10 14:47:46 +0800339
340void wait_call_state()
lh7b0674a2022-01-10 00:34:35 -0800341{
llb3921072023-01-10 14:47:46 +0800342 LYINFLOG("call state changed");
343 pthread_mutex_lock(&s_call_state_change_mutex);
344 pthread_cond_wait(&s_call_state_change_cond,&s_call_state_change_mutex);
345 pthread_mutex_unlock(&s_call_state_change_mutex);
lh7b0674a2022-01-10 00:34:35 -0800346}
llb3921072023-01-10 14:47:46 +0800347
lh7b0674a2022-01-10 00:34:35 -0800348int checkHasCall(char addr[])
349{
350 for(int i = 0;i<LYNQ_CALL_MAX;i++)
351 {
q.huang52921662022-10-20 15:25:45 +0800352 if(strcmp(s_call_lists[i].addr,addr)==0)
lh7b0674a2022-01-10 00:34:35 -0800353 {
q.huang52921662022-10-20 15:25:45 +0800354 LYINFLOG("checkHasCall addr is %s idx is %d id is %d",addr,i,s_call_lists[i].call_id);
355 return true;
lh7b0674a2022-01-10 00:34:35 -0800356 }
357 }
q.huang70b76492022-06-02 14:49:02 +0800358 LYINFLOG("checkHasCall addr is %s , no idx is found",addr);
q.huang52921662022-10-20 15:25:45 +0800359 return false;
lh7b0674a2022-01-10 00:34:35 -0800360}
lhd1e457c2022-04-19 06:01:25 -0700361int find_call_id_with_addr(char *addr)
362{
lhd1e457c2022-04-19 06:01:25 -0700363 for(int id = 0; id < LYNQ_CALL_MAX; id++)
364 {
q.huang52921662022-10-20 15:25:45 +0800365 if(s_call_lists[id].used && (strcmp(s_call_lists[id].addr,addr) == 0))
lhd1e457c2022-04-19 06:01:25 -0700366 {
q.huang52921662022-10-20 15:25:45 +0800367 LYINFLOG("find addr %s in local list, local idx is %d id is %d",addr,id,s_call_lists[id].call_id);
lhd1e457c2022-04-19 06:01:25 -0700368 return id;
369 }
370 }
q.huang70b76492022-06-02 14:49:02 +0800371 LYINFLOG("find addr %s in local list , not found",addr);
q.huang52921662022-10-20 15:25:45 +0800372 return INVALID_ID;
lhd1e457c2022-04-19 06:01:25 -0700373}
q.huang70b76492022-06-02 14:49:02 +0800374int find_call_id_with_call_id(int call_id)
375{
376 for(int id = 0; id < LYNQ_CALL_MAX; id++)
377 {
q.huang52921662022-10-20 15:25:45 +0800378 if(s_call_lists[id].used && (s_call_lists[id].call_id == call_id))
q.huang70b76492022-06-02 14:49:02 +0800379 {
q.huang52921662022-10-20 15:25:45 +0800380 LYINFLOG("find id %d in local list, local idx is %d, addr is %s",call_id,id,s_call_lists[id].addr);
q.huang70b76492022-06-02 14:49:02 +0800381 return id;
382 }
383 }
384 LYINFLOG("find id %d in local list , not found",call_id);
385 return INVALID_ID;
386}
lh7b0674a2022-01-10 00:34:35 -0800387void sendSignalToWaitCallStateChange()
388{
lhd1e457c2022-04-19 06:01:25 -0700389 LYINFLOG("send Signal To Wait Call State Change");
lh7b0674a2022-01-10 00:34:35 -0800390 pthread_mutex_lock(&call_state_change_mutex);
391 pthread_cond_signal(&call_state_change_cond);
392 pthread_mutex_unlock(&call_state_change_mutex);
393}
llb3921072023-01-10 14:47:46 +0800394void send_call_state_change()
lh7b0674a2022-01-10 00:34:35 -0800395{
llb3921072023-01-10 14:47:46 +0800396 LYINFLOG("send call state change");
397 pthread_mutex_lock(&s_call_state_change_mutex);
398 pthread_cond_signal(&s_call_state_change_cond);
399 pthread_mutex_unlock(&s_call_state_change_mutex);
lh7b0674a2022-01-10 00:34:35 -0800400}
401
q.huang52921662022-10-20 15:25:45 +0800402void cleanup_call_list_mutex(void *arg)
lh7b0674a2022-01-10 00:34:35 -0800403{
q.huang52921662022-10-20 15:25:45 +0800404 pthread_mutex_unlock(&s_notice_get_call_list_mutex);
lh7b0674a2022-01-10 00:34:35 -0800405}
llb3921072023-01-10 14:47:46 +0800406
407void update_end_state(int lynq_call_id)
408{
409 LYINFLOG("update_end_state local idx is %d, id is %d",lynq_call_id,s_call_lists[lynq_call_id].call_id);
410 s_call_lists[lynq_call_id].call_state = (int)LYNQ_CALL_END;
411}
412
lh7b0674a2022-01-10 00:34:35 -0800413void *triggerGetCallList(void *parg)
ll04ae4142022-01-27 05:54:38 +0000414{
415 int ret=0;
lhd1e457c2022-04-19 06:01:25 -0700416 bool call_end;
ll04ae4142022-01-27 05:54:38 +0000417 lynq_call_list_t call_list[LYNQ_CALL_MAX];
q.huang8b33ed52022-04-19 20:27:44 -0400418 int update=0;
q.huang70b76492022-06-02 14:49:02 +0800419 int cnt;
420 int i,n;
q.huange97cfcf2022-08-29 20:04:31 +0800421#ifdef ECALL_SUPPORT
422 int handupIncomingMT=0;
423#endif
q.huang52921662022-10-20 15:25:45 +0800424 pthread_mutex_lock(&s_notice_get_call_list_mutex);
425 pthread_cleanup_push(cleanup_call_list_mutex, NULL); // thread cleanup handler
426 while(s_call_list_loop)
ll04ae4142022-01-27 05:54:38 +0000427 {
q.huang52921662022-10-20 15:25:45 +0800428 update=0;
429 pthread_cond_wait(&s_notice_get_call_list_cond, &s_notice_get_call_list_mutex);
q.huang70b76492022-06-02 14:49:02 +0800430 LYDBGLOG("triggerGetCallList event!!!");
ll04ae4142022-01-27 05:54:38 +0000431 memset(call_list,0,sizeof(call_list));
432 ret = lynq_get_current_call_list(call_list);
q.huang52921662022-10-20 15:25:45 +0800433 if(ret != RESULT_OK)
ll04ae4142022-01-27 05:54:38 +0000434 {
q.huang52921662022-10-20 15:25:45 +0800435 LYDBGLOG("get current call list failure!!!");
llbc035332022-04-11 05:49:51 +0000436 continue;
ll04ae4142022-01-27 05:54:38 +0000437 }
lhd1e457c2022-04-19 06:01:25 -0700438 LYINFLOG("++++++++++++++triggerGetCallList++++++++++++++");
q.huang70b76492022-06-02 14:49:02 +0800439 LYINFLOG("clear local index begin");
440 cnt=0;
441 for(i = 0;i < LYNQ_CALL_MAX;i++)
lh7b0674a2022-01-10 00:34:35 -0800442 {
q.huang52921662022-10-20 15:25:45 +0800443 if(s_call_lists[i].used ==0)
q.huang70b76492022-06-02 14:49:02 +0800444 {
445 continue;
446 }
447 cnt++;
q.huang52921662022-10-20 15:25:45 +0800448 LYINFLOG("local idx is %d id is %d addr is %s state is %d direction is %d",i,s_call_lists[i].call_id,s_call_lists[i].addr,s_call_lists[i].call_state,s_call_lists[i].direction);
q.huang70b76492022-06-02 14:49:02 +0800449
q.huang52921662022-10-20 15:25:45 +0800450 if(s_call_lists[i].call_id > 0)
lhd1e457c2022-04-19 06:01:25 -0700451 {
452 call_end = 0;
q.huang70b76492022-06-02 14:49:02 +0800453 for(n = 0; n < LYNQ_CALL_MAX; n++)
lhd1e457c2022-04-19 06:01:25 -0700454 {
q.huang52921662022-10-20 15:25:45 +0800455 if(call_list[n].call_id == s_call_lists[i].call_id)
lhd1e457c2022-04-19 06:01:25 -0700456 {
457 call_end = 1;
q.huang52921662022-10-20 15:25:45 +0800458 LYINFLOG("find lynq call local idx %d, service idx %d id is %d!!!",i,n,s_call_lists[i].call_id);
q.huang70b76492022-06-02 14:49:02 +0800459 break;
lhd1e457c2022-04-19 06:01:25 -0700460 }
461 }
462 if(call_end == 0)
463 {
llb3921072023-01-10 14:47:46 +0800464 LYINFLOG("MT/MO hungup,then clean call info local idx is %d id is %d",i, s_call_lists[i].call_id);
465 //update_end_state(i);//lei modify for:update end state for this call
466 cleanCallList(i);
467 send_call_state_change();//means mt/mo call is end
468 //cleanCallList(i);
lhd1e457c2022-04-19 06:01:25 -0700469 }
470 } //fix bug API-54
q.huang70b76492022-06-02 14:49:02 +0800471 else
472 {
473 LYINFLOG("local id is 0");
474 }
475 }
476 LYINFLOG("clear local index end, local used cnt is %d", cnt);
477
478 LYINFLOG("add or update local index begin ");
479 for (i = 0;i < LYNQ_CALL_MAX;i++)
480 {
481 if(call_list[i].call_id==0)
482 {
483 break;
484 }
485
486 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,
487 call_list[i].direction,call_list[i].addr,call_list[i].toa);
488
lh7b0674a2022-01-10 00:34:35 -0800489 if(call_list[i].direction == 1)//MT call
490 {
q.huang70b76492022-06-02 14:49:02 +0800491 LYINFLOG("This is a MT CALL");
lh0fd3b012022-05-13 03:02:19 -0700492 /*MT CALL state code
493 **LYNQ_CALL_INCOMING = 4,
494 **LYNQ_CALL_WAITING = 5,
495 */
q.huange97cfcf2022-08-29 20:04:31 +0800496#ifdef ECALL_SUPPORT
lh0fd3b012022-05-13 03:02:19 -0700497 if((call_list[i].call_state ==4) || (call_list[i].call_state ==5))
lh7b0674a2022-01-10 00:34:35 -0800498 {
q.huang52921662022-10-20 15:25:45 +0800499 handupIncomingMT=Is_handup_IncomingMT(call_list[i].call_id);
q.huange97cfcf2022-08-29 20:04:31 +0800500 LYINFLOG("handupIncomingMT is %d",handupIncomingMT);
501 if(handupIncomingMT)
lh7b0674a2022-01-10 00:34:35 -0800502 {
q.huang70b76492022-06-02 14:49:02 +0800503 lynq_call_hungup(&(call_list[i].call_id));
504 continue;
q.huange97cfcf2022-08-29 20:04:31 +0800505 }
q.huang70b76492022-06-02 14:49:02 +0800506 }
q.huange97cfcf2022-08-29 20:04:31 +0800507#endif
q.huang70b76492022-06-02 14:49:02 +0800508 /*you call me, and i call you,One party failed to dial*/
509 n = find_call_id_with_addr(call_list[i].addr);
510 if(n ==INVALID_ID)
511 {
q.huang52921662022-10-20 15:25:45 +0800512 n = addAddr(call_list[i].addr,call_list[i].call_id);
513 updateCallList(&s_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
llb3921072023-01-10 14:47:46 +0800514 s_CallId = call_list[i].call_id;
515 send_call_state_change();
q.huang70b76492022-06-02 14:49:02 +0800516 }
q.huang52921662022-10-20 15:25:45 +0800517 else if(s_call_lists[n].call_state == call_list[i].call_state)
q.huang70b76492022-06-02 14:49:02 +0800518 {
519 LYINFLOG("state not changed, state is %d ",call_list[i].call_state);
520 if(call_list[i].call_state ==4 || call_list[i].call_state ==5)
lhd1e457c2022-04-19 06:01:25 -0700521 {
lhd1e457c2022-04-19 06:01:25 -0700522 /*if call state not change,Maybe this call was ignored, so we need to continue to inform the user of
523 **an incoming call until the status changes.
524 **fix bug API-54
525 */
q.huang70b76492022-06-02 14:49:02 +0800526 LYINFLOG("resend incoming call signal");
llb3921072023-01-10 14:47:46 +0800527 send_call_state_change();
lhd1e457c2022-04-19 06:01:25 -0700528 }
lh7b0674a2022-01-10 00:34:35 -0800529 }
q.huang70b76492022-06-02 14:49:02 +0800530 else
ll72bf6c12022-03-24 10:22:25 +0800531 {
q.huang52921662022-10-20 15:25:45 +0800532 LYINFLOG("state changed from %d to %d",s_call_lists[n].call_state,call_list[i].call_state);
q.huang70b76492022-06-02 14:49:02 +0800533
llb3921072023-01-10 14:47:46 +0800534 updateCallList(&s_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);//update mt call
lle3b9a232023-01-14 13:21:20 +0800535 send_call_state_change();
llb3921072023-01-10 14:47:46 +0800536 }
lh7b0674a2022-01-10 00:34:35 -0800537 }
538 else
q.huang70b76492022-06-02 14:49:02 +0800539 {
540 LYINFLOG("This is a MO CALL");
541 call_end = 0;
542 for(n = 0 ; n < LYNQ_CALL_MAX; n++)
lh7b0674a2022-01-10 00:34:35 -0800543 {
q.huang52921662022-10-20 15:25:45 +0800544 if(s_call_lists[n].used && ((strcmp(call_list[i].addr,s_call_lists[n].addr)==0)||(call_list[i].call_id==s_call_lists[n].call_id)))
lh7b0674a2022-01-10 00:34:35 -0800545 {
q.huang52921662022-10-20 15:25:45 +0800546 if(s_call_lists[n].call_id==0)
q.huang70b76492022-06-02 14:49:02 +0800547 {
llb3921072023-01-10 14:47:46 +0800548 LYINFLOG("add a call id");
549 update=1;//for send sigal
lle3b9a232023-01-14 13:21:20 +0800550 s_CallId = call_list[i].call_id;
q.huang70b76492022-06-02 14:49:02 +0800551 }
q.huang52921662022-10-20 15:25:45 +0800552 LYINFLOG("local idx %d updated, original call id is %d origial addr is %s original state is %d",n,s_call_lists[n].call_id,s_call_lists[n].addr,s_call_lists[n].call_state);
553 updateCallList(&s_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
q.huang70b76492022-06-02 14:49:02 +0800554 call_end = 1;
llb3921072023-01-10 14:47:46 +0800555 send_call_state_change();//means mo call is success
q.huang70b76492022-06-02 14:49:02 +0800556 break;
557 }
558 }
llb3921072023-01-10 14:47:46 +0800559 if(call_end == 0)//1.there is no space to use 2.can't find addr in buffer 3.call_id not equal eg:when call is error return 8004/handle <= 0 will into this
q.huang70b76492022-06-02 14:49:02 +0800560 {
561 LYINFLOG("need to hangup id %d", call_list[i].call_id);
562#ifdef ECALL_SUPPORT
q.huang52921662022-10-20 15:25:45 +0800563 if(IsECallDialing())
q.huang70b76492022-06-02 14:49:02 +0800564 {
565 LYINFLOG("ecall is dialing, for the timebeing, don't huangup");
lh7b0674a2022-01-10 00:34:35 -0800566 continue;
567 }
q.huang70b76492022-06-02 14:49:02 +0800568#endif
569 LYINFLOG("hang up service call id %d",call_list[i].call_id);
570 lynq_call_hungup(&(call_list[i].call_id));
lh7b0674a2022-01-10 00:34:35 -0800571 }
llb3921072023-01-10 14:47:46 +0800572
lh7b0674a2022-01-10 00:34:35 -0800573 }
q.huang70b76492022-06-02 14:49:02 +0800574 LYDBGLOG("servie idx %d end",i);
ll04ae4142022-01-27 05:54:38 +0000575 }
q.huang52921662022-10-20 15:25:45 +0800576 LYINFLOG("add or update local index end ");
577 if(s_module_isDial==1)
lh7b0674a2022-01-10 00:34:35 -0800578 {
q.huang70b76492022-06-02 14:49:02 +0800579 LYINFLOG("now is dialing");
580 if(update==1)
581 {
582 LYINFLOG("find added call");
583 sendSignalToWaitCallStateChange();
q.huang52921662022-10-20 15:25:45 +0800584 s_module_isDial = 0;
q.huang70b76492022-06-02 14:49:02 +0800585 }
586 else
587 {
588 LYINFLOG("not find added call");
589 }
590 }
591 else
592 {
593 LYINFLOG("now is not dialing");
q.huang52921662022-10-20 15:25:45 +0800594 }
ll04ae4142022-01-27 05:54:38 +0000595 }
q.huang52921662022-10-20 15:25:45 +0800596 pthread_cleanup_pop(0);
597 pthread_mutex_unlock(&s_notice_get_call_list_mutex);
ll04ae4142022-01-27 05:54:38 +0000598 return NULL;
lh7b0674a2022-01-10 00:34:35 -0800599}
600
q.huang52921662022-10-20 15:25:45 +0800601void lynqNoticeGetModuleCallList()
ll04ae4142022-01-27 05:54:38 +0000602{
q.huang52921662022-10-20 15:25:45 +0800603 pthread_mutex_lock(&s_notice_get_call_list_mutex);
604 pthread_cond_signal(&s_notice_get_call_list_cond);
605 pthread_mutex_unlock(&s_notice_get_call_list_mutex);
606
lh7b0674a2022-01-10 00:34:35 -0800607}
608
q.huang52921662022-10-20 15:25:45 +0800609#if 0
lh7b0674a2022-01-10 00:34:35 -0800610/*Warren add for T800 platform 2021/11/19 start*/
611int lynq_socket_client_start()
rjw5d2a50e2022-02-28 15:01:49 +0800612{
613 #if 0
lh7b0674a2022-01-10 00:34:35 -0800614 struct sockaddr_in lynq_socket_server_addr;
615 /* init lynq_socket_server_addr */
616 bzero(&lynq_socket_server_addr, sizeof(lynq_socket_server_addr));
617 lynq_socket_server_addr.sin_family = AF_INET;
618 lynq_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
619 lynq_socket_server_addr.sin_addr.s_addr = htons(INADDR_ANY);
rjw5d2a50e2022-02-28 15:01:49 +0800620
lh7b0674a2022-01-10 00:34:35 -0800621 /*
622 if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)
623 {
q.huang70b76492022-06-02 14:49:02 +0800624 LYDBGLOG("[%s] is not a valid IPaddress", argv[1]);
lh7b0674a2022-01-10 00:34:35 -0800625 exit(1);
626 }
627*/
lh42c1e572022-01-25 18:47:39 -0800628 lynq_call_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
629 if(connect(lynq_call_client_sockfd, (struct sockaddr *)&lynq_socket_server_addr, sizeof(lynq_socket_server_addr)) == -1)
lh7b0674a2022-01-10 00:34:35 -0800630 {
q.huang70b76492022-06-02 14:49:02 +0800631 LYERRLOG("connect error");
lh7b0674a2022-01-10 00:34:35 -0800632 return -1;
633 }
rjw5d2a50e2022-02-28 15:01:49 +0800634 #endif
635 lynq_call_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
636 if (-1 == lynq_call_client_sockfd)
637 {
638 return lynq_call_client_sockfd;
639 }
ll630be412022-07-25 05:52:14 +0000640 struct timeval timeOut;
641 timeOut.tv_sec = 60;
642 timeOut.tv_usec = 0;
643 if (setsockopt(lynq_call_client_sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
644 {
645 RLOGD("time out setting failed\n");
646 return -1;
647 }
rjw5d2a50e2022-02-28 15:01:49 +0800648 /* 设置address */
649 memset(&addr_serv, 0, sizeof(addr_serv));
650 addr_serv.sin_family = AF_INET;
651 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
652 addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);
653 len_addr_serv = sizeof(addr_serv);
lh7b0674a2022-01-10 00:34:35 -0800654 return 0;
655}
lh7b0674a2022-01-10 00:34:35 -0800656
lh7b0674a2022-01-10 00:34:35 -0800657int lynq_socket_urc_start()
658{
659 int socket_fd=0;
660 int rt=0;
661 int len=0;
662 int on=1;
663 struct sockaddr_in urc_local_addr;
lh7b0674a2022-01-10 00:34:35 -0800664 pthread_attr_t attr;
ll04ae4142022-01-27 05:54:38 +0000665 socket_fd = socket(AF_INET,SOCK_DGRAM,0);
ll04ae4142022-01-27 05:54:38 +0000666 if(socket_fd < 0)
667 {
q.huang70b76492022-06-02 14:49:02 +0800668 LYERRLOG("creaet socket for udp fail");
ll04ae4142022-01-27 05:54:38 +0000669 return -1;
lh7b0674a2022-01-10 00:34:35 -0800670 }
671 urc_local_addr.sin_family = AF_INET;
672 urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
673 urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
674 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
ll04ae4142022-01-27 05:54:38 +0000675 rt = setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
676 if(rt<0)
677 {
q.huang70b76492022-06-02 14:49:02 +0800678 LYERRLOG("SO_REUSEADDR fail");
lh7b0674a2022-01-10 00:34:35 -0800679 return -1;
680 }
681 rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
ll04ae4142022-01-27 05:54:38 +0000682 if (rt == -1)
683 {
lh21502f52022-01-27 00:27:12 -0800684 LYERRLOG("bind failed");
ll04ae4142022-01-27 05:54:38 +0000685 return -1;
lh7b0674a2022-01-10 00:34:35 -0800686 }
687 pthread_attr_init(&attr);
688 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
lhec17b0a2022-02-13 23:56:05 -0800689 rt = pthread_create(&lynq_call_urc_tid,&attr,thread_urc_recv,(void *)socket_fd);
lh7b0674a2022-01-10 00:34:35 -0800690 if(rt < 0)
691 {
q.huang70b76492022-06-02 14:49:02 +0800692 LYERRLOG("urc loop failure!!!");
lh7b0674a2022-01-10 00:34:35 -0800693 return -1;
694 }
q.huang70b76492022-06-02 14:49:02 +0800695 LYDBGLOG("urc loop success!!!");
lh7b0674a2022-01-10 00:34:35 -0800696 return 0;
697}
q.huang52921662022-10-20 15:25:45 +0800698#endif
lh7b0674a2022-01-10 00:34:35 -0800699
700void lynq_call_state_change_test(int soc_id)
701{
q.huang70b76492022-06-02 14:49:02 +0800702 LYDBGLOG("call state change,sim:%d",soc_id);
lh7b0674a2022-01-10 00:34:35 -0800703}
q.huangcb7b7292022-06-28 20:12:01 +0800704
q.huang52921662022-10-20 15:25:45 +0800705int lynq_start_call_list_loop()
706{
707#if 0
708 int ret = 0;
709 pthread_attr_t attr;
710 pthread_attr_init(&attr);
711 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
q.huangcb7b7292022-06-28 20:12:01 +0800712
q.huang52921662022-10-20 15:25:45 +0800713 s_notice_get_call_list_mutex = new pthread_mutex_t;
714 pthread_mutex_init(s_notice_get_call_list_mutex, NULL);
715 s_notice_get_call_list_cond = new pthread_cond_t;
716 LYINFLOG("liulei s_notice_get_call_list_mutex\n");
717 pthread_cond_init(s_notice_get_call_list_cond, NULL);
718 LYINFLOG("liulei s_notice_get_call_list_cond\n");
719#endif
q.huangcb7b7292022-06-28 20:12:01 +0800720
q.huang52921662022-10-20 15:25:45 +0800721 s_call_list_loop = 1;
722 int ret = pthread_create(&s_call_list_loop_tid,/*&attr*/NULL,triggerGetCallList,NULL);
723 if(ret < 0)
q.huangcb7b7292022-06-28 20:12:01 +0800724 {
q.huang52921662022-10-20 15:25:45 +0800725 LYERRLOG("lynq_update_call_list_loop fail!!!");
lla8c25a82022-03-17 05:31:33 +0000726 return -1;
727 }
q.huang52921662022-10-20 15:25:45 +0800728 LYINFLOG("lynq_update_call_list_loop success!!!");
q.huangcb7b7292022-06-28 20:12:01 +0800729
q.huang52921662022-10-20 15:25:45 +0800730 memset(s_call_lists,0,sizeof(s_call_lists));
lh7b0674a2022-01-10 00:34:35 -0800731 return 0;
732}
q.huang52921662022-10-20 15:25:45 +0800733
734int lynq_stop_call_list_loop()
lh7b0674a2022-01-10 00:34:35 -0800735{
q.huang70b76492022-06-02 14:49:02 +0800736 int ret;
q.huang52921662022-10-20 15:25:45 +0800737 pthread_mutex_lock(&s_notice_get_call_list_mutex);
738 s_call_list_loop = 0;
739 ret = pthread_cancel(s_call_list_loop_tid);
740 LYINFLOG("pthread cancel w_c_list ret = %d",ret);
741 pthread_mutex_unlock(&s_notice_get_call_list_mutex);
742 ret = pthread_join(s_call_list_loop_tid,NULL);
743 LYINFLOG("pthread join w_c_list ret = %d",ret);
744 s_call_list_loop_tid=-1;
745#if 0
746 pthread_mutex_destroy(s_notice_get_call_list_mutex);
747 pthread_cond_destroy(s_notice_get_call_list_cond);
748 delete s_notice_get_call_list_mutex;
749 //s_notice_get_call_list_mutex = NULL;
750 delete s_notice_get_call_list_cond;
751 //s_notice_get_call_list_cond = NULL;
752#endif
753
754 return 0;
rita98e2e9c2022-04-07 06:08:13 -0400755}
q.huang714145d2022-04-18 00:09:50 -0400756
q.huang52921662022-10-20 15:25:45 +0800757int lynq_init_call(int utoken){
q.huangf6a9ddc2023-12-08 20:23:56 +0800758
759 LYLOGSET(LOG_INFO);
760 LYLOGEINIT(USER_LOG_TAG);
761 LYERRLOG("%s start, parameter is %d", __func__,utoken);
762
q.huang52921662022-10-20 15:25:45 +0800763 if(g_module_init_flag != MODULE_CLOSED)
764 {
765 LYERRLOG("module state is %d",g_module_init_flag);
766 return LYNQ_E_CONFLICT;
767 }
768 if(utoken <0){
769 LYERRLOG("utoken is less than 0",utoken);
770 return LYNQ_E_PARAMETER_ANONALY;
771 }
772 g_module_init_flag = MODULE_SWITCHING;
q.huangf6a9ddc2023-12-08 20:23:56 +0800773
q.huang52921662022-10-20 15:25:45 +0800774
775 g_module_Global_uToken = utoken;
776
q.huang036b6cf2023-01-10 14:29:20 +0800777 int ret = lynq_start_all_urc_socket_thread();
q.huang52921662022-10-20 15:25:45 +0800778 if(ret != RESULT_OK)
779 {
780 LYERRLOG("init socket urc fail!!!");
781 g_module_init_flag = MODULE_CLOSED;
782 return LYNQ_E_INNER_ERROR;
783 }
784
q.huang036b6cf2023-01-10 14:29:20 +0800785 ret = lynq_start_all_rc_socket_thread();
q.huang52921662022-10-20 15:25:45 +0800786 if(ret !=RESULT_OK)
787 {
788 LYERRLOG("init socket client fail!!!");
q.huang036b6cf2023-01-10 14:29:20 +0800789 lynq_close_all_urc_socket_thread();
q.huang52921662022-10-20 15:25:45 +0800790 g_module_init_flag = MODULE_CLOSED;
791 return LYNQ_E_INNER_ERROR;
792 }
793
794
795 int result = lynq_start_call_list_loop();
796 if(ret != RESULT_OK)
797 {
798 LYERRLOG("lynq_start_call_list_loop fail!!!");
q.huang036b6cf2023-01-10 14:29:20 +0800799 lynq_close_all_urc_socket_thread();
800 lynq_close_all_rc_socket_thread();
q.huang52921662022-10-20 15:25:45 +0800801 g_module_init_flag = MODULE_CLOSED;
802 return LYNQ_E_INNER_ERROR;
803 }
804
805 lynq_init_rtp();
806
807 g_module_init_flag = MODULE_RUNNING;
q.huangf6a9ddc2023-12-08 20:23:56 +0800808
809 LYERRLOG("%s end suc", __func__);
q.huang52921662022-10-20 15:25:45 +0800810 return 0;
811}
812
813int lynq_deinit_call(void){
q.huangf6a9ddc2023-12-08 20:23:56 +0800814 LYERRLOG("%s start", __func__);
q.huang52921662022-10-20 15:25:45 +0800815
816 if (g_module_init_flag != MODULE_RUNNING)
817 {
818 LYERRLOG("module state is %d",g_module_init_flag);
819 return LYNQ_E_CONFLICT;
820 }
821 lynq_call_hungup_all();
q.huang52921662022-10-20 15:25:45 +0800822 g_module_init_flag = MODULE_SWITCHING;
q.huang036b6cf2023-01-10 14:29:20 +0800823 lynq_close_all_urc_socket_thread();
824 lynq_close_all_rc_socket_thread();
q.huang52921662022-10-20 15:25:45 +0800825 lynq_stop_call_list_loop();
826 g_module_init_flag = MODULE_CLOSED;
q.huangf6a9ddc2023-12-08 20:23:56 +0800827
828 LYERRLOG("%s end suc", __func__);
q.huang52921662022-10-20 15:25:45 +0800829 return 0;
830}
831
832#if 0
q.huang714145d2022-04-18 00:09:50 -0400833int lynq_set_common_request(int request_id, int argc, const char* format,...)
rita089527e2022-04-07 01:55:39 -0400834{
835 Parcel p;
836 lynq_client_t client;
837 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +0800838 int token;
rita089527e2022-04-07 01:55:39 -0400839 int request = -1;
840 int slot_id = -1;
841 int error = -1;
rita089527e2022-04-07 01:55:39 -0400842
q.huang52921662022-10-20 15:25:45 +0800843 Parcel* p=NULL;
844 int ret=lynq_send_common_request(request_id,5,p,argc,format,...);
845 if(ret==RESULT_OK)
846 {
847 delete p;
848 }
849 return ret;
850
rita089527e2022-04-07 01:55:39 -0400851 client.uToken = Global_uToken_call;
q.huang714145d2022-04-18 00:09:50 -0400852 client.request = request_id;
853 client.paramLen = argc;
rita089527e2022-04-07 01:55:39 -0400854 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang714145d2022-04-18 00:09:50 -0400855 if(argc!=0)
856 {
857 va_list args;
858 va_start(args, format);
859 vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
860 va_end(args);
861 }
q.huang70b76492022-06-02 14:49:02 +0800862 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rita089527e2022-04-07 01:55:39 -0400863 if(send_request(lynq_call_client_sockfd,&client)==-1)
864 {
865 LYERRLOG("send request fail");
866 return -1;
867 }
q.huang714145d2022-04-18 00:09:50 -0400868 if(get_response(lynq_call_client_sockfd,p)==0)
869 {
q.huang7de1d662022-09-13 14:19:24 +0800870 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
q.huang714145d2022-04-18 00:09:50 -0400871 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
872 }
rita089527e2022-04-07 01:55:39 -0400873 return error;
q.huang52921662022-10-20 15:25:45 +0800874
875
rita089527e2022-04-07 01:55:39 -0400876}
q.huang52921662022-10-20 15:25:45 +0800877#endif
rita089527e2022-04-07 01:55:39 -0400878
q.huang714145d2022-04-18 00:09:50 -0400879int lynq_get_common_request(int request_id, int* status)
rita089527e2022-04-07 01:55:39 -0400880{
q.huang714145d2022-04-18 00:09:50 -0400881 if(status==NULL)
882 {
883 LYERRLOG("status is null");
q.huang52921662022-10-20 15:25:45 +0800884 return LYNQ_E_PARAMETER_ANONALY;
q.huang714145d2022-04-18 00:09:50 -0400885 }
q.huang52921662022-10-20 15:25:45 +0800886
887 Parcel* p=NULL;
888 int ret=lynq_send_common_request(p,g_wait_time,request_id,0,"");
889 if(ret==RESULT_OK)
rita089527e2022-04-07 01:55:39 -0400890 {
q.huang52921662022-10-20 15:25:45 +0800891 p->readInt32(status);
892 delete p;
rita089527e2022-04-07 01:55:39 -0400893 }
q.huang52921662022-10-20 15:25:45 +0800894 return ret;
895}
896
897int waitCallstateChange(int mtime)
898{
899 LYINFLOG("wait Call state Change");
900 int ret = 0;
901 int sec = 0;
902 int usec = 0;
903 struct timeval now;
904 struct timespec timeout;
905 gettimeofday(&now,NULL);
906 sec = mtime/1000;
907 usec = mtime%1000;
908 timeout.tv_sec = now.tv_sec+sec;
909 timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
910 pthread_mutex_lock(&call_state_change_mutex);
911 ret = pthread_cond_timedwait(&call_state_change_cond,&call_state_change_mutex,&timeout);
912 pthread_mutex_unlock(&call_state_change_mutex);
913 return ret;
914}
915
916int IsNormalCallDailing()
917{
918 return s_module_isDial;
rita089527e2022-04-07 01:55:39 -0400919}
920
llb3921072023-01-10 14:47:46 +0800921
lh3b6f7ea2023-11-08 01:16:42 -0800922int check_file_access(const char *fileName)
923{
924 if(0 == access(fileName,F_OK))
925 {
926 LYINFLOG("find file %s success",fileName);
927 return 0;
928 }
929 LYERRLOG("find file %s fail",fileName);
930 return 1;
931}
932int try_reset_audio_service()
933{
934 //check files:audio-ctrl-service,libmodem-afe-service,speech_daemon
935 int ap_speech = 0;
936 int audio_ctrl_ser = 0;
937 int md_afe = 0;
938 int tele_demo_lock = 0;
939 LYINFLOG("try_reset_audio_service start");
940 ap_speech = check_file_access(AP_SPEECH);
941 audio_ctrl_ser = check_file_access(AUDIO_CTRL_SER);
942 md_afe = check_file_access(LIBMODEM_AFE);
943 tele_demo_lock = check_file_access(TELE_DEMO_LOCK);
944 if((ap_speech + audio_ctrl_ser + md_afe) > 0)
945 {
946 system("systemctl stop audio-ctrl-service");
947 system("systemctl stop speech_daemon");
948 system("systemctl stop libmodem_afe_service");
949 usleep(200000);//200ms
950 system("rm /tmp/audio_ctrl_service -rf");
951 system("rm /tmp/ap_speech -rf");
952 system("rm /tmp/libmodem-afe-ctrl -rf");
953 usleep(100000);//100ms
954 system("systemctl start libmodem_afe_service");
955 usleep(200000);//200ms
956 system("systemctl start speech_daemon");
957 usleep(200000);//200ms
958 system("systemctl start audio-ctrl-service");
959 sleep(1);//1s
960 LYERRLOG("reset audio relation service");
961 }
962 if(tele_demo_lock)
963 {
964 LYERRLOG("%s lose,why?",TELE_DEMO_LOCK);
965 }
966 return 0;
967}
968
lh7b0674a2022-01-10 00:34:35 -0800969int lynq_call(int* handle,char addr[])
970{
q.huang52921662022-10-20 15:25:45 +0800971 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -0700972 {
q.huang52921662022-10-20 15:25:45 +0800973 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
974 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -0700975 }
lh3b6f7ea2023-11-08 01:16:42 -0800976 try_reset_audio_service();
lh7b0674a2022-01-10 00:34:35 -0800977 int lynq_call_id = -1;
q.huang70b76492022-06-02 14:49:02 +0800978
979 LYINFLOG("lynq_call begin addr %s",addr);
lh7b0674a2022-01-10 00:34:35 -0800980 if(addr==NULL)
981 {
982 LYERRLOG("Phone num is null!!!");
q.huang52921662022-10-20 15:25:45 +0800983 return LYNQ_E_PARAMETER_ANONALY;
lh7b0674a2022-01-10 00:34:35 -0800984 }
q.huang70b76492022-06-02 14:49:02 +0800985
986 if(find_call_id_with_addr(addr)!=INVALID_ID)
987 {
988 LYERRLOG("addr %s exists",addr);
989 return LYNQ_E_CONFLICT;
990 }
991
992#ifdef ECALL_SUPPORT
993 if(lynq_ecall_is_running())
994 {
995 LYERRLOG("lynq_fast_ecall ecall is running");
996 return LYNQ_E_ECALL_BEING_RUNNING;
997 }
998#endif
q.huang52921662022-10-20 15:25:45 +0800999 Parcel* p=NULL;
1000 lynq_call_id = addAddr(addr,0);
1001 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_DIAL,2,"%s %d",addr, 0);
1002 if(ret!=0)
1003 {
llb3921072023-01-10 14:47:46 +08001004 cleanCallList(lynq_call_id);
q.huang52921662022-10-20 15:25:45 +08001005 return ret;
llb3921072023-01-10 14:47:46 +08001006 }
1007 delete p;
q.huang52921662022-10-20 15:25:45 +08001008 s_module_isDial = 1;
1009 if(waitCallstateChange(6000)==ETIMEDOUT)//6000ms
lh7b0674a2022-01-10 00:34:35 -08001010 {
q.huang52921662022-10-20 15:25:45 +08001011 //if timeout,this call need destroy.
1012 s_module_isDial = 0;
1013 LYERRLOG("lynq_call timeout:wait Call state fail!!! clear local idx %d",lynq_call_id);
llb3921072023-01-10 14:47:46 +08001014 cleanCallList(lynq_call_id);
lle3b9a232023-01-14 13:21:20 +08001015 send_call_state_change();
q.huang52921662022-10-20 15:25:45 +08001016 return LYNQ_E_TIME_OUT;
lh7b0674a2022-01-10 00:34:35 -08001017 }
q.huang52921662022-10-20 15:25:45 +08001018 s_module_isDial = 0;
1019 *handle = s_call_lists[lynq_call_id].call_id;
1020 if(*handle > 0)
lh7b0674a2022-01-10 00:34:35 -08001021 {
q.huang52921662022-10-20 15:25:45 +08001022 LYINFLOG("lynq_call dial addr %s suc, id is %d",addr,*handle);
1023 return RESULT_OK;
lh7b0674a2022-01-10 00:34:35 -08001024 }
q.huang52921662022-10-20 15:25:45 +08001025 else
1026 {
1027 LYERRLOG("lynq_call dial addr %s fail, invalid id",addr);
lle3b9a232023-01-14 13:21:20 +08001028 cleanCallList(lynq_call_id);
1029 send_call_state_change();
q.huang52921662022-10-20 15:25:45 +08001030 return LYNQ_E_INVALID_ID_ANONALY;
llb3921072023-01-10 14:47:46 +08001031 }
lh7b0674a2022-01-10 00:34:35 -08001032}
llb3921072023-01-10 14:47:46 +08001033
lh7b0674a2022-01-10 00:34:35 -08001034int lynq_call_answer()
1035{
q.huang52921662022-10-20 15:25:45 +08001036 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001037 {
q.huang52921662022-10-20 15:25:45 +08001038 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1039 return LYNQ_E_CONFLICT;
1040 }
1041
1042 Parcel* p=NULL;
1043 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_ANSWER,0,"");
1044 if(ret==RESULT_OK)
lh7b0674a2022-01-10 00:34:35 -08001045 {
q.huang52921662022-10-20 15:25:45 +08001046 delete p;
1047 }
1048 return ret;
lh7b0674a2022-01-10 00:34:35 -08001049}
llb3921072023-01-10 14:47:46 +08001050
lh7b0674a2022-01-10 00:34:35 -08001051int lynq_call_hungup(int* handle)
1052{
q.huang52921662022-10-20 15:25:45 +08001053 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001054 {
q.huang52921662022-10-20 15:25:45 +08001055 return LYNQ_E_CONFLICT;
1056 }
1057
lh42c1e572022-01-25 18:47:39 -08001058 if(handle==NULL||!((*handle>=0)&&(*handle<10)))
1059 {
q.huang52921662022-10-20 15:25:45 +08001060 LYERRLOG("%s illegal input!!!!",__func__);
1061 return LYNQ_E_PARAMETER_ANONALY;
lh42c1e572022-01-25 18:47:39 -08001062 }
q.huang52921662022-10-20 15:25:45 +08001063
1064 int call_id = *handle;
1065 Parcel* p=NULL;
1066 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_HANGUP,1,"%d",call_id);
1067 if(ret!=0)
lh7b0674a2022-01-10 00:34:35 -08001068 {
q.huang52921662022-10-20 15:25:45 +08001069 return ret;
1070 }
1071 delete p;
1072
1073 int lynq_call_id=find_call_id_with_call_id(call_id);
1074 if(lynq_call_id!=INVALID_ID)
lh7b0674a2022-01-10 00:34:35 -08001075 {
q.huang52921662022-10-20 15:25:45 +08001076 cleanCallList(lynq_call_id);
1077 }
1078
1079 return RESULT_OK;
lh7b0674a2022-01-10 00:34:35 -08001080}
1081int lynq_call_hungup_all()
1082{
q.huang52921662022-10-20 15:25:45 +08001083 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001084 {
q.huang52921662022-10-20 15:25:45 +08001085 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1086 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001087 }
q.huang52921662022-10-20 15:25:45 +08001088
1089 Parcel* p=NULL;
1090 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_UDUB,0,"");
1091 if(ret==RESULT_OK)
lh7b0674a2022-01-10 00:34:35 -08001092 {
q.huang52921662022-10-20 15:25:45 +08001093 delete p;
1094 }
1095 return ret;
lh7b0674a2022-01-10 00:34:35 -08001096}
llb3921072023-01-10 14:47:46 +08001097
1098int lynq_wait_call_state_change(int *handle)
lh7b0674a2022-01-10 00:34:35 -08001099{
q.huang52921662022-10-20 15:25:45 +08001100 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001101 {
q.huang52921662022-10-20 15:25:45 +08001102 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1103 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001104 }
llb3921072023-01-10 14:47:46 +08001105 wait_call_state();
1106 *handle = s_CallId;
1107 LYINFLOG("lynq mo/mt call id:%d",s_CallId);
1108 return RESULT_OK;
lh7b0674a2022-01-10 00:34:35 -08001109}
1110
1111int lynq_set_auto_answercall(const int mode)
1112{
q.huang52921662022-10-20 15:25:45 +08001113 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001114 {
q.huang52921662022-10-20 15:25:45 +08001115 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1116 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001117 }
q.huang52921662022-10-20 15:25:45 +08001118 s_call_auto_answer = mode;
lh7b0674a2022-01-10 00:34:35 -08001119 LYINFLOG("auto answer call mode =%d",mode);
q.huang52921662022-10-20 15:25:45 +08001120 return RESULT_OK;
lh7b0674a2022-01-10 00:34:35 -08001121}
llb3921072023-01-10 14:47:46 +08001122
1123int lynq_find_already_end()
1124{
1125 for(int i=0;i < LYNQ_CALL_MAX; i++)
1126 {
1127 if(s_call_lists[i].call_state == 6)
1128 {
1129 return 0;
1130 }
1131 }
1132 return INVALID_ID;
1133}
1134
q.huangec88da92022-03-29 04:17:32 -04001135int lynq_get_current_call_state(int *handle, int *call_state,int *toa,int *direction,char addr[])
1136{
q.huang52921662022-10-20 15:25:45 +08001137 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001138 {
q.huang52921662022-10-20 15:25:45 +08001139 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1140 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001141 }
q.huangec88da92022-03-29 04:17:32 -04001142 int lynq_call_id = 0;
q.huang70b76492022-06-02 14:49:02 +08001143 LYINFLOG("lynq_get_current_call_state begin ");
q.huangec88da92022-03-29 04:17:32 -04001144 if(handle==NULL)
1145 {
q.huang70b76492022-06-02 14:49:02 +08001146 LYERRLOG("handle is NULL");
q.huang52921662022-10-20 15:25:45 +08001147 return LYNQ_E_PARAMETER_ANONALY;
q.huangec88da92022-03-29 04:17:32 -04001148 }
llb3921072023-01-10 14:47:46 +08001149 LYINFLOG("lynq_get_current_call_state %d\n ", *handle);
q.huang70b76492022-06-02 14:49:02 +08001150 lynq_call_id = find_call_id_with_call_id(*handle);
1151 if(lynq_call_id==INVALID_ID)
1152 {
llb3921072023-01-10 14:47:46 +08001153 //find end state
1154 if((*handle) >= 0)
1155 {
1156 *call_state = (int)LYNQ_CALL_END;
1157 return RESULT_OK;
1158 }
1159 else
1160 {
1161 return LYNQ_E_INVALID_ID_ANONALY;
1162 }
q.huang70b76492022-06-02 14:49:02 +08001163 }
q.huang52921662022-10-20 15:25:45 +08001164 *call_state = s_call_lists[lynq_call_id].call_state;
1165 *toa = s_call_lists[lynq_call_id].toa;
1166 *direction = s_call_lists[lynq_call_id].direction;
1167 memcpy(addr,s_call_lists[lynq_call_id].addr,strlen(s_call_lists[lynq_call_id].addr)+1);
llb3921072023-01-10 14:47:46 +08001168 return RESULT_OK;
q.huangec88da92022-03-29 04:17:32 -04001169}
1170
q.huange97cfcf2022-08-29 20:04:31 +08001171int lynq_get_current_call_number()
1172{
1173 int cnt=0;
1174 int i;
1175 for(i = 0;i < LYNQ_CALL_MAX;i++)
1176 {
q.huang52921662022-10-20 15:25:45 +08001177 if(s_call_lists[i].used !=0)
q.huange97cfcf2022-08-29 20:04:31 +08001178 {
1179 cnt++;
1180 }
1181 }
1182
1183 return cnt;
1184}
1185
q.huangec88da92022-03-29 04:17:32 -04001186/*audio begin*/
lldc99c9b2022-01-24 12:16:22 +00001187static int judge_mic(const int enable){
llf512fa32022-02-14 08:58:16 +00001188 switch(enable){
1189 case 0:
q.huang52921662022-10-20 15:25:45 +08001190 return true;
llf512fa32022-02-14 08:58:16 +00001191 case 1:
q.huang52921662022-10-20 15:25:45 +08001192 return true;
llf512fa32022-02-14 08:58:16 +00001193 default:
q.huang52921662022-10-20 15:25:45 +08001194 return false;
lldc99c9b2022-01-24 12:16:22 +00001195 }
1196}
1197
lh7b0674a2022-01-10 00:34:35 -08001198int lynq_set_mute_mic(const int enable)
lldc99c9b2022-01-24 12:16:22 +00001199{
q.huang52921662022-10-20 15:25:45 +08001200 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001201 {
q.huang52921662022-10-20 15:25:45 +08001202 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
lldc99c9b2022-01-24 12:16:22 +00001203 return LYNQ_E_CONFLICT;
1204 }
q.huang52921662022-10-20 15:25:45 +08001205 if(!judge_mic(enable)){
1206 return LYNQ_E_PARAMETER_ANONALY;
1207 }
1208 // return lynq_set_common_request(53,1,"%d",enable); //RIL_REQUEST_SET_MUTE
1209
1210 Parcel* p=NULL;
1211 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_MUTE,1,"%d",enable);
1212 if(ret==RESULT_OK)
1213 {
1214 delete p;
1215 }
1216 return ret;
q.huangec88da92022-03-29 04:17:32 -04001217}
1218int lynq_get_mute_mic(int *status)
1219{
q.huang52921662022-10-20 15:25:45 +08001220 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001221 {
q.huang52921662022-10-20 15:25:45 +08001222 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1223 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001224 }
q.huang52921662022-10-20 15:25:45 +08001225 return lynq_get_common_request(RIL_REQUEST_GET_MUTE,status);//54
lh7b0674a2022-01-10 00:34:35 -08001226}
ll72bf6c12022-03-24 10:22:25 +08001227
1228/**
1229 * @brief Check whether DTMF is valid
1230 *
1231 * @param callnum dtmf eg:0-9 * #
1232 * @return int
1233 */
1234static int judge_dtmf(const char callnum)
1235{
1236 if(callnum == '#')
1237 {
q.huang52921662022-10-20 15:25:45 +08001238 return true;
ll72bf6c12022-03-24 10:22:25 +08001239 }
1240 if(callnum == '*')
1241 {
q.huang52921662022-10-20 15:25:45 +08001242 return true;
ll72bf6c12022-03-24 10:22:25 +08001243 }
1244 if(callnum >= '0'&& callnum <= '9')
1245 {
q.huang52921662022-10-20 15:25:45 +08001246 return true;
ll72bf6c12022-03-24 10:22:25 +08001247 }
q.huang52921662022-10-20 15:25:45 +08001248 return false;
ll72bf6c12022-03-24 10:22:25 +08001249}
1250
ll209e6112022-07-20 09:30:19 +00001251int lynq_switch_waiting_or_holding_and_active(void)
1252{
q.huang52921662022-10-20 15:25:45 +08001253 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001254 {
q.huang52921662022-10-20 15:25:45 +08001255 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1256 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001257 }
q.huang52921662022-10-20 15:25:45 +08001258
1259 Parcel* p=NULL;
1260 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE,0,"");
1261 if(ret==RESULT_OK)
1262 {
1263 delete p;
1264 }
1265 return ret;
1266
1267#if 0
ll209e6112022-07-20 09:30:19 +00001268 Parcel p;
1269 lynq_client_t client;
1270 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001271 int token;
ll209e6112022-07-20 09:30:19 +00001272 int request = -1;
1273 int slot_id = -1;
1274 int error = -1;
1275 client.uToken = Global_uToken_call;
1276 client.request = RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE;
1277 client.paramLen = 0;
1278 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1279 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001280 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001281 if(send_request(lynq_call_client_sockfd,&client)==-1)
1282 {
1283 LYERRLOG("send request fail");
1284 return -1;
1285 }
1286 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001287 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001288 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
ll209e6112022-07-20 09:30:19 +00001289 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1290 return error;
q.huang52921662022-10-20 15:25:45 +08001291#endif
ll209e6112022-07-20 09:30:19 +00001292}
1293
1294int lynq_hangup_waiting_or_background(void)
1295{
q.huang52921662022-10-20 15:25:45 +08001296 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001297 {
q.huang52921662022-10-20 15:25:45 +08001298 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1299 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001300 }
q.huang52921662022-10-20 15:25:45 +08001301
1302 Parcel* p=NULL;
1303 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND,0,"");
1304 if(ret==RESULT_OK)
1305 {
1306 delete p;
1307 }
1308 return ret;
1309#if 0
ll209e6112022-07-20 09:30:19 +00001310 Parcel p;
1311 lynq_client_t client;
1312 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001313 int token;
ll209e6112022-07-20 09:30:19 +00001314 int request = -1;
1315 int slot_id = -1;
1316 int error = -1;
1317 client.uToken = Global_uToken_call;
1318 client.request = RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND;
1319 client.paramLen = 0;
1320 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1321 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001322 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001323 if(send_request(lynq_call_client_sockfd,&client)==-1)
1324 {
1325 LYERRLOG("send request fail");
1326 return -1;
1327 }
1328 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001329 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001330 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
ll209e6112022-07-20 09:30:19 +00001331 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1332 return error;
q.huang52921662022-10-20 15:25:45 +08001333#endif
ll209e6112022-07-20 09:30:19 +00001334}
1335
1336int lynq_hangup_foreground_resume_background(void)
1337{
q.huang52921662022-10-20 15:25:45 +08001338 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001339 {
q.huang52921662022-10-20 15:25:45 +08001340 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1341 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001342 }
q.huang52921662022-10-20 15:25:45 +08001343
1344 Parcel* p=NULL;
1345 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND,0,"");
1346 if(ret==RESULT_OK)
1347 {
1348 delete p;
1349 }
1350 return ret;
1351#if 0
ll209e6112022-07-20 09:30:19 +00001352 Parcel p;
1353 lynq_client_t client;
1354 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001355 int token;
ll209e6112022-07-20 09:30:19 +00001356 int request = -1;
1357 int slot_id = -1;
1358 int error = -1;
1359 client.uToken = Global_uToken_call;
1360 client.request = RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND;
1361 client.paramLen = 0;
1362 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1363 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001364 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001365 if(send_request(lynq_call_client_sockfd,&client)==-1)
1366 {
1367 LYERRLOG("send request fail");
1368 return -1;
1369 }
1370 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001371 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001372 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
ll209e6112022-07-20 09:30:19 +00001373 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1374 return error;
q.huang52921662022-10-20 15:25:45 +08001375#endif
ll209e6112022-07-20 09:30:19 +00001376}
1377
lh7b0674a2022-01-10 00:34:35 -08001378int lynq_set_DTMF(const char callnum)
1379{
q.huang52921662022-10-20 15:25:45 +08001380 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001381 {
q.huang52921662022-10-20 15:25:45 +08001382 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1383 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001384 }
ll72bf6c12022-03-24 10:22:25 +08001385 if(!judge_dtmf(callnum))
1386 {
1387 return LYNQ_E_CONFLICT;
1388 }
q.huang52921662022-10-20 15:25:45 +08001389 if(s_module_call_state!=CALL_ON)
lh7b0674a2022-01-10 00:34:35 -08001390 {
1391 LYERRLOG("LYNQ_E_CONFLICT");
1392 return LYNQ_E_CONFLICT;
1393 }
q.huang52921662022-10-20 15:25:45 +08001394
1395// return lynq_set_common_request(24,1,"%c",callnum); //RIL_REQUEST_DTMF
1396
1397 Parcel* p=NULL;
1398 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_DTMF,1,"%c",callnum);
1399 if(ret==RESULT_OK)
1400 {
1401 delete p;
1402 }
1403 return ret;
lh7b0674a2022-01-10 00:34:35 -08001404}
q.huangec88da92022-03-29 04:17:32 -04001405static int judge_volume(LYNQ_E_VOLUMN_SET set,const int volume){
1406 if(set==LYNQ_E_VOLUMN_SET_DTMF){
1407 if(volume < 0 ||volume >36){
1408 return 0;
1409 }
1410 }
1411 else if (set==LYNQ_E_VOLUMN_SET_SPEECH)
1412 {
1413 if(volume < 1 ||volume >7){
1414 return 0;
1415 }
lldc99c9b2022-01-24 12:16:22 +00001416 }
ll04ae4142022-01-27 05:54:38 +00001417 return 1;
lldc99c9b2022-01-24 12:16:22 +00001418}
lh7b0674a2022-01-10 00:34:35 -08001419int lynq_set_DTMF_volume(const int volume)
lldc99c9b2022-01-24 12:16:22 +00001420{
q.huang52921662022-10-20 15:25:45 +08001421 if(g_module_init_flag != MODULE_RUNNING)
1422 {
1423 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
lldc99c9b2022-01-24 12:16:22 +00001424 return LYNQ_E_CONFLICT;
1425 }
q.huang52921662022-10-20 15:25:45 +08001426 if(!judge_volume(LYNQ_E_VOLUMN_SET_DTMF,volume)){
1427 return LYNQ_E_PARAMETER_ANONALY;
1428 }
1429// return lynq_set_common_request(8003,1,"%d",volume);//LYNQ_REQUEST_SET_DTMF_VOLUME
1430 Parcel* p=NULL;
1431 int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_SET_DTMF_VOLUME,1,"%d",volume);
1432 if(ret==RESULT_OK)
1433 {
1434 delete p;
1435 }
1436 return ret;
lh7b0674a2022-01-10 00:34:35 -08001437}
q.huangb212fde2022-04-05 23:11:02 -04001438int lynq_set_speech_volume(const int volume)//mixer_set_volume
lh7b0674a2022-01-10 00:34:35 -08001439{
q.huang52921662022-10-20 15:25:45 +08001440 if(g_module_init_flag != MODULE_RUNNING)
lh7b0674a2022-01-10 00:34:35 -08001441 {
q.huang52921662022-10-20 15:25:45 +08001442 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
q.huangec88da92022-03-29 04:17:32 -04001443 return LYNQ_E_CONFLICT;
lh7b0674a2022-01-10 00:34:35 -08001444 }
q.huang52921662022-10-20 15:25:45 +08001445 if(!judge_volume(LYNQ_E_VOLUMN_SET_SPEECH,volume))
1446 {
1447 return LYNQ_E_PARAMETER_ANONALY;
1448 }
1449// return lynq_set_common_request(8009,1,"%d",volume); //LYNQ_REQUEST_SET_SPEECH_VOLUME
1450 Parcel* p=NULL;
1451 int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_SET_SPEECH_VOLUME,1,"%d",volume);
1452 if(ret==RESULT_OK)
1453 {
1454 delete p;
1455 }
1456 return ret;
lh7b0674a2022-01-10 00:34:35 -08001457}
q.huangec88da92022-03-29 04:17:32 -04001458int lynq_get_speech_volume(int* volumn)//mixer_get_volume
1459{
q.huang52921662022-10-20 15:25:45 +08001460 return lynq_get_common_request(LYNQ_REQUEST_GET_SPEECH_VOLUME,volumn);//8010
q.huangec88da92022-03-29 04:17:32 -04001461}
q.huangb212fde2022-04-05 23:11:02 -04001462int lynq_incall_record_start(const char* file_path)
q.huangec88da92022-03-29 04:17:32 -04001463{
q.huang52921662022-10-20 15:25:45 +08001464// return lynq_set_common_request(8011,2,"%s %s","1",file_path); //LYNQ_REQUEST_RECORD
1465 Parcel* p=NULL;
1466 int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_RECORD,2,"%s %s","1",file_path);
1467 if(ret==RESULT_OK)
1468 {
1469 delete p;
1470 }
1471 return ret;
q.huangec88da92022-03-29 04:17:32 -04001472}
1473int lynq_incall_record_stop()
1474{
q.huang52921662022-10-20 15:25:45 +08001475 if(g_module_init_flag != MODULE_RUNNING)
1476 {
1477 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1478 return LYNQ_E_CONFLICT;
1479 }
q.huangb212fde2022-04-05 23:11:02 -04001480 const char* unused_file="just_ocuupy_paramter_postion";
q.huang52921662022-10-20 15:25:45 +08001481// return lynq_set_common_request(8011,2,"%s %s","0",unused_file); //LYNQ_REQUEST_RECORD
1482 Parcel* p=NULL;
1483 int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_RECORD,2,"%s %s","0",unused_file);
1484 if(ret==RESULT_OK)
1485 {
1486 delete p;
1487 }
1488 return ret;
q.huangec88da92022-03-29 04:17:32 -04001489}
1490/*audio end*/
q.huang714145d2022-04-18 00:09:50 -04001491
q.huang036b6cf2023-01-10 14:29:20 +08001492
1493
1494bool is_support_urc(int urc_id)
1495{
1496 switch(urc_id)
1497 {
1498 case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
1499 case RIL_UNSOL_CALL_RING:
1500 case RIL_UNSOL_RINGBACK_TONE:
1501 case RIL_UNSOL_CALL_INFO_INDICATION:
1502#ifdef ECALL_SUPPORT
1503 case RIL_UNSOL_ECALL_INDICATIONS://9502
1504#endif
1505 return true;
1506 default:
1507 return false;
1508 }
1509}
1510
q.huang52921662022-10-20 15:25:45 +08001511void urc_msg_process(Parcel *p)
1512{
1513 int resp_type;
1514 int urcid;
1515 int slot_id;
q.huang036b6cf2023-01-10 14:29:20 +08001516
1517 int size=p->dataSize();
q.huang52921662022-10-20 15:25:45 +08001518 p->readInt32(&resp_type);
1519 p->readInt32(&urcid);
1520 p->readInt32(&slot_id);
q.huang036b6cf2023-01-10 14:29:20 +08001521 LYINFLOG("%s urc id = %d, slot_id = %d, size is %d, msg is %s",__func__, urcid,slot_id,size,requestToString(urcid));
q.huang52921662022-10-20 15:25:45 +08001522 switch (urcid)
1523 {
1524 case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED://1001
1525 {
1526 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
1527 lynqNoticeGetModuleCallList();
1528 break;
1529 }
1530 case RIL_UNSOL_CALL_RING: //1018
1531 {
1532 if(s_call_auto_answer==1)
1533 {
1534 lynq_call_answer();
1535 }
1536 break;
1537 }
1538 case RIL_UNSOL_RINGBACK_TONE: //1029
1539 case RIL_UNSOL_CALL_INFO_INDICATION://3049
1540 {
1541 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
1542 break;
1543 }
q.huang714145d2022-04-18 00:09:50 -04001544#ifdef ECALL_SUPPORT
q.huang52921662022-10-20 15:25:45 +08001545 case RIL_UNSOL_ECALL_INDICATIONS://9502
q.huange97cfcf2022-08-29 20:04:31 +08001546 {
q.huang52921662022-10-20 15:25:45 +08001547 urc_ecall_msg_process(p);
q.huange97cfcf2022-08-29 20:04:31 +08001548 }
q.huange97cfcf2022-08-29 20:04:31 +08001549#endif
q.huang52921662022-10-20 15:25:45 +08001550 default:
1551 break;
q.huangcb7b7292022-06-28 20:12:01 +08001552 }
q.huang5ca6c072022-06-06 16:15:31 +08001553}
q.huang5ca6c072022-06-06 16:15:31 +08001554
lh7b0674a2022-01-10 00:34:35 -08001555#if 0
1556int main(int argc,char **argv)
1557{
1558 int n = 0;
1559 n = lynq_init_call(lynq_call_state_change_test,2222);
1560 if(n<0)
1561 {
q.huang70b76492022-06-02 14:49:02 +08001562 LYDBGLOG("lynq init call fail!!!");
lh7b0674a2022-01-10 00:34:35 -08001563 return -1;
1564 }
q.huang70b76492022-06-02 14:49:02 +08001565 LYDBGLOG("lynq call init success!!!");
lh7b0674a2022-01-10 00:34:35 -08001566 char phoneNum[LYNQ_PHONE_NUMBER_MAX];
1567 sprintf(phoneNum,"18180053406 0",strlen("18180053406 0")+1);
1568 lynq_call(phoneNum);
1569 while(1)
1570 {
1571 sleep(1);
1572 }
1573 return 0;
1574}
1575#endif
1576/*Warren add for T800 platform 2021/11/19 end*/