blob: 002257f814aece4a2d97c28193b8f175ce26f18f [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){
758 if(g_module_init_flag != MODULE_CLOSED)
759 {
760 LYERRLOG("module state is %d",g_module_init_flag);
761 return LYNQ_E_CONFLICT;
762 }
763 if(utoken <0){
764 LYERRLOG("utoken is less than 0",utoken);
765 return LYNQ_E_PARAMETER_ANONALY;
766 }
767 g_module_init_flag = MODULE_SWITCHING;
768
769 LYLOGSET(LOG_INFO);
770 LYLOGEINIT(USER_LOG_TAG);
771
772 g_module_Global_uToken = utoken;
773
q.huang036b6cf2023-01-10 14:29:20 +0800774 int ret = lynq_start_all_urc_socket_thread();
q.huang52921662022-10-20 15:25:45 +0800775 if(ret != RESULT_OK)
776 {
777 LYERRLOG("init socket urc fail!!!");
778 g_module_init_flag = MODULE_CLOSED;
779 return LYNQ_E_INNER_ERROR;
780 }
781
q.huang036b6cf2023-01-10 14:29:20 +0800782 ret = lynq_start_all_rc_socket_thread();
q.huang52921662022-10-20 15:25:45 +0800783 if(ret !=RESULT_OK)
784 {
785 LYERRLOG("init socket client fail!!!");
q.huang036b6cf2023-01-10 14:29:20 +0800786 lynq_close_all_urc_socket_thread();
q.huang52921662022-10-20 15:25:45 +0800787 g_module_init_flag = MODULE_CLOSED;
788 return LYNQ_E_INNER_ERROR;
789 }
790
791
792 int result = lynq_start_call_list_loop();
793 if(ret != RESULT_OK)
794 {
795 LYERRLOG("lynq_start_call_list_loop fail!!!");
q.huang036b6cf2023-01-10 14:29:20 +0800796 lynq_close_all_urc_socket_thread();
797 lynq_close_all_rc_socket_thread();
q.huang52921662022-10-20 15:25:45 +0800798 g_module_init_flag = MODULE_CLOSED;
799 return LYNQ_E_INNER_ERROR;
800 }
801
802 lynq_init_rtp();
803
804 g_module_init_flag = MODULE_RUNNING;
805 return 0;
806}
807
808int lynq_deinit_call(void){
809
810 if (g_module_init_flag != MODULE_RUNNING)
811 {
812 LYERRLOG("module state is %d",g_module_init_flag);
813 return LYNQ_E_CONFLICT;
814 }
815 lynq_call_hungup_all();
q.huang52921662022-10-20 15:25:45 +0800816 g_module_init_flag = MODULE_SWITCHING;
q.huang036b6cf2023-01-10 14:29:20 +0800817 lynq_close_all_urc_socket_thread();
818 lynq_close_all_rc_socket_thread();
q.huang52921662022-10-20 15:25:45 +0800819 lynq_stop_call_list_loop();
820 g_module_init_flag = MODULE_CLOSED;
821 return 0;
822}
823
824#if 0
q.huang714145d2022-04-18 00:09:50 -0400825int lynq_set_common_request(int request_id, int argc, const char* format,...)
rita089527e2022-04-07 01:55:39 -0400826{
827 Parcel p;
828 lynq_client_t client;
829 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +0800830 int token;
rita089527e2022-04-07 01:55:39 -0400831 int request = -1;
832 int slot_id = -1;
833 int error = -1;
rita089527e2022-04-07 01:55:39 -0400834
q.huang52921662022-10-20 15:25:45 +0800835 Parcel* p=NULL;
836 int ret=lynq_send_common_request(request_id,5,p,argc,format,...);
837 if(ret==RESULT_OK)
838 {
839 delete p;
840 }
841 return ret;
842
rita089527e2022-04-07 01:55:39 -0400843 client.uToken = Global_uToken_call;
q.huang714145d2022-04-18 00:09:50 -0400844 client.request = request_id;
845 client.paramLen = argc;
rita089527e2022-04-07 01:55:39 -0400846 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang714145d2022-04-18 00:09:50 -0400847 if(argc!=0)
848 {
849 va_list args;
850 va_start(args, format);
851 vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
852 va_end(args);
853 }
q.huang70b76492022-06-02 14:49:02 +0800854 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rita089527e2022-04-07 01:55:39 -0400855 if(send_request(lynq_call_client_sockfd,&client)==-1)
856 {
857 LYERRLOG("send request fail");
858 return -1;
859 }
q.huang714145d2022-04-18 00:09:50 -0400860 if(get_response(lynq_call_client_sockfd,p)==0)
861 {
q.huang7de1d662022-09-13 14:19:24 +0800862 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
q.huang714145d2022-04-18 00:09:50 -0400863 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
864 }
rita089527e2022-04-07 01:55:39 -0400865 return error;
q.huang52921662022-10-20 15:25:45 +0800866
867
rita089527e2022-04-07 01:55:39 -0400868}
q.huang52921662022-10-20 15:25:45 +0800869#endif
rita089527e2022-04-07 01:55:39 -0400870
q.huang714145d2022-04-18 00:09:50 -0400871int lynq_get_common_request(int request_id, int* status)
rita089527e2022-04-07 01:55:39 -0400872{
q.huang714145d2022-04-18 00:09:50 -0400873 if(status==NULL)
874 {
875 LYERRLOG("status is null");
q.huang52921662022-10-20 15:25:45 +0800876 return LYNQ_E_PARAMETER_ANONALY;
q.huang714145d2022-04-18 00:09:50 -0400877 }
q.huang52921662022-10-20 15:25:45 +0800878
879 Parcel* p=NULL;
880 int ret=lynq_send_common_request(p,g_wait_time,request_id,0,"");
881 if(ret==RESULT_OK)
rita089527e2022-04-07 01:55:39 -0400882 {
q.huang52921662022-10-20 15:25:45 +0800883 p->readInt32(status);
884 delete p;
rita089527e2022-04-07 01:55:39 -0400885 }
q.huang52921662022-10-20 15:25:45 +0800886 return ret;
887}
888
889int waitCallstateChange(int mtime)
890{
891 LYINFLOG("wait Call state Change");
892 int ret = 0;
893 int sec = 0;
894 int usec = 0;
895 struct timeval now;
896 struct timespec timeout;
897 gettimeofday(&now,NULL);
898 sec = mtime/1000;
899 usec = mtime%1000;
900 timeout.tv_sec = now.tv_sec+sec;
901 timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
902 pthread_mutex_lock(&call_state_change_mutex);
903 ret = pthread_cond_timedwait(&call_state_change_cond,&call_state_change_mutex,&timeout);
904 pthread_mutex_unlock(&call_state_change_mutex);
905 return ret;
906}
907
908int IsNormalCallDailing()
909{
910 return s_module_isDial;
rita089527e2022-04-07 01:55:39 -0400911}
912
llb3921072023-01-10 14:47:46 +0800913
lh3b6f7ea2023-11-08 01:16:42 -0800914int check_file_access(const char *fileName)
915{
916 if(0 == access(fileName,F_OK))
917 {
918 LYINFLOG("find file %s success",fileName);
919 return 0;
920 }
921 LYERRLOG("find file %s fail",fileName);
922 return 1;
923}
924int try_reset_audio_service()
925{
926 //check files:audio-ctrl-service,libmodem-afe-service,speech_daemon
927 int ap_speech = 0;
928 int audio_ctrl_ser = 0;
929 int md_afe = 0;
930 int tele_demo_lock = 0;
931 LYINFLOG("try_reset_audio_service start");
932 ap_speech = check_file_access(AP_SPEECH);
933 audio_ctrl_ser = check_file_access(AUDIO_CTRL_SER);
934 md_afe = check_file_access(LIBMODEM_AFE);
935 tele_demo_lock = check_file_access(TELE_DEMO_LOCK);
936 if((ap_speech + audio_ctrl_ser + md_afe) > 0)
937 {
938 system("systemctl stop audio-ctrl-service");
939 system("systemctl stop speech_daemon");
940 system("systemctl stop libmodem_afe_service");
941 usleep(200000);//200ms
942 system("rm /tmp/audio_ctrl_service -rf");
943 system("rm /tmp/ap_speech -rf");
944 system("rm /tmp/libmodem-afe-ctrl -rf");
945 usleep(100000);//100ms
946 system("systemctl start libmodem_afe_service");
947 usleep(200000);//200ms
948 system("systemctl start speech_daemon");
949 usleep(200000);//200ms
950 system("systemctl start audio-ctrl-service");
951 sleep(1);//1s
952 LYERRLOG("reset audio relation service");
953 }
954 if(tele_demo_lock)
955 {
956 LYERRLOG("%s lose,why?",TELE_DEMO_LOCK);
957 }
958 return 0;
959}
960
lh7b0674a2022-01-10 00:34:35 -0800961int lynq_call(int* handle,char addr[])
962{
q.huang52921662022-10-20 15:25:45 +0800963 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -0700964 {
q.huang52921662022-10-20 15:25:45 +0800965 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
966 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -0700967 }
lh3b6f7ea2023-11-08 01:16:42 -0800968 try_reset_audio_service();
lh7b0674a2022-01-10 00:34:35 -0800969 int lynq_call_id = -1;
q.huang70b76492022-06-02 14:49:02 +0800970
971 LYINFLOG("lynq_call begin addr %s",addr);
lh7b0674a2022-01-10 00:34:35 -0800972 if(addr==NULL)
973 {
974 LYERRLOG("Phone num is null!!!");
q.huang52921662022-10-20 15:25:45 +0800975 return LYNQ_E_PARAMETER_ANONALY;
lh7b0674a2022-01-10 00:34:35 -0800976 }
q.huang70b76492022-06-02 14:49:02 +0800977
978 if(find_call_id_with_addr(addr)!=INVALID_ID)
979 {
980 LYERRLOG("addr %s exists",addr);
981 return LYNQ_E_CONFLICT;
982 }
983
984#ifdef ECALL_SUPPORT
985 if(lynq_ecall_is_running())
986 {
987 LYERRLOG("lynq_fast_ecall ecall is running");
988 return LYNQ_E_ECALL_BEING_RUNNING;
989 }
990#endif
q.huang52921662022-10-20 15:25:45 +0800991 Parcel* p=NULL;
992 lynq_call_id = addAddr(addr,0);
993 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_DIAL,2,"%s %d",addr, 0);
994 if(ret!=0)
995 {
llb3921072023-01-10 14:47:46 +0800996 cleanCallList(lynq_call_id);
q.huang52921662022-10-20 15:25:45 +0800997 return ret;
llb3921072023-01-10 14:47:46 +0800998 }
999 delete p;
q.huang52921662022-10-20 15:25:45 +08001000 s_module_isDial = 1;
1001 if(waitCallstateChange(6000)==ETIMEDOUT)//6000ms
lh7b0674a2022-01-10 00:34:35 -08001002 {
q.huang52921662022-10-20 15:25:45 +08001003 //if timeout,this call need destroy.
1004 s_module_isDial = 0;
1005 LYERRLOG("lynq_call timeout:wait Call state fail!!! clear local idx %d",lynq_call_id);
llb3921072023-01-10 14:47:46 +08001006 cleanCallList(lynq_call_id);
lle3b9a232023-01-14 13:21:20 +08001007 send_call_state_change();
q.huang52921662022-10-20 15:25:45 +08001008 return LYNQ_E_TIME_OUT;
lh7b0674a2022-01-10 00:34:35 -08001009 }
q.huang52921662022-10-20 15:25:45 +08001010 s_module_isDial = 0;
1011 *handle = s_call_lists[lynq_call_id].call_id;
1012 if(*handle > 0)
lh7b0674a2022-01-10 00:34:35 -08001013 {
q.huang52921662022-10-20 15:25:45 +08001014 LYINFLOG("lynq_call dial addr %s suc, id is %d",addr,*handle);
1015 return RESULT_OK;
lh7b0674a2022-01-10 00:34:35 -08001016 }
q.huang52921662022-10-20 15:25:45 +08001017 else
1018 {
1019 LYERRLOG("lynq_call dial addr %s fail, invalid id",addr);
lle3b9a232023-01-14 13:21:20 +08001020 cleanCallList(lynq_call_id);
1021 send_call_state_change();
q.huang52921662022-10-20 15:25:45 +08001022 return LYNQ_E_INVALID_ID_ANONALY;
llb3921072023-01-10 14:47:46 +08001023 }
lh7b0674a2022-01-10 00:34:35 -08001024}
llb3921072023-01-10 14:47:46 +08001025
lh7b0674a2022-01-10 00:34:35 -08001026int lynq_call_answer()
1027{
q.huang52921662022-10-20 15:25:45 +08001028 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001029 {
q.huang52921662022-10-20 15:25:45 +08001030 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1031 return LYNQ_E_CONFLICT;
1032 }
1033
1034 Parcel* p=NULL;
1035 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_ANSWER,0,"");
1036 if(ret==RESULT_OK)
lh7b0674a2022-01-10 00:34:35 -08001037 {
q.huang52921662022-10-20 15:25:45 +08001038 delete p;
1039 }
1040 return ret;
lh7b0674a2022-01-10 00:34:35 -08001041}
llb3921072023-01-10 14:47:46 +08001042
lh7b0674a2022-01-10 00:34:35 -08001043int lynq_call_hungup(int* handle)
1044{
q.huang52921662022-10-20 15:25:45 +08001045 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001046 {
q.huang52921662022-10-20 15:25:45 +08001047 return LYNQ_E_CONFLICT;
1048 }
1049
lh42c1e572022-01-25 18:47:39 -08001050 if(handle==NULL||!((*handle>=0)&&(*handle<10)))
1051 {
q.huang52921662022-10-20 15:25:45 +08001052 LYERRLOG("%s illegal input!!!!",__func__);
1053 return LYNQ_E_PARAMETER_ANONALY;
lh42c1e572022-01-25 18:47:39 -08001054 }
q.huang52921662022-10-20 15:25:45 +08001055
1056 int call_id = *handle;
1057 Parcel* p=NULL;
1058 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_HANGUP,1,"%d",call_id);
1059 if(ret!=0)
lh7b0674a2022-01-10 00:34:35 -08001060 {
q.huang52921662022-10-20 15:25:45 +08001061 return ret;
1062 }
1063 delete p;
1064
1065 int lynq_call_id=find_call_id_with_call_id(call_id);
1066 if(lynq_call_id!=INVALID_ID)
lh7b0674a2022-01-10 00:34:35 -08001067 {
q.huang52921662022-10-20 15:25:45 +08001068 cleanCallList(lynq_call_id);
1069 }
1070
1071 return RESULT_OK;
lh7b0674a2022-01-10 00:34:35 -08001072}
1073int lynq_call_hungup_all()
1074{
q.huang52921662022-10-20 15:25:45 +08001075 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001076 {
q.huang52921662022-10-20 15:25:45 +08001077 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1078 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001079 }
q.huang52921662022-10-20 15:25:45 +08001080
1081 Parcel* p=NULL;
1082 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_UDUB,0,"");
1083 if(ret==RESULT_OK)
lh7b0674a2022-01-10 00:34:35 -08001084 {
q.huang52921662022-10-20 15:25:45 +08001085 delete p;
1086 }
1087 return ret;
lh7b0674a2022-01-10 00:34:35 -08001088}
llb3921072023-01-10 14:47:46 +08001089
1090int lynq_wait_call_state_change(int *handle)
lh7b0674a2022-01-10 00:34:35 -08001091{
q.huang52921662022-10-20 15:25:45 +08001092 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001093 {
q.huang52921662022-10-20 15:25:45 +08001094 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1095 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001096 }
llb3921072023-01-10 14:47:46 +08001097 wait_call_state();
1098 *handle = s_CallId;
1099 LYINFLOG("lynq mo/mt call id:%d",s_CallId);
1100 return RESULT_OK;
lh7b0674a2022-01-10 00:34:35 -08001101}
1102
1103int lynq_set_auto_answercall(const int mode)
1104{
q.huang52921662022-10-20 15:25:45 +08001105 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001106 {
q.huang52921662022-10-20 15:25:45 +08001107 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1108 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001109 }
q.huang52921662022-10-20 15:25:45 +08001110 s_call_auto_answer = mode;
lh7b0674a2022-01-10 00:34:35 -08001111 LYINFLOG("auto answer call mode =%d",mode);
q.huang52921662022-10-20 15:25:45 +08001112 return RESULT_OK;
lh7b0674a2022-01-10 00:34:35 -08001113}
llb3921072023-01-10 14:47:46 +08001114
1115int lynq_find_already_end()
1116{
1117 for(int i=0;i < LYNQ_CALL_MAX; i++)
1118 {
1119 if(s_call_lists[i].call_state == 6)
1120 {
1121 return 0;
1122 }
1123 }
1124 return INVALID_ID;
1125}
1126
q.huangec88da92022-03-29 04:17:32 -04001127int lynq_get_current_call_state(int *handle, int *call_state,int *toa,int *direction,char addr[])
1128{
q.huang52921662022-10-20 15:25:45 +08001129 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001130 {
q.huang52921662022-10-20 15:25:45 +08001131 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1132 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001133 }
q.huangec88da92022-03-29 04:17:32 -04001134 int lynq_call_id = 0;
q.huang70b76492022-06-02 14:49:02 +08001135 LYINFLOG("lynq_get_current_call_state begin ");
q.huangec88da92022-03-29 04:17:32 -04001136 if(handle==NULL)
1137 {
q.huang70b76492022-06-02 14:49:02 +08001138 LYERRLOG("handle is NULL");
q.huang52921662022-10-20 15:25:45 +08001139 return LYNQ_E_PARAMETER_ANONALY;
q.huangec88da92022-03-29 04:17:32 -04001140 }
llb3921072023-01-10 14:47:46 +08001141 LYINFLOG("lynq_get_current_call_state %d\n ", *handle);
q.huang70b76492022-06-02 14:49:02 +08001142 lynq_call_id = find_call_id_with_call_id(*handle);
1143 if(lynq_call_id==INVALID_ID)
1144 {
llb3921072023-01-10 14:47:46 +08001145 //find end state
1146 if((*handle) >= 0)
1147 {
1148 *call_state = (int)LYNQ_CALL_END;
1149 return RESULT_OK;
1150 }
1151 else
1152 {
1153 return LYNQ_E_INVALID_ID_ANONALY;
1154 }
q.huang70b76492022-06-02 14:49:02 +08001155 }
q.huang52921662022-10-20 15:25:45 +08001156 *call_state = s_call_lists[lynq_call_id].call_state;
1157 *toa = s_call_lists[lynq_call_id].toa;
1158 *direction = s_call_lists[lynq_call_id].direction;
1159 memcpy(addr,s_call_lists[lynq_call_id].addr,strlen(s_call_lists[lynq_call_id].addr)+1);
llb3921072023-01-10 14:47:46 +08001160 return RESULT_OK;
q.huangec88da92022-03-29 04:17:32 -04001161}
1162
q.huange97cfcf2022-08-29 20:04:31 +08001163int lynq_get_current_call_number()
1164{
1165 int cnt=0;
1166 int i;
1167 for(i = 0;i < LYNQ_CALL_MAX;i++)
1168 {
q.huang52921662022-10-20 15:25:45 +08001169 if(s_call_lists[i].used !=0)
q.huange97cfcf2022-08-29 20:04:31 +08001170 {
1171 cnt++;
1172 }
1173 }
1174
1175 return cnt;
1176}
1177
q.huangec88da92022-03-29 04:17:32 -04001178/*audio begin*/
lldc99c9b2022-01-24 12:16:22 +00001179static int judge_mic(const int enable){
llf512fa32022-02-14 08:58:16 +00001180 switch(enable){
1181 case 0:
q.huang52921662022-10-20 15:25:45 +08001182 return true;
llf512fa32022-02-14 08:58:16 +00001183 case 1:
q.huang52921662022-10-20 15:25:45 +08001184 return true;
llf512fa32022-02-14 08:58:16 +00001185 default:
q.huang52921662022-10-20 15:25:45 +08001186 return false;
lldc99c9b2022-01-24 12:16:22 +00001187 }
1188}
1189
lh7b0674a2022-01-10 00:34:35 -08001190int lynq_set_mute_mic(const int enable)
lldc99c9b2022-01-24 12:16:22 +00001191{
q.huang52921662022-10-20 15:25:45 +08001192 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001193 {
q.huang52921662022-10-20 15:25:45 +08001194 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
lldc99c9b2022-01-24 12:16:22 +00001195 return LYNQ_E_CONFLICT;
1196 }
q.huang52921662022-10-20 15:25:45 +08001197 if(!judge_mic(enable)){
1198 return LYNQ_E_PARAMETER_ANONALY;
1199 }
1200 // return lynq_set_common_request(53,1,"%d",enable); //RIL_REQUEST_SET_MUTE
1201
1202 Parcel* p=NULL;
1203 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_MUTE,1,"%d",enable);
1204 if(ret==RESULT_OK)
1205 {
1206 delete p;
1207 }
1208 return ret;
q.huangec88da92022-03-29 04:17:32 -04001209}
1210int lynq_get_mute_mic(int *status)
1211{
q.huang52921662022-10-20 15:25:45 +08001212 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001213 {
q.huang52921662022-10-20 15:25:45 +08001214 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1215 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001216 }
q.huang52921662022-10-20 15:25:45 +08001217 return lynq_get_common_request(RIL_REQUEST_GET_MUTE,status);//54
lh7b0674a2022-01-10 00:34:35 -08001218}
ll72bf6c12022-03-24 10:22:25 +08001219
1220/**
1221 * @brief Check whether DTMF is valid
1222 *
1223 * @param callnum dtmf eg:0-9 * #
1224 * @return int
1225 */
1226static int judge_dtmf(const char callnum)
1227{
1228 if(callnum == '#')
1229 {
q.huang52921662022-10-20 15:25:45 +08001230 return true;
ll72bf6c12022-03-24 10:22:25 +08001231 }
1232 if(callnum == '*')
1233 {
q.huang52921662022-10-20 15:25:45 +08001234 return true;
ll72bf6c12022-03-24 10:22:25 +08001235 }
1236 if(callnum >= '0'&& callnum <= '9')
1237 {
q.huang52921662022-10-20 15:25:45 +08001238 return true;
ll72bf6c12022-03-24 10:22:25 +08001239 }
q.huang52921662022-10-20 15:25:45 +08001240 return false;
ll72bf6c12022-03-24 10:22:25 +08001241}
1242
ll209e6112022-07-20 09:30:19 +00001243int lynq_switch_waiting_or_holding_and_active(void)
1244{
q.huang52921662022-10-20 15:25:45 +08001245 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001246 {
q.huang52921662022-10-20 15:25:45 +08001247 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1248 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001249 }
q.huang52921662022-10-20 15:25:45 +08001250
1251 Parcel* p=NULL;
1252 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE,0,"");
1253 if(ret==RESULT_OK)
1254 {
1255 delete p;
1256 }
1257 return ret;
1258
1259#if 0
ll209e6112022-07-20 09:30:19 +00001260 Parcel p;
1261 lynq_client_t client;
1262 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001263 int token;
ll209e6112022-07-20 09:30:19 +00001264 int request = -1;
1265 int slot_id = -1;
1266 int error = -1;
1267 client.uToken = Global_uToken_call;
1268 client.request = RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE;
1269 client.paramLen = 0;
1270 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1271 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001272 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001273 if(send_request(lynq_call_client_sockfd,&client)==-1)
1274 {
1275 LYERRLOG("send request fail");
1276 return -1;
1277 }
1278 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001279 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001280 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
ll209e6112022-07-20 09:30:19 +00001281 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1282 return error;
q.huang52921662022-10-20 15:25:45 +08001283#endif
ll209e6112022-07-20 09:30:19 +00001284}
1285
1286int lynq_hangup_waiting_or_background(void)
1287{
q.huang52921662022-10-20 15:25:45 +08001288 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001289 {
q.huang52921662022-10-20 15:25:45 +08001290 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1291 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001292 }
q.huang52921662022-10-20 15:25:45 +08001293
1294 Parcel* p=NULL;
1295 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND,0,"");
1296 if(ret==RESULT_OK)
1297 {
1298 delete p;
1299 }
1300 return ret;
1301#if 0
ll209e6112022-07-20 09:30:19 +00001302 Parcel p;
1303 lynq_client_t client;
1304 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001305 int token;
ll209e6112022-07-20 09:30:19 +00001306 int request = -1;
1307 int slot_id = -1;
1308 int error = -1;
1309 client.uToken = Global_uToken_call;
1310 client.request = RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND;
1311 client.paramLen = 0;
1312 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1313 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001314 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001315 if(send_request(lynq_call_client_sockfd,&client)==-1)
1316 {
1317 LYERRLOG("send request fail");
1318 return -1;
1319 }
1320 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001321 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001322 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
ll209e6112022-07-20 09:30:19 +00001323 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1324 return error;
q.huang52921662022-10-20 15:25:45 +08001325#endif
ll209e6112022-07-20 09:30:19 +00001326}
1327
1328int lynq_hangup_foreground_resume_background(void)
1329{
q.huang52921662022-10-20 15:25:45 +08001330 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001331 {
q.huang52921662022-10-20 15:25:45 +08001332 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1333 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001334 }
q.huang52921662022-10-20 15:25:45 +08001335
1336 Parcel* p=NULL;
1337 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND,0,"");
1338 if(ret==RESULT_OK)
1339 {
1340 delete p;
1341 }
1342 return ret;
1343#if 0
ll209e6112022-07-20 09:30:19 +00001344 Parcel p;
1345 lynq_client_t client;
1346 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001347 int token;
ll209e6112022-07-20 09:30:19 +00001348 int request = -1;
1349 int slot_id = -1;
1350 int error = -1;
1351 client.uToken = Global_uToken_call;
1352 client.request = RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND;
1353 client.paramLen = 0;
1354 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1355 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
ll630be412022-07-25 05:52:14 +00001356 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
ll209e6112022-07-20 09:30:19 +00001357 if(send_request(lynq_call_client_sockfd,&client)==-1)
1358 {
1359 LYERRLOG("send request fail");
1360 return -1;
1361 }
1362 get_response(lynq_call_client_sockfd,p);
ll630be412022-07-25 05:52:14 +00001363 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +08001364 JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);
ll209e6112022-07-20 09:30:19 +00001365 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1366 return error;
q.huang52921662022-10-20 15:25:45 +08001367#endif
ll209e6112022-07-20 09:30:19 +00001368}
1369
lh7b0674a2022-01-10 00:34:35 -08001370int lynq_set_DTMF(const char callnum)
1371{
q.huang52921662022-10-20 15:25:45 +08001372 if(g_module_init_flag != MODULE_RUNNING)
ll27dbe752022-08-10 00:33:52 -07001373 {
q.huang52921662022-10-20 15:25:45 +08001374 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1375 return LYNQ_E_CONFLICT;
ll27dbe752022-08-10 00:33:52 -07001376 }
ll72bf6c12022-03-24 10:22:25 +08001377 if(!judge_dtmf(callnum))
1378 {
1379 return LYNQ_E_CONFLICT;
1380 }
q.huang52921662022-10-20 15:25:45 +08001381 if(s_module_call_state!=CALL_ON)
lh7b0674a2022-01-10 00:34:35 -08001382 {
1383 LYERRLOG("LYNQ_E_CONFLICT");
1384 return LYNQ_E_CONFLICT;
1385 }
q.huang52921662022-10-20 15:25:45 +08001386
1387// return lynq_set_common_request(24,1,"%c",callnum); //RIL_REQUEST_DTMF
1388
1389 Parcel* p=NULL;
1390 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_DTMF,1,"%c",callnum);
1391 if(ret==RESULT_OK)
1392 {
1393 delete p;
1394 }
1395 return ret;
lh7b0674a2022-01-10 00:34:35 -08001396}
q.huangec88da92022-03-29 04:17:32 -04001397static int judge_volume(LYNQ_E_VOLUMN_SET set,const int volume){
1398 if(set==LYNQ_E_VOLUMN_SET_DTMF){
1399 if(volume < 0 ||volume >36){
1400 return 0;
1401 }
1402 }
1403 else if (set==LYNQ_E_VOLUMN_SET_SPEECH)
1404 {
1405 if(volume < 1 ||volume >7){
1406 return 0;
1407 }
lldc99c9b2022-01-24 12:16:22 +00001408 }
ll04ae4142022-01-27 05:54:38 +00001409 return 1;
lldc99c9b2022-01-24 12:16:22 +00001410}
lh7b0674a2022-01-10 00:34:35 -08001411int lynq_set_DTMF_volume(const int volume)
lldc99c9b2022-01-24 12:16:22 +00001412{
q.huang52921662022-10-20 15:25:45 +08001413 if(g_module_init_flag != MODULE_RUNNING)
1414 {
1415 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
lldc99c9b2022-01-24 12:16:22 +00001416 return LYNQ_E_CONFLICT;
1417 }
q.huang52921662022-10-20 15:25:45 +08001418 if(!judge_volume(LYNQ_E_VOLUMN_SET_DTMF,volume)){
1419 return LYNQ_E_PARAMETER_ANONALY;
1420 }
1421// return lynq_set_common_request(8003,1,"%d",volume);//LYNQ_REQUEST_SET_DTMF_VOLUME
1422 Parcel* p=NULL;
1423 int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_SET_DTMF_VOLUME,1,"%d",volume);
1424 if(ret==RESULT_OK)
1425 {
1426 delete p;
1427 }
1428 return ret;
lh7b0674a2022-01-10 00:34:35 -08001429}
q.huangb212fde2022-04-05 23:11:02 -04001430int lynq_set_speech_volume(const int volume)//mixer_set_volume
lh7b0674a2022-01-10 00:34:35 -08001431{
q.huang52921662022-10-20 15:25:45 +08001432 if(g_module_init_flag != MODULE_RUNNING)
lh7b0674a2022-01-10 00:34:35 -08001433 {
q.huang52921662022-10-20 15:25:45 +08001434 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
q.huangec88da92022-03-29 04:17:32 -04001435 return LYNQ_E_CONFLICT;
lh7b0674a2022-01-10 00:34:35 -08001436 }
q.huang52921662022-10-20 15:25:45 +08001437 if(!judge_volume(LYNQ_E_VOLUMN_SET_SPEECH,volume))
1438 {
1439 return LYNQ_E_PARAMETER_ANONALY;
1440 }
1441// return lynq_set_common_request(8009,1,"%d",volume); //LYNQ_REQUEST_SET_SPEECH_VOLUME
1442 Parcel* p=NULL;
1443 int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_SET_SPEECH_VOLUME,1,"%d",volume);
1444 if(ret==RESULT_OK)
1445 {
1446 delete p;
1447 }
1448 return ret;
lh7b0674a2022-01-10 00:34:35 -08001449}
q.huangec88da92022-03-29 04:17:32 -04001450int lynq_get_speech_volume(int* volumn)//mixer_get_volume
1451{
q.huang52921662022-10-20 15:25:45 +08001452 return lynq_get_common_request(LYNQ_REQUEST_GET_SPEECH_VOLUME,volumn);//8010
q.huangec88da92022-03-29 04:17:32 -04001453}
q.huangb212fde2022-04-05 23:11:02 -04001454int lynq_incall_record_start(const char* file_path)
q.huangec88da92022-03-29 04:17:32 -04001455{
q.huang52921662022-10-20 15:25:45 +08001456// return lynq_set_common_request(8011,2,"%s %s","1",file_path); //LYNQ_REQUEST_RECORD
1457 Parcel* p=NULL;
1458 int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_RECORD,2,"%s %s","1",file_path);
1459 if(ret==RESULT_OK)
1460 {
1461 delete p;
1462 }
1463 return ret;
q.huangec88da92022-03-29 04:17:32 -04001464}
1465int lynq_incall_record_stop()
1466{
q.huang52921662022-10-20 15:25:45 +08001467 if(g_module_init_flag != MODULE_RUNNING)
1468 {
1469 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1470 return LYNQ_E_CONFLICT;
1471 }
q.huangb212fde2022-04-05 23:11:02 -04001472 const char* unused_file="just_ocuupy_paramter_postion";
q.huang52921662022-10-20 15:25:45 +08001473// return lynq_set_common_request(8011,2,"%s %s","0",unused_file); //LYNQ_REQUEST_RECORD
1474 Parcel* p=NULL;
1475 int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_RECORD,2,"%s %s","0",unused_file);
1476 if(ret==RESULT_OK)
1477 {
1478 delete p;
1479 }
1480 return ret;
q.huangec88da92022-03-29 04:17:32 -04001481}
1482/*audio end*/
q.huang714145d2022-04-18 00:09:50 -04001483
q.huang036b6cf2023-01-10 14:29:20 +08001484
1485
1486bool is_support_urc(int urc_id)
1487{
1488 switch(urc_id)
1489 {
1490 case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
1491 case RIL_UNSOL_CALL_RING:
1492 case RIL_UNSOL_RINGBACK_TONE:
1493 case RIL_UNSOL_CALL_INFO_INDICATION:
1494#ifdef ECALL_SUPPORT
1495 case RIL_UNSOL_ECALL_INDICATIONS://9502
1496#endif
1497 return true;
1498 default:
1499 return false;
1500 }
1501}
1502
q.huang52921662022-10-20 15:25:45 +08001503void urc_msg_process(Parcel *p)
1504{
1505 int resp_type;
1506 int urcid;
1507 int slot_id;
q.huang036b6cf2023-01-10 14:29:20 +08001508
1509 int size=p->dataSize();
q.huang52921662022-10-20 15:25:45 +08001510 p->readInt32(&resp_type);
1511 p->readInt32(&urcid);
1512 p->readInt32(&slot_id);
q.huang036b6cf2023-01-10 14:29:20 +08001513 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 +08001514 switch (urcid)
1515 {
1516 case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED://1001
1517 {
1518 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
1519 lynqNoticeGetModuleCallList();
1520 break;
1521 }
1522 case RIL_UNSOL_CALL_RING: //1018
1523 {
1524 if(s_call_auto_answer==1)
1525 {
1526 lynq_call_answer();
1527 }
1528 break;
1529 }
1530 case RIL_UNSOL_RINGBACK_TONE: //1029
1531 case RIL_UNSOL_CALL_INFO_INDICATION://3049
1532 {
1533 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
1534 break;
1535 }
q.huang714145d2022-04-18 00:09:50 -04001536#ifdef ECALL_SUPPORT
q.huang52921662022-10-20 15:25:45 +08001537 case RIL_UNSOL_ECALL_INDICATIONS://9502
q.huange97cfcf2022-08-29 20:04:31 +08001538 {
q.huang52921662022-10-20 15:25:45 +08001539 urc_ecall_msg_process(p);
q.huange97cfcf2022-08-29 20:04:31 +08001540 }
q.huange97cfcf2022-08-29 20:04:31 +08001541#endif
q.huang52921662022-10-20 15:25:45 +08001542 default:
1543 break;
q.huangcb7b7292022-06-28 20:12:01 +08001544 }
q.huang5ca6c072022-06-06 16:15:31 +08001545}
q.huang5ca6c072022-06-06 16:15:31 +08001546
lh7b0674a2022-01-10 00:34:35 -08001547#if 0
1548int main(int argc,char **argv)
1549{
1550 int n = 0;
1551 n = lynq_init_call(lynq_call_state_change_test,2222);
1552 if(n<0)
1553 {
q.huang70b76492022-06-02 14:49:02 +08001554 LYDBGLOG("lynq init call fail!!!");
lh7b0674a2022-01-10 00:34:35 -08001555 return -1;
1556 }
q.huang70b76492022-06-02 14:49:02 +08001557 LYDBGLOG("lynq call init success!!!");
lh7b0674a2022-01-10 00:34:35 -08001558 char phoneNum[LYNQ_PHONE_NUMBER_MAX];
1559 sprintf(phoneNum,"18180053406 0",strlen("18180053406 0")+1);
1560 lynq_call(phoneNum);
1561 while(1)
1562 {
1563 sleep(1);
1564 }
1565 return 0;
1566}
1567#endif
1568/*Warren add for T800 platform 2021/11/19 end*/