blob: aa26125ede93073f450007a66519a736c6ac7624 [file] [log] [blame]
lh25827952022-01-10 00:34:35 -08001#include <stdio.h>
2#include <sys/types.h>
3#include <sys/socket.h>
4#include <arpa/inet.h>
5#include <fcntl.h>
6#include <string.h>
7#include <stdlib.h>
8#include <unistd.h>
9#include <binder/Parcel.h>
10#include <log/log.h>
11#include "lynq_call.h"
12#include <cutils/jstring.h>
13#include <pthread.h>
14#include "liblog/lynq_deflog.h"
15#define LYNQ_SERVICE_PORT 8088
16#define LYNQ_URC_SERVICE_PORT 8086
17#define LYNQ_REC_BUF 8192
18#define LYNQ_REQUEST_PARAM_BUF 8192
19#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3
20#define USER_LOG_TAG "LYNQ_CALL"
21
22using ::android::Parcel;
23 typedef enum {
24 LYNQ_CALL_ACTIVE = 0,
25 LYNQ_CALL_HOLDING = 1,
26 LYNQ_CALL_DIALING = 2, /* MO call only */
27 LYNQ_CALL_ALERTING = 3, /* MO call only */
28 LYNQ_CALL_INCOMING = 4, /* MT call only */
29 LYNQ_CALL_WAITING = 5 ,/* MT call only */
30}lynq_call_state_t;
31
32typedef struct{
33 int uToken;
34 int request;
35 int paramLen;
36 char param[LYNQ_REQUEST_PARAM_BUF];
37}lynq_client_t;
38typedef struct
39{
40 int used;
41 int call_id;
42 int call_state;
43 int toa;
44 int direction;/*0: MO call,1:MT call*/
45 char addr[LYNQ_PHONE_NUMBER_MAX];
46 int hasTimeout;
47}lynq_call_list_e_t;
48typedef struct
49{
50 int call_id;
51 int call_state;
52 int toa;
53 int direction;/*0: MO call,1:MT call*/
54 char addr[LYNQ_PHONE_NUMBER_MAX];
55}lynq_call_list_t;
56
57lynq_call_list_e_t lynq_call_lists[LYNQ_CALL_MAX]={};
58static pthread_mutex_t call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
59static pthread_cond_t call_state_change_cond = PTHREAD_COND_INITIALIZER;
60static pthread_mutex_t s_urc_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
61static pthread_cond_t s_urc_call_state_change_cond = PTHREAD_COND_INITIALIZER;
62static pthread_mutex_t s_incoming_call_mutex = PTHREAD_MUTEX_INITIALIZER;
63static pthread_cond_t s_incoming_call_cond = PTHREAD_COND_INITIALIZER;
64
65
66int s_urc_event_complete = 1;
67
68enum{
69 CALL_OFF=0,
70 CALL_ON=1
71}call_state;
72typedef enum{
73 LYNQ_E_CARDSTATE_ERROR=8000,
74 /* The voice service state is out of service*/
75 LYNQ_E_STATE_OUT_OF_SERVICE=8001,
76 /* The voice service state is EMERGENCY_ONLY*/
77 LYNQ_E_STATE_EMERGENCY_ONLY=8002,
78 /* The radio power is power off*/
79 LYNQ_E_STATE_POWER_OFF=8003,
80 LYNQ_E_TIME_OUT=8004,
81 /*create or open sms DB fail */
82 LYNQ_E_SMS_DB_FAIL=8005,
83 /*Failed to execute sql statement*/
84 LYNQ_E_SMS_SQL_FAIL = 8006,
85 LYNQ_E_SMS_NOT_FIND = 8007,
86 /* The logic conflict*/
87 LYNQ_E_CONFLICT=9000,
88 /*Null anomaly*/
89 LYNQ_E_NULL_ANONALY=9001
90}LYNQ_E;
91
92int lynq_call_state =CALL_OFF;
93int lynq_client_sockfd = 0;
94int Global_uToken = 0;
95int global_call_count =0;
96int global_call_auto_answer = 0;
97bool urc_recive_status = 1;
98bool call_list_loop = 1;
99int isDial = 0;
100int lynqIncomingCallId = 0;
101
102int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error)
103{
104 if(p.dataAvail() > 0)
105 {
106 p.readInt32(resp_type);
107 p.readInt32(request);
108 p.readInt32(slot_id);
109 p.readInt32(error);
110 return 0;
111 }
112 else
113 {
114 return -1;
115 }
116}
117int send_request(int sockfd,lynq_client_t *client_tmp)
118{
119 int ret=0;
120 ret = write(sockfd, client_tmp, LYQN_SEDN_BUF);
121 if(ret==-1)
122 {
123 perror("write error");
124 return -1;
125 }
126 return 0;
127}
128
129int get_response(int sockfd,Parcel &p)
130{
131 int len = 0;
132 char recvline[LYNQ_REC_BUF];
133 bzero(recvline,LYNQ_REC_BUF);
134 /* receive data from server */
135 len = read(sockfd, recvline, LYNQ_REC_BUF);
136 if(len == -1)
137 {
138 perror("read error");
139 return -1;
140 }
141 printf("===>n=%d\n",len);
142 if (recvline != NULL) {
143 p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
144 p.setDataPosition(0);
145 }
146 return 0;
147}
148static char *strdupReadString(Parcel &p) {
149 size_t stringlen;
150 const char16_t *s16;
151 s16 = p.readString16Inplace(&stringlen);
152 return strndup16to8(s16, stringlen);
153}
154
155int lynq_get_current_call_list(lynq_call_list_t call_list[LYNQ_CALL_MAX])
156{
157 Parcel p;
158 lynq_client_t client;
159 int resp_type = -1;
160 int request = -1;
161 int slot_id = -1;
162 int error = -1;
163 int call_num = 0;
164 int temp = 0;
165 char *remote_phoneNum = NULL;
166 char *remote_name= NULL;
167 char *uusData = NULL;
168 client.uToken = Global_uToken;
169 client.request = 9;//RIL_REQUEST_GET_CURRENT_CALLS
170 client.paramLen = 0;
171 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
172 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
173 if(send_request(lynq_client_sockfd,&client)==-1)
174 {
175 LYERRLOG("send request fail");
176 perror("[LYNQ_CALL] send request fail:");
177 return -1;
178 }
179 get_response(lynq_client_sockfd,p);
180 JumpHeader(p,&resp_type,&request,&slot_id,&error);
181 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
182 if(error == 0)
183 {
184 p.readInt32(&call_num);
185 global_call_count = call_num;
186 if(call_num<=0)
187 {
188 lynq_call_state = CALL_OFF;
189 return 0;
190 }
191 for(int i = 0;i < call_num;i++)
192 {
193 p.readInt32(&temp);
194 call_list[i].call_state = temp;
195 p.readInt32(&call_list[i].call_id);
196 p.readInt32(&call_list[i].toa);
197 p.readInt32(&temp);
198 p.readInt32(&temp);
199 call_list[i].direction = temp;
200 p.readInt32(&temp);
201 p.readInt32(&temp);
202 p.readInt32(&temp);
203 remote_phoneNum = strdupReadString(p);
204 memcpy(call_list[i].addr,remote_phoneNum,strlen(remote_phoneNum));
205 LYINFLOG("call_id=%d,call_state=%d,direction=%d,addr=%s,toa=%d",call_list[i].call_id,call_list[i].call_state,
206 call_list[i].direction,call_list[i].addr,call_list[i].toa);
207 p.readInt32(&temp);
208 remote_name = strdupReadString(p);
209 p.readInt32(&temp);
210 p.readInt32(&temp);
211 if(temp==0)
212 {
213 continue;
214 }
215 p.readInt32(&temp); /* UUS Information is present */
216 p.readInt32(&temp);
217 p.readInt32(&temp);
218 p.read(uusData,temp);
219 }
220 }
221 return 0;
222}
223
224void cleanCallList(int lynq_call_id)
225{
226 lynq_call_lists[lynq_call_id].call_id = 0;
227 lynq_call_lists[lynq_call_id].call_state = 0;
228 lynq_call_lists[lynq_call_id].toa = 0;
229 lynq_call_lists[lynq_call_id].direction = 0;
230 lynq_call_lists[lynq_call_id].used = 0;
231 lynq_call_lists[lynq_call_id].hasTimeout = 0;
232 memset(lynq_call_lists[lynq_call_id].addr,0,sizeof(lynq_call_lists[lynq_call_id].addr));
233}
234int getUnusedElement()
235{
236 for(int i=0;i < LYNQ_CALL_MAX; i++)
237 {
238 if(lynq_call_lists[i].used!=1)
239 {
240 return i;
241 }
242 }
243 return -1;
244}
245int updateAddr(char addr[])
246{
247 int ret = 0;
248 ret = getUnusedElement();
249 memcpy(lynq_call_lists[ret].addr,addr,strlen(addr)+1);
250 lynq_call_lists[ret].used = 1;
251 return ret;
252}
253void updateCallList(lynq_call_list_e_t *callList, int call_id,int call_state,int toa,int direction)
254{
255 callList->call_id = call_id;
256 callList->call_state = call_state;
257 callList->toa = toa;
258 callList->direction = direction;
259 callList->used = 1;
260 callList->hasTimeout = 0;
261 return;
262}
263int waitCallstateChange(int mtime)
264{
265 int ret = 0;
266 int sec = 0;
267 int usec = 0;
268 struct timespec start_tm;
269 clock_gettime(CLOCK_MONOTONIC, &start_tm);
270 struct timespec outTime;
271 sec = mtime/1000;
272 usec = mtime%1000;
273 outTime.tv_sec = start_tm.tv_sec + sec;
274 outTime.tv_nsec = start_tm.tv_nsec + usec*1000000;
275 pthread_mutex_lock(&call_state_change_mutex);
276 ret = pthread_cond_timedwait(&call_state_change_cond,&call_state_change_mutex,&outTime);
277 pthread_mutex_unlock(&call_state_change_mutex);
278 return ret;
279}
280int waitIncomingCall()
281{
282 int ret = 0;
283 pthread_mutex_lock(&s_incoming_call_mutex);
284 ret = pthread_cond_wait(&s_incoming_call_cond,&s_incoming_call_mutex);
285 pthread_mutex_unlock(&s_incoming_call_mutex);
286 return ret;
287}
288int checkHasCall(char addr[])
289{
290 for(int i = 0;i<LYNQ_CALL_MAX;i++)
291 {
292 if(strcmp(lynq_call_lists[i].addr,addr)==0)
293 {
294 return 1;
295 }
296 }
297 return 0;
298}
299void sendSignalToWaitCallStateChange()
300{
301 pthread_mutex_lock(&call_state_change_mutex);
302 pthread_cond_signal(&call_state_change_cond);
303 pthread_mutex_unlock(&call_state_change_mutex);
304}
305void sendSignalIncomingCall()
306{
307 pthread_mutex_lock(&s_incoming_call_mutex);
308 pthread_cond_signal(&s_incoming_call_cond);
309 pthread_mutex_unlock(&s_incoming_call_mutex);
310}
311
312void addCallListToLynqCallList(lynq_call_list_e_t *callList, int call_id,int call_state,int toa,int direction,char addr[LYNQ_PHONE_NUMBER_MAX])
313{
314 callList->call_id = call_id;
315 callList->call_state = call_state;
316 callList->toa = toa;
317 callList->direction = direction;
318 memcpy(callList->addr,addr,strlen(addr)+1);
319 callList->used = 1;
320 callList->hasTimeout = 0;
321 return;
322}
323
324void *triggerGetCallList(void *parg)
325{
326 int ret=0;
327 lynq_call_list_t call_list[LYNQ_CALL_MAX];
328 while(call_list_loop)
329 {
330 pthread_mutex_lock(&s_urc_call_state_change_mutex);
331 pthread_cond_wait(&s_urc_call_state_change_cond, &s_urc_call_state_change_mutex);
332 LYDBGLOG("triggerGetCallList event!!!\n");
333 memset(call_list,0,sizeof(call_list));
334 ret = lynq_get_current_call_list(call_list);
335 if(ret != 0)
336 {
337 printf("get current call list failure!!!\n");
338 break;
339 }
340 for(int i = 0;i < LYNQ_CALL_MAX;i++)
341 {
342 if(call_list[i].direction == 1)//MT call
343 {
344 if(call_list[i].call_state ==4)//LYNQ_CALL_INCOMING = 4, /* MT call only */
345 {
346 if(!checkHasCall(call_list[i].addr))
347 {
348 lynqIncomingCallId = getUnusedElement();
349 addCallListToLynqCallList(&lynq_call_lists[lynqIncomingCallId],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction,call_list[i].addr);
350 sendSignalIncomingCall();
351 }
352 }
353 }
354 else
355 {
356 if(call_list[i].call_id==0)
357 {
358 break;
359 }
360 for(int n = 0 ; n < LYNQ_CALL_MAX; n++)
361 {
362 if(lynq_call_lists[n].hasTimeout==1)
363 {
364 /*hangup call with id*/
365 lynq_call_hungup(&n);
366 lynq_call_lists[n].hasTimeout==0;
367 continue;
368 }
369 if(strcmp(call_list[i].addr,lynq_call_lists[n].addr)==0)
370 {
371 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
372 }
373 }
374 LYDBGLOG("[count:%d]call_id=%d,call_state=%d,direction=%d,addr=%s,toa=%d",i,call_list[i].call_id,call_list[i].call_state,
375 call_list[i].direction,call_list[i].addr,call_list[i].toa);
376 }
377 }
378 s_urc_event_complete = 1;
379 if(isDial==1)
380 {
381 sendSignalToWaitCallStateChange();
382 isDial = 0;
383 }
384 pthread_mutex_unlock(&s_urc_call_state_change_mutex);
385 }
386 return NULL;
387}
388
389void lynqRespWatingEvent()
390{
391 if(s_urc_event_complete==1)
392 {
393 pthread_mutex_lock(&s_urc_call_state_change_mutex);
394 pthread_cond_signal(&s_urc_call_state_change_cond);
395 s_urc_event_complete = 0;
396 pthread_mutex_unlock(&s_urc_call_state_change_mutex);
397 }
398 return;
399}
400
401/*Warren add for T800 platform 2021/11/19 start*/
402int lynq_socket_client_start()
403{
404 struct sockaddr_in lynq_socket_server_addr;
405 /* init lynq_socket_server_addr */
406 bzero(&lynq_socket_server_addr, sizeof(lynq_socket_server_addr));
407 lynq_socket_server_addr.sin_family = AF_INET;
408 lynq_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
409 lynq_socket_server_addr.sin_addr.s_addr = htons(INADDR_ANY);
410 /*
411 if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)
412 {
413 printf("[%s] is not a valid IPaddress\n", argv[1]);
414 exit(1);
415 }
416*/
417 lynq_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
418 if(connect(lynq_client_sockfd, (struct sockaddr *)&lynq_socket_server_addr, sizeof(lynq_socket_server_addr)) == -1)
419 {
420 perror("connect error");
421 return -1;
422 }
423 return 0;
424}
425int lynq_update_call_list_loop()
426{
427 int ret = 0;
428 pthread_t tid;
429 pthread_attr_t attr;
430 pthread_attr_init(&attr);
431 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
432 ret = pthread_create(&tid,&attr,triggerGetCallList,NULL);
433 if(ret < 0)
434 {
435 LYERRLOG("lynq_update_call_list_loop fail!!!");
436 return -1;
437 }
438 LYDBGLOG("lynq_update_call_list_loop success!!!\n");
439 return 0;
440
441}
442void *thread_urc_recv(void *parg)
443{
444 int socket_fd = (int64_t)parg;
445 int len=0;
446 socklen_t addr_len=0;
447 uint8_t *dataLength = NULL;
448 char urc_data[LYNQ_REC_BUF];
449 int slot_id = -1;
450 int resp_type = -1;
451 int urcid = -1;
452 Parcel *p = NULL;
453 struct sockaddr_in dest_addr;
454 LYINFLOG("thread_urc_recv in running....\n");
455 while(urc_recive_status)
456 {
457 bzero(urc_data,LYNQ_REC_BUF);
458 //get data msg
459 len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);
460 if(len <= 0)
461 {
462 perror("thread_urc_recv step2 fail:");
463 break;
464 }
465 LYDBGLOG("=====>urc data len<=====:%d\n",len);
466 p = new Parcel();
467 if(p==NULL)
468 {
469 RLOGD("new parcel failure!!!");
470 break;
471 }
472 p->setData((uint8_t *)urc_data,len); // p.setData((uint8_t *) buffer, buflen);
473 p->setDataPosition(0);
474 if(p->dataAvail() > 0)
475 {
476 p->readInt32(&resp_type);
477 p->readInt32(&urcid);
478 p->readInt32(&slot_id);
479 //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
480 switch (urcid)
481 {
482 case 1001://RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED
483 {
484 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
485 lynqRespWatingEvent();
486 break;
487 }
488 case 1018://RIL_UNSOL_CALL_RING
489 {
490 if(global_call_auto_answer==1)
491 {
492 lynq_call_answer();
493 }
494 break;
495 }
496 case 1029://RIL_UNSOL_RINGBACK_TONE
497 case 3049://RIL_UNSOL_CALL_INFO_INDICATION
498 {
499 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
500 break;
501 }
502 default:
503 break;
504 }
505 }
506 delete p;
507 p = NULL;
508 }
509 close(socket_fd);
510}
511int lynq_socket_urc_start()
512{
513 int socket_fd=0;
514 int rt=0;
515 int len=0;
516 int on=1;
517 struct sockaddr_in urc_local_addr;
518 pthread_t tid;
519 pthread_attr_t attr;
520 socket_fd = socket(AF_INET,SOCK_DGRAM,0);
521 printf("test 001\n");
522 if(socket_fd < 0)
523 {
524 perror("creaet socket for udp fail");
525 return -1;
526 }
527 urc_local_addr.sin_family = AF_INET;
528 urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
529 urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
530 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
531 rt = setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
532 if(rt<0)
533 {
534 perror("SO_REUSEADDR fail\n");
535 return -1;
536 }
537 rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
538 if (rt == -1)
539 {
540 perror("bind failed");
541 return -1;
542 }
543 pthread_attr_init(&attr);
544 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
545 rt = pthread_create(&tid,&attr,thread_urc_recv,(void *)socket_fd);
546 if(rt < 0)
547 {
548 printf("urc loop failure!!!\n");
549 return -1;
550 }
551 printf("urc loop success!!!\n");
552 return 0;
553}
554int getSelfElement(char addr[])
555{
556 for(int i=0;i < LYNQ_CALL_MAX; i++)
557 {
558 if(lynq_call_lists[i].used==1)
559 {
560 if(strcmp(lynq_call_lists[i].addr,addr)==0)
561 {
562 return i;
563 }
564
565 }
566 }
567 return -1;
568}
569
570void lynq_call_state_change_test(int soc_id)
571{
572 printf("call state change,sim:%d\n",soc_id);
573}
574int lynq_init_call(int uToken)
575{
576 int result = 0;
577 Global_uToken = uToken;
578 LYLOGSET(LOG_INFO);
579 LYLOGEINIT(USER_LOG_TAG);
580 result = lynq_socket_client_start();
581 if(result!=0)
582 {
583 return -1;
584 }
585 result = lynq_socket_urc_start();
586 if(result!=0)
587 {
588 return -1;
589 }
590 result = lynq_update_call_list_loop();
591 if(result!=0)
592 {
593 return -1;
594 }
595 memset(lynq_call_lists,0,sizeof(lynq_call_lists));
596 LYDBGLOG("lynq init call success!!!");
597 return 0;
598}
599int lynq_deinit_call()
600{
601 close(lynq_client_sockfd);
602 urc_recive_status = 0;
603 call_list_loop = 0;
604 return 0;
605}
606int lynq_call(int* handle,char addr[])
607{
608 Parcel p;
609 lynq_client_t client;
610 int resp_type = -1;
611 int request = -1;
612 int slot_id = -1;
613 int error = -1;
614 int lynq_call_id = -1;
615 if(addr==NULL)
616 {
617 LYERRLOG("Phone num is null!!!");
618 return -1;
619 }
620 client.uToken = Global_uToken;
621 client.request = 10;//RIL_REQUEST_DIAL
622 client.paramLen = 2;
623 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
624 memcpy(client.param,addr,strlen(addr)+1);
625 strcat(client.param," 0");
626 LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
627 if(send_request(lynq_client_sockfd,&client)==-1)
628 {
629 LYERRLOG("send request fail");
630 perror("[LYNQ_CALL] send request fail:");
631 return -1;
632 }
633 get_response(lynq_client_sockfd,p);
634 JumpHeader(p,&resp_type,&request,&slot_id,&error);
635 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
636 lynq_call_id = updateAddr(addr);
637 if(error==0)
638 {
639 isDial = 1;
640 if(waitCallstateChange(3000)==ETIMEDOUT)//3000ms
641 {
642 error = LYNQ_E_TIME_OUT;
643 LYERRLOG("timeout:wait Call state fail!!!");
644 lynq_call_lists[lynq_call_id].hasTimeout = 1;
645 return error;
646 }
647 *handle = lynq_call_id;
648 }
649 return error;
650}
651int lynq_call_answer()
652{
653 Parcel p;
654 lynq_client_t client;
655 int resp_type = -1;
656 int request = -1;
657 int slot_id = -1;
658 int error = -1;
659 client.uToken = Global_uToken;
660 client.request = 40;//RIL_REQUEST_DIAL
661 client.paramLen = 0;
662 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
663 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
664 if(send_request(lynq_client_sockfd,&client)==-1)
665 {
666 LYERRLOG("send request fail");
667 perror("[LYNQ_CALL] send request fail:");
668 return -1;
669 }
670 get_response(lynq_client_sockfd,p);
671 JumpHeader(p,&resp_type,&request,&slot_id,&error);
672 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
673 return error;
674}
675int lynq_call_hungup(int* handle)
676{
677 Parcel p;
678 lynq_client_t client;
679 int resp_type = -1;
680 int request = -1;
681 int slot_id = -1;
682 int error = -1;
683 int call_id = 0;
684 int lynq_call_id = 0;
685 client.uToken = Global_uToken;
686 client.request = 12;//RIL_REQUEST_HUNGUP
687 client.paramLen = 1;
688 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
689 lynq_call_id = *handle;
690 call_id = lynq_call_lists[lynq_call_id].call_id;
691 sprintf(client.param,"%d",call_id);
692 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
693 if(send_request(lynq_client_sockfd,&client)==-1)
694 {
695 LYERRLOG("send request fail");
696 perror("[LYNQ_CALL] send request fail:");
697 return -1;
698 }
699 get_response(lynq_client_sockfd,p);
700 JumpHeader(p,&resp_type,&request,&slot_id,&error);
701 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
702 if(error==0)
703 {
704 cleanCallList(lynq_call_id);
705 }
706 return error;
707}
708int lynq_call_hungup_all()
709{
710 Parcel p;
711 lynq_client_t client;
712 int resp_type = -1;
713 int request = -1;
714 int slot_id = -1;
715 int error = -1;
716 client.uToken = Global_uToken;
717 client.request = 17;//RIL_REQUEST_UDUB
718 client.paramLen = 0;
719 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
720 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
721 if(send_request(lynq_client_sockfd,&client)==-1)
722 {
723 LYERRLOG("send request fail");
724 perror("[LYNQ_CALL] send request fail:");
725 return -1;
726 }
727 get_response(lynq_client_sockfd,p);
728 JumpHeader(p,&resp_type,&request,&slot_id,&error);
729 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
730 return error;
731}
732int lynq_wait_incoming_call(int *handle)
733{
734 waitIncomingCall();
735 *handle = lynqIncomingCallId;
736 LYINFLOG("lynq incoming call id:%d",lynqIncomingCallId);
737 return 0;
738}
739
740int lynq_set_auto_answercall(const int mode)
741{
742 global_call_auto_answer = mode;
743 LYINFLOG("auto answer call mode =%d",mode);
744 return 0;
745}
746int lynq_get_mute_status(int *status)
747{
748 Parcel p;
749 lynq_client_t client;
750 int resp_type = -1;
751 int request = -1;
752 int slot_id = -1;
753 int error = -1;
754 if(status==NULL)
755 {
756 LYERRLOG("status is null");
757 return -1;
758 }
759 client.uToken = Global_uToken;
760 client.request = 54;//RIL_REQUEST_GET_MUTE
761 client.paramLen = 0;
762 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
763 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
764 if(send_request(lynq_client_sockfd,&client)==-1)
765 {
766 LYERRLOG("send request fail");
767 perror("[LYNQ_CALL] send request fail:");
768 return -1;
769 }
770 get_response(lynq_client_sockfd,p);
771 JumpHeader(p,&resp_type,&request,&slot_id,&error);
772 p.readInt32(status);
773 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
774 return error;
775}
776int lynq_set_mute_mic(const int enable)
777{
778 Parcel p;
779 lynq_client_t client;
780 int resp_type = -1;
781 int request = -1;
782 int slot_id = -1;
783 int error = -1;
784 client.uToken = Global_uToken;
785 client.request = 53;//RIL_REQUEST_SET_MUTE
786 client.paramLen = 1;
787 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
788 sprintf(client.param,"%d",enable);
789 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
790 if(send_request(lynq_client_sockfd,&client)==-1)
791 {
792 LYERRLOG("send request fail");
793 perror("[LYNQ_CALL] send request fail:");
794 return -1;
795 }
796 get_response(lynq_client_sockfd,p);
797 JumpHeader(p,&resp_type,&request,&slot_id,&error);
798 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
799 return error;
800}
801int lynq_set_DTMF(const char callnum)
802{
803 Parcel p;
804 lynq_client_t client;
805 int resp_type = -1;
806 int request = -1;
807 int slot_id = -1;
808 int error = -1;
809 if(!lynq_call_state)
810 {
811 LYERRLOG("LYNQ_E_CONFLICT");
812 return LYNQ_E_CONFLICT;
813 }
814 client.uToken = Global_uToken;
815 client.request = 24;//RIL_REQUEST_DTMF
816 client.paramLen = 1;
817 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
818 sprintf(client.param,"%c",callnum);
819 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
820 if(send_request(lynq_client_sockfd,&client)==-1)
821 {
822 LYERRLOG("send request fail");
823 perror("[LYNQ_CALL] send request fail:");
824 return -1;
825 }
826 get_response(lynq_client_sockfd,p);
827 JumpHeader(p,&resp_type,&request,&slot_id,&error);
828 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
829 return error;
830
831}
832int lynq_set_DTMF_volume(const int volume)
833{
834 Parcel p;
835 lynq_client_t client;
836 int resp_type = -1;
837 int request = -1;
838 int slot_id = -1;
839 int error = -1;
840 //if(!lynq_call_state)
841 //{
842 // LYERRLOG("LYNQ_E_CONFLICT");
843 // return LYNQ_E_CONFLICT;
844 //}
845 client.uToken = Global_uToken;
846 client.request = 8003;//LYNQ_REQUEST_SET_DTMF_VOLUME
847 client.paramLen = 1;
848 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
849 sprintf(client.param,"%d",volume);
850 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s\n",client.uToken,client.request,client.paramLen,client.param);
851 if(send_request(lynq_client_sockfd,&client)==-1)
852 {
853 LYERRLOG("send request fail");
854 perror("[LYNQ_CALL] send request fail:");
855 return -1;
856 }
857 get_response(lynq_client_sockfd,p);
858 JumpHeader(p,&resp_type,&request,&slot_id,&error);
859 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
860 return 0;
861}
862int lynq_get_current_call_state(int *handle, int *call_state,int *toa,int *direction,char addr[])
863{
864 int lynq_call_id = 0;
865 if(handle==NULL)
866 {
867 return LYNQ_E_NULL_ANONALY;
868 }
869 lynq_call_id = *handle;
870 *call_state = lynq_call_lists[lynq_call_id].call_state;
871 *toa = lynq_call_lists[lynq_call_id].toa;
872 *direction = lynq_call_lists[lynq_call_id].direction;
873 memcpy(addr,lynq_call_lists[lynq_call_id].addr,strlen(lynq_call_lists[lynq_call_id].addr)+1);
874 return 0;
875}
876
877#if 0
878int main(int argc,char **argv)
879{
880 int n = 0;
881 n = lynq_init_call(lynq_call_state_change_test,2222);
882 if(n<0)
883 {
884 printf("lynq init call fail!!!\n");
885 return -1;
886 }
887 printf("lynq call init success!!!\n");
888 char phoneNum[LYNQ_PHONE_NUMBER_MAX];
889 sprintf(phoneNum,"18180053406 0",strlen("18180053406 0")+1);
890 lynq_call(phoneNum);
891 while(1)
892 {
893 sleep(1);
894 }
895 return 0;
896}
897#endif
898/*Warren add for T800 platform 2021/11/19 end*/