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