blob: ccab09f3fcf1218cf1add9524ec65452ee90d668 [file] [log] [blame]
liubin281ac462023-07-19 14:22:54 +08001#include "lynq/lynq_call_api.h"
2#include "mbtk_info_api.h"
3
4static mbtk_info_handle_t* info_handle = NULL;
5int lynq_volume_size = 0;
b.liu5fa9e772023-11-23 18:00:55 +08006#ifdef MBTK_PLATFORM_ASR1803
liubin281ac462023-07-19 14:22:54 +08007mbtk_audio_client_handle_type lynq_dtmf_handle;
b.liu5fa9e772023-11-23 18:00:55 +08008#endif
liubin281ac462023-07-19 14:22:54 +08009mbtk_call_info_t lynq_reg[5]={0};
10int *handle_ptr=null;
11void (*incoming_call_cb_p)(int x)=NULL;
12void lynq_call_state_change_cb(const void* data, int data_len)
13{
14 mbtk_call_info_t *reg = (mbtk_call_info_t *)data;
15 switch (reg->call_wait)
16 {
17 case MBTK_CLCC:
18 {
19 lynq_reg[reg->dir1].dir1 = reg->dir1;
20 lynq_reg[reg->dir1].dir = reg->dir;
21 lynq_reg[reg->dir1].state = reg->state;
22 lynq_reg[reg->dir1].mode = reg->mode;
23 lynq_reg[reg->dir1].mpty = reg->mpty;
24 memset(lynq_reg[reg->dir1].phone_number,0,strlen(reg->phone_number));
25 memcpy(lynq_reg[reg->dir1].phone_number,reg->phone_number,strlen(reg->phone_number));
26 lynq_reg[reg->dir1].type = reg->type;
27 printf("\r\nRING : %d, %d, %d, %d, %d, %s, %d, %d\r\n", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type,strlen(reg->phone_number));
28 if(handle_ptr != null)
29 {
30 if(*handle_ptr != reg->dir1)
31 {
32 *handle_ptr = reg->dir1;
33 printf("reg->dir1 : %d\r\n handle=%d\n", reg->dir1,*handle_ptr);
34 handle_ptr = NULL;
35 }
36 }
37 if(reg->dir == 1)
38 (*incoming_call_cb_p)(reg->dir1);
39 break;
40 }
41 case MBTK_DISCONNECTED:
42 memset(&(lynq_reg[reg->disconnected_id]),0,sizeof(lynq_reg[reg->disconnected_id]));
43 printf("\r\nRING : call dis connected: %d!\r\n", reg->disconnected_id);
44 printf("phone number : %s",lynq_reg[reg->disconnected_id].phone_number);
45 lynq_set_mute_mic(0);
46 break;
47 case MBTK_CPAS:
48 printf("\r\nCALL : Call state = %d\r\n", reg->pas);
49 /*
50 MBTK_CALL_RADY, //MT allows commands from TA/TE
51 MBTK_CALL_UNAVAILABLE, //MT does not allow commands from TA/TE
52 MBTK_CALL_UNKNOWN, //MT is not guaranteed to respond to instructions
53 MBTK_CALL_RINGING, //MT is ready for commands from TA/TE, but the ringer is active
54 MBTK_CALL_PROGRESS, //MT is ready for commands from TA/TE, but a call is in progress
55 MBTK_CALL_ASLEEP, //MT is unable to process commands from TA/TE because it is in a low functionality state
56 MBTK_CALL_ACTIVE,
57 */
58 switch (reg->pas)
59 {
60 case MBTK_CALL_RADY:
61 printf("CALL: call READY\r\n");
62 break;
63 case MBTK_CALL_UNAVAILABLE:
64 printf("CALL: call unavaliable\r\n");
65 break;
66 case MBTK_CALL_UNKNOWN:
67 printf("CALL: call unknown\r\n");
68 break;
69 case MBTK_CALL_RINGING:
70 printf("CALL: call ringing\r\n");
71 break;
72 case MBTK_CALL_PROGRESS:
73 printf("CALL: call progress\r\n");
74 break;
75 case MBTK_CALL_ASLEEP:
76 printf("CALL: call asleep\r\n");
77 break;
78 case MBTK_CALL_ACTIVE:
79 printf("CALL: call active\r\n");
80 break;
81 default:
82 printf("\r\n");
83 break;
84 }
85 break;
86 default:
87 printf("\r\nRING : None call_wait = %d\r\n", reg->call_wait);
88 break;
89 }
90 /*
91 if(reg->call_wait == ) //CLCC
92 {
93 printf("\r\nRING : %d, %d, %d, %d, %d, %s, %d\r\n", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type);
94 }
95 else if(reg->call_wait == 2) //Disconnected
96 {
97 printf("\r\nRING : call dis connected!\r\n");
98 }
99 else
100 {
101 printf("\r\nRING : None\r\n");
102 }
103 */
104}
105
b.liu5fa9e772023-11-23 18:00:55 +0800106#ifdef MBTK_PLATFORM_ASR1803
liubin281ac462023-07-19 14:22:54 +0800107void lynq_dtmf_cb(char dtmf)
108{
109 printf("%s:%c\n", __FUNCTION__, dtmf);
110}
b.liu5fa9e772023-11-23 18:00:55 +0800111#endif
liubin281ac462023-07-19 14:22:54 +0800112
113int lynq_init_call(int uToken)
114{
115 UNUSED(uToken);
b.liu5fa9e772023-11-23 18:00:55 +0800116#ifdef MBTK_PLATFORM_ASR1803
liubin281ac462023-07-19 14:22:54 +0800117 mbtk_audio_ubus_client_init(&lynq_dtmf_handle, lynq_dtmf_cb);
b.liu5fa9e772023-11-23 18:00:55 +0800118#endif
liubin281ac462023-07-19 14:22:54 +0800119 if(info_handle == NULL)
120 {
121 info_handle = mbtk_info_handle_get();
122 if(info_handle)
123 {
124 int err = mbtk_call_state_change_cb_reg(info_handle, lynq_call_state_change_cb);
125 if(err) {
126 return -1;
127 } else {
128 return 0;
129 }
130 }
131 }
132
133 return -1;
134}
135
136int lynq_deinit_call(void)
137{
138 if(info_handle)
139 {
140 return mbtk_info_handle_free(&info_handle);
141 }
142 else
143 {
144 return -1;
145 }
146}
147
148int lynq_call(int *handle, char addr[])
149{
150 if(info_handle == NULL)
151 {
152 return -1;
153 }
154 if(strlen(addr)>=90)
155 {
156 printf("\ninput phone number over load!\n");
157 return -1;
158 }
159 char *buf = addr;
160 int err = mbtk_call_start(info_handle, buf);
161 if(err) {
162 return -1;
163 } else {
164 handle_ptr = handle;
165 return 0;
166 }
167}
168
169int lynq_call_answer()
170{
171 if(info_handle == NULL)
172 {
173 return -1;
174 }
175 int err = mbtk_call_answer(info_handle);
176 if(err) {
177 return -1;
178 } else {
179 return 0;
180 }
181}
182
183int lynq_call_hungup_all()
184{
185 if(info_handle == NULL)
186 {
187 return -1;
188 }
189 int err = mbtk_call_hang(info_handle);
190 if(err) {
191 return -1;
192 } else {
193 return 0;
194 }
195}
196
197int lynq_call_hungup(int *handle)
198{
199 if(info_handle == NULL)
200 {
201 return -1;
202 }
203 int err = mbtk_a_call_hang(info_handle, *handle);
204 if(err) {
205 return -1;
206 } else {
207 return 0;
208 }
209}
210
211int lynq_hangup_waiting_or_background(void)
212{
213 if(info_handle == NULL)
214 {
215 return -1;
216 }
217 int err = mbtk_waiting_or_background_call_hang(info_handle);
218 if(err) {
219 return -1;
220 } else {
221 return 0;
222 }
223}
224
225int lynq_hangup_foreground_resume_background(void)
226{
227 if(info_handle == NULL)
228 {
229 return -1;
230 }
231 int err = mbtk_foreground_resume_background_call_hang(info_handle);
232 if(err) {
233 return -1;
234 } else {
235 return 0;
236 }
237}
238
239int lynq_switch_waiting_or_holding_and_active(void)
240{
241 if(info_handle == NULL)
242 {
243 return -1;
244 }
245 int err = mbtk_call_answer(info_handle);
246 if(err) {
247 return -1;
248 } else {
249 return 0;
250 }
251}
252
253int lynq_wait_incoming_call(void *incoming_call_cb)
254{
255 if(incoming_call_cb == NULL)
256 return -1;
257 incoming_call_cb_p = incoming_call_cb;
258 return 0;
259}
260
261int lynq_get_mute_mic (int *status)
262{
263 if(status == NULL)
264 {
265 return -1;
266 }
267 int err = mbtk_mute_state_get(info_handle, status);
268 if(err) {
269 return -1;
270 } else {
271 return 0;
272 }
273}
274
275int lynq_set_mute_mic(const int enable)
276{
277 if(info_handle == NULL)
278 {
279 return -1;
280 }
281 int err = mbtk_mute_state_set(info_handle, enable);
282 if(err) {
283 return -1;
284 } else {
285 return 0;
286 }
287}
288
289int lynq_set_DTMF(const char callnum)
290{
291 //0......9 A B C D * #
292 if(info_handle == NULL)
293 {
294 return -1;
295 }
296 char callnum_default[17]="0123456789ABCD*#";
297 if((strchr(callnum_default,callnum))==NULL)
298 {
299 printf("please input 0123456789ABCD*#\n");
300 return -1;
301 }
302 mbtk_call_dtmf_info_t dtmf_character;
303 dtmf_character.character = callnum;
304 dtmf_character.duration = 500;
305 int err = mbtk_dtmf_send(info_handle, &dtmf_character);
306 if(err) {
307 return -1;
308 } else {
309 return 0;
310 }
311}
312
313int lynq_get_current_call_state(int *handle,int *call_state,int*toa,int *direction,char addr[])
314{
315 int flag=0;
316 int i;
317 for (i = 0; i < 5; i++)
318 {
319 if(lynq_reg[i].dir1 == *handle)
320 {
321 *direction = lynq_reg[i].dir;
322 *toa = lynq_reg[i].type;
323 memset(addr,0,sizeof(addr));
324 memcpy(addr, lynq_reg[i].phone_number, strlen(lynq_reg[i].phone_number));
325 int len = strlen(lynq_reg[i].phone_number);
326 addr[len]='\0';
327 switch (lynq_reg[i].state)
328 {
329 case MBTK_ACTIVE:
330 *call_state = LYNQ_CALL_ACTIVE;
331 break;
332 case MBTK_HELD:
333 *call_state = LYNQ_CALL_HOLDING;
334 break;
335 case MBTK_DIALING:
336 *call_state = LYNQ_CALL_DIALING;
337 break;
338 case MBTK_ALERTING:
339 *call_state = LYNQ_CALL_ALERTING;
340 break;
341 case MBTK_INCOMING:
342 *call_state = LYNQ_CALL_INCOMING;
343 break;
344 case MBTK_WAITING:
345 *call_state = LYNQ_CALL_WAITING;
346 break;
347 case MBTK_OFFERING:
348 *call_state = LYNQ_CALL_OFFERING;
349 break;
350 default:
351 break;
352 }
353 flag = 1;
354 break;
355 }
356 }
357 if(flag == 0)
358 {
359 return -1;
360 }
361 return 0;
362
363 /*
364 if(info_handle == NULL)
365 {
366 return -1;
367 }
368 int err = mbtk_call_reg_get(info_handle, &reg);
369 if(err) {
370 return -1;
371 } else {
372 printf("CLCC : %d, %d, %d, %d, %d, %s, %d", reg.dir1, reg.dir, reg.state, reg.mode, reg.mpty, reg.phone_number, reg.type);
373 *direction = reg.dir;
374 *toa = reg.type;
375 memcpy(addr, reg.phone_number, strlen(reg.phone_number));
376 switch (reg.state)
377 {
378 case MBTK_ACTIVE:
379 *call_state = LYNQ_CALL_ACTIVE;
380 break;
381 case MBTK_HELD:
382 *call_state = LYNQ_CALL_HOLDING;
383 break;
384 case MBTK_DIALING:
385 *call_state = LYNQ_CALL_DIALING;
386 break;
387 case MBTK_ALERTING:
388 *call_state = LYNQ_CALL_ALERTING;
389 break;
390 case MBTK_INCOMING:
391 *call_state = LYNQ_CALL_INCOMING;
392 break;
393 case MBTK_WAITING:
394 *call_state = LYNQ_CALL_WAITING;
395 break;
396 case MBTK_OFFERING:
397 *call_state = LYNQ_CALL_OFFERING;
398 break;
399 default:
400 break;
401 }
402 return 0;
403 }
404 */
405
406}
407
b.liu5fa9e772023-11-23 18:00:55 +0800408
409#ifdef MBTK_PLATFORM_ASR1803
liubin281ac462023-07-19 14:22:54 +0800410void lynq_audio_volume_cb(int volume)
411{
412 lynq_volume_size = volume;
413 if(lynq_volume_size <= 0 || lynq_volume_size > 100)
414 {
415
416 }
417 else
418 {
419 //printf("%s:%d\n", __FUNCTION__, volume);
420 printf("%s:%d\n", __FUNCTION__, lynq_volume_size);
421 }
422}
b.liu5fa9e772023-11-23 18:00:55 +0800423#endif
liubin281ac462023-07-19 14:22:54 +0800424
425int lynq_set_speech_volume(const int volume)
426{
b.liu5fa9e772023-11-23 18:00:55 +0800427
428#ifdef MBTK_PLATFORM_ASR1803
liubin281ac462023-07-19 14:22:54 +0800429 if(volume <= 0 || volume >= 101)
430 {
431 printf("input error\n");
432 return -1;
433 }
434 else
435 {
436 int set_volume = 0;
437 set_volume = volume;
438 mbtk_audio_ubus_volume_set(set_volume);
439 return 0;
440 }
b.liu5fa9e772023-11-23 18:00:55 +0800441#else
442
443 return 0;
444#endif
liubin281ac462023-07-19 14:22:54 +0800445}
446
447int lynq_get_speech_volume(int * volume)
448{
b.liu5fa9e772023-11-23 18:00:55 +0800449#ifdef MBTK_PLATFORM_ASR1803
liubin281ac462023-07-19 14:22:54 +0800450 mbtk_audio_ubus_volume_get(lynq_audio_volume_cb);
451 sleep(1);
452 *volume = lynq_volume_size;
453 return 0;
b.liu5fa9e772023-11-23 18:00:55 +0800454#else
455
456 return 0;
457#endif
liubin281ac462023-07-19 14:22:54 +0800458}