Add toolchain and mbtk source

Change-Id: Ie12546301367ea59240bf23d5e184ad7e36e40b3
diff --git a/mbtk/lynq_lib/src/lynq_call_api.c b/mbtk/lynq_lib/src/lynq_call_api.c
new file mode 100755
index 0000000..1645803
--- /dev/null
+++ b/mbtk/lynq_lib/src/lynq_call_api.c
@@ -0,0 +1,439 @@
+#include "lynq/lynq_call_api.h"
+#include "mbtk_info_api.h"
+
+static mbtk_info_handle_t* info_handle = NULL;
+int lynq_volume_size = 0;
+mbtk_audio_client_handle_type lynq_dtmf_handle;
+mbtk_call_info_t lynq_reg[5]={0};
+int *handle_ptr=null;
+void (*incoming_call_cb_p)(int x)=NULL;
+void lynq_call_state_change_cb(const void* data, int data_len)
+{
+    mbtk_call_info_t *reg = (mbtk_call_info_t *)data;
+    switch (reg->call_wait)
+    {
+        case MBTK_CLCC:
+        {
+            lynq_reg[reg->dir1].dir1 = reg->dir1;
+            lynq_reg[reg->dir1].dir = reg->dir;
+            lynq_reg[reg->dir1].state = reg->state;
+            lynq_reg[reg->dir1].mode = reg->mode;
+            lynq_reg[reg->dir1].mpty = reg->mpty;
+            memset(lynq_reg[reg->dir1].phone_number,0,strlen(reg->phone_number));
+            memcpy(lynq_reg[reg->dir1].phone_number,reg->phone_number,strlen(reg->phone_number));
+            lynq_reg[reg->dir1].type = reg->type;
+            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));
+            if(handle_ptr != null)
+            {
+                if(*handle_ptr != reg->dir1)
+                {
+                    *handle_ptr = reg->dir1;
+                    printf("reg->dir1 : %d\r\n handle=%d\n", reg->dir1,*handle_ptr);
+                    handle_ptr = NULL;
+                }
+            }
+            if(reg->dir == 1)
+                (*incoming_call_cb_p)(reg->dir1);
+            break;
+        }
+        case MBTK_DISCONNECTED:
+            memset(&(lynq_reg[reg->disconnected_id]),0,sizeof(lynq_reg[reg->disconnected_id]));
+            printf("\r\nRING : call dis connected: %d!\r\n", reg->disconnected_id);
+            printf("phone number : %s",lynq_reg[reg->disconnected_id].phone_number);
+            lynq_set_mute_mic(0);
+            break;
+        case MBTK_CPAS:
+            printf("\r\nCALL : Call state = %d\r\n", reg->pas);
+            /*
+                MBTK_CALL_RADY,                 //MT allows commands from TA/TE
+                MBTK_CALL_UNAVAILABLE,          //MT does not allow commands from TA/TE
+                MBTK_CALL_UNKNOWN,              //MT is not guaranteed to respond to instructions
+                MBTK_CALL_RINGING,              //MT is ready for commands from TA/TE, but the ringer is active
+                MBTK_CALL_PROGRESS,             //MT is ready for commands from TA/TE, but a call is in progress
+                MBTK_CALL_ASLEEP,               //MT is unable to process commands from TA/TE because it is in a low functionality state
+                MBTK_CALL_ACTIVE,
+            */
+           switch (reg->pas)
+           {
+                case MBTK_CALL_RADY:
+                    printf("CALL: call READY\r\n");
+                    break;
+                case MBTK_CALL_UNAVAILABLE:
+                    printf("CALL: call unavaliable\r\n");
+                    break;
+                case MBTK_CALL_UNKNOWN:
+                    printf("CALL: call unknown\r\n");
+                    break;
+                case MBTK_CALL_RINGING:
+                    printf("CALL: call ringing\r\n");
+                    break;
+                case MBTK_CALL_PROGRESS:
+                    printf("CALL: call progress\r\n");
+                    break;
+                case MBTK_CALL_ASLEEP:
+                    printf("CALL: call asleep\r\n");
+                    break;
+                case MBTK_CALL_ACTIVE:
+                    printf("CALL: call active\r\n");
+                    break;
+                default:
+                    printf("\r\n");
+                    break;
+           }
+            break;
+        default:
+            printf("\r\nRING : None call_wait = %d\r\n", reg->call_wait);
+            break;
+    }
+    /*
+    if(reg->call_wait == )         //CLCC
+    {
+        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);
+    }
+    else if(reg->call_wait == 2)    //Disconnected
+    {
+        printf("\r\nRING : call dis connected!\r\n");
+    }
+    else
+    {
+        printf("\r\nRING : None\r\n");
+    }
+    */
+}
+
+
+void lynq_dtmf_cb(char dtmf)
+{
+    printf("%s:%c\n", __FUNCTION__, dtmf);
+}
+
+int lynq_init_call(int uToken)
+{
+    UNUSED(uToken);
+    mbtk_audio_ubus_client_init(&lynq_dtmf_handle, lynq_dtmf_cb);
+    if(info_handle == NULL)
+    {
+        info_handle = mbtk_info_handle_get();
+        if(info_handle)
+        {
+            int err = mbtk_call_state_change_cb_reg(info_handle, lynq_call_state_change_cb);
+            if(err) {
+                return -1;
+            } else {
+                return 0;
+            }
+        }
+    }
+
+    return -1;
+}
+
+int lynq_deinit_call(void)
+{
+    if(info_handle)
+    {
+        return mbtk_info_handle_free(&info_handle);
+    }
+    else
+    {
+        return -1;
+    }
+}
+
+int lynq_call(int *handle, char addr[])
+{
+    if(info_handle == NULL)
+    {
+        return -1;
+    }
+    if(strlen(addr)>=90)
+    {
+        printf("\ninput phone number over load!\n");
+        return -1;
+    }
+    char *buf = addr;
+    int err = mbtk_call_start(info_handle, buf);
+    if(err) {
+        return -1;
+    } else {
+        handle_ptr = handle;
+        return 0;
+    }
+}
+
+int lynq_call_answer()
+{
+    if(info_handle == NULL)
+    {
+        return -1;
+    }
+    int err = mbtk_call_answer(info_handle);
+    if(err) {
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
+int lynq_call_hungup_all()
+{
+    if(info_handle == NULL)
+    {
+        return -1;
+    }
+    int err = mbtk_call_hang(info_handle);
+    if(err) {
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
+int lynq_call_hungup(int *handle)
+{
+    if(info_handle == NULL)
+    {
+        return -1;
+    }
+    int err = mbtk_a_call_hang(info_handle, *handle);
+    if(err) {
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
+int lynq_hangup_waiting_or_background(void)
+{
+    if(info_handle == NULL)
+    {
+        return -1;
+    }
+    int err = mbtk_waiting_or_background_call_hang(info_handle);
+    if(err) {
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
+int lynq_hangup_foreground_resume_background(void)
+{
+    if(info_handle == NULL)
+    {
+        return -1;
+    }
+    int err = mbtk_foreground_resume_background_call_hang(info_handle);
+    if(err) {
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
+int lynq_switch_waiting_or_holding_and_active(void)
+{
+    if(info_handle == NULL)
+    {
+        return -1;
+    }
+    int err = mbtk_call_answer(info_handle);
+    if(err) {
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
+int lynq_wait_incoming_call(void *incoming_call_cb)
+{
+    if(incoming_call_cb == NULL)
+        return -1;
+    incoming_call_cb_p = incoming_call_cb;
+    return 0;
+}
+
+int lynq_get_mute_mic (int *status)
+{
+    if(status == NULL)
+    {
+        return -1;
+    }
+    int err = mbtk_mute_state_get(info_handle, status);
+    if(err) {
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
+int lynq_set_mute_mic(const int enable)
+{
+    if(info_handle == NULL)
+    {
+        return -1;
+    }
+    int err = mbtk_mute_state_set(info_handle, enable);
+    if(err) {
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
+int lynq_set_DTMF(const char callnum)
+{
+    //0......9 A B C D * #
+    if(info_handle == NULL)
+    {
+        return -1;
+    }
+    char callnum_default[17]="0123456789ABCD*#";
+    if((strchr(callnum_default,callnum))==NULL)
+    {
+        printf("please input 0123456789ABCD*#\n");
+        return -1;
+    }
+    mbtk_call_dtmf_info_t dtmf_character;
+    dtmf_character.character = callnum;
+    dtmf_character.duration = 500;
+    int err = mbtk_dtmf_send(info_handle, &dtmf_character);
+    if(err) {
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
+int lynq_get_current_call_state(int *handle,int *call_state,int*toa,int *direction,char addr[])
+{
+    int flag=0;
+    int i;
+    for (i = 0; i < 5; i++)
+    {
+        if(lynq_reg[i].dir1 == *handle)
+        {
+            *direction = lynq_reg[i].dir;
+            *toa = lynq_reg[i].type;
+            memset(addr,0,sizeof(addr));
+            memcpy(addr, lynq_reg[i].phone_number, strlen(lynq_reg[i].phone_number));
+            int len = strlen(lynq_reg[i].phone_number);
+            addr[len]='\0';
+            switch (lynq_reg[i].state)
+            {
+                case MBTK_ACTIVE:
+                    *call_state = LYNQ_CALL_ACTIVE;
+                    break;
+                case MBTK_HELD:
+                    *call_state = LYNQ_CALL_HOLDING;
+                    break;
+                case MBTK_DIALING:
+                    *call_state = LYNQ_CALL_DIALING;
+                    break;
+                case MBTK_ALERTING:
+                    *call_state = LYNQ_CALL_ALERTING;
+                    break;
+                case MBTK_INCOMING:
+                    *call_state = LYNQ_CALL_INCOMING;
+                    break;
+                case MBTK_WAITING:
+                    *call_state = LYNQ_CALL_WAITING;
+                    break;
+                case MBTK_OFFERING:
+                    *call_state = LYNQ_CALL_OFFERING;
+                    break;
+                default:
+                    break;
+            }
+            flag = 1;
+            break;
+        }
+    }
+    if(flag == 0)
+    {
+        return -1;
+    }
+    return 0;
+
+    /*
+    if(info_handle == NULL)
+    {
+        return -1;
+    }
+    int err = mbtk_call_reg_get(info_handle, &reg);
+    if(err) {
+        return -1;
+    } else {
+        printf("CLCC : %d, %d, %d, %d, %d, %s, %d", reg.dir1, reg.dir, reg.state, reg.mode, reg.mpty, reg.phone_number, reg.type);
+        *direction = reg.dir;
+        *toa = reg.type;
+        memcpy(addr, reg.phone_number, strlen(reg.phone_number));
+        switch (reg.state)
+        {
+            case MBTK_ACTIVE:
+                *call_state = LYNQ_CALL_ACTIVE;
+                break;
+            case MBTK_HELD:
+                *call_state = LYNQ_CALL_HOLDING;
+                break;
+            case MBTK_DIALING:
+                *call_state = LYNQ_CALL_DIALING;
+                break;
+            case MBTK_ALERTING:
+                *call_state = LYNQ_CALL_ALERTING;
+                break;
+            case MBTK_INCOMING:
+                *call_state = LYNQ_CALL_INCOMING;
+                break;
+            case MBTK_WAITING:
+                *call_state = LYNQ_CALL_WAITING;
+                break;
+            case MBTK_OFFERING:
+                *call_state = LYNQ_CALL_OFFERING;
+                break;
+            default:
+                break;
+        }
+        return 0;
+    }
+    */
+
+}
+
+void lynq_audio_volume_cb(int volume)
+{
+	lynq_volume_size = volume;
+    if(lynq_volume_size <= 0 || lynq_volume_size > 100)
+    {
+
+    }
+    else
+    {
+        //printf("%s:%d\n", __FUNCTION__, volume);
+        printf("%s:%d\n", __FUNCTION__, lynq_volume_size);
+    }
+}
+
+int lynq_set_speech_volume(const int volume)
+{
+    if(volume <= 0 || volume >= 101)
+    {
+        printf("input error\n");
+        return -1;
+    }
+    else
+    {
+        int set_volume = 0;
+        set_volume = volume;
+        mbtk_audio_ubus_volume_set(set_volume);
+        return 0;
+    }
+}
+
+int lynq_get_speech_volume(int * volume)
+{
+	mbtk_audio_ubus_volume_get(lynq_audio_volume_cb);
+    sleep(1);
+	*volume = lynq_volume_size;
+	return 0;
+}
\ No newline at end of file