优化LYNQ_CALL添加音量控制和优化LYNQ_SMS添加存储器位置的判断上库LYNQ_NW接口以及添加对应测试demo

Change-Id: Ic19a55f139d6fbf194dffc7ec878a51d1abf656c
diff --git a/mbtk/lynq_lib/src/lynq_network.c b/mbtk/lynq_lib/src/lynq_network.c
index 5212da5..da2cd97 100755
--- a/mbtk/lynq_lib/src/lynq_network.c
+++ b/mbtk/lynq_lib/src/lynq_network.c
@@ -1,56 +1,583 @@
 #include "lynq_qser_network.h"
+#include "mbtk_type.h"
+#include "mbtk_info_api.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+mbtk_info_handle_t* lynq_nw_info_handle = NULL;
+uint64_t tmp_mode = 0xFF;
+
+nw_client_handle_type g_nw_val = -1;
+
+
+typedef struct
+{
+    QSER_NW_RxMsgHandlerFunc_t handlerPtr;
+    void* contextPtr;
+} lynq_cust_cb_func;
+
+static lynq_cust_cb_func lynq_func_cb_handle;
+
+static int roaming_pref = 1;  // Open roaming for default.
+
+typedef enum {
+    RADIO_TECH_3GPP = 1, /* 3GPP Technologies - GSM, WCDMA */
+    RADIO_TECH_3GPP2 = 2 /* 3GPP2 Technologies - CDMA */
+} RIL_RadioTechnologyFamily;
+
+
+typedef struct
+{
+    uint8 *lynq_operator_l;
+    uint8 *lynq_operator_s;
+    uint32 lynq_mcc_mnc;
+} lynq_operator_mcc_mnc_t;
+
+static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =
+{
+    {"China Mobile","CMCC",46000},
+    {"China Unicom","CU",46001},
+    {"China Mobile","CMCC",46002},
+    {"China Telecom","CT",46003},
+    {"China Mobile","CMCC",46004},
+    {"China Telecom","CT",46005},
+    {"China Unicom","CU",46006},
+    {"China Mobile","CMCC",46007},
+    {"China Mobile","CMCC",46008},
+    {"China Unicom","CU",46009},
+    {"China Telecom","CT",46011}
+};
+
+void lynq_nw_state_change_cb(const void* data, int data_len)
+{
+    uint8 *net_data = NULL;
+
+    net_data = (uint8*)data;
+    log_hex(">>>data",data,data_len);
+
+    if (net_data == NULL)
+    {
+        LOG(">>>NO DATA");
+    }
+    else
+    {
+        LOG(">>>net_data =[%0x]\n",*net_data[2]);
+    }
+    
+/*
+    uint8 data[3];
+    data[0] = (uint8)MBTK_NET_CS_STATE;
+
+    net_data[0] = *(uint8 *)(data);                                 //MBTK_NET_PS_STATE
+    net_data[1] = *(uint8 *)(data + sizeof(uint8));                 //mbtk_net_reg_state_enum state Reg State
+    net_data[2] = *(uint8 *)(data + sizeof(uint8) + sizeof(uint8)); //act
+*/
+
+    if(roaming_pref == 0)
+    {
+        mbtk_modem_info_t info;
+        if(*net_data == 5)
+        {
+            info.fun=4;
+        }
+        else
+            info.fun=1;
+        info.rst=0;
+        mbtk_set_modem_fun(lynq_nw_info_handle, &info);
+    }
+    
+    if(lynq_func_cb_handle.handlerPtr != NULL)
+    {
+        //lynq_func_cb_handle.handlerPtr(g_nw_val, NW_IND_VOICE_REG_EVENT_IND_FLAG,&(net_data[2]), sizeof(&(net_data[2])), NULL);
+        lynq_func_cb_handle.handlerPtr(g_nw_val, NW_IND_DATA_REG_EVENT_IND_FLAG,&(net_data[2]), sizeof(&(net_data[2])), NULL);
+        //lynq_func_cb_handle.handlerPtr(g_nw_val, NW_IND_SIGNAL_STRENGTH_EVENT_IND_FLAG,&(net_data[2]), sizeof(&(net_data[2])), NULL);
+    }
+}
+
+
+static uint8 lynq_net_pre_change(bool mbtk_2_lynq,int net_mode)
+{
+    uint8 mbtk_net_pre = 0xFF;
+
+#if 0
+    此参数表在别处使用
+    E_QSER_NW_RADIO_TECH_TD_SCDMA = 1,                                       Y3     1
+    E_QSER_NW_RADIO_TECH_GSM      = 2,    /**<  GSM; only supports voice. */ YL2    0
+    E_QSER_NW_RADIO_TECH_HSPAP    = 3,    /**<  HSPA+. */                      3    1
+    E_QSER_NW_RADIO_TECH_LTE      = 4,    /**<  LTE. */                        4    5
+    E_QSER_NW_RADIO_TECH_EHRPD    = 5,    /**<  EHRPD. */                      3    1
+    E_QSER_NW_RADIO_TECH_EVDO_B   = 6,    /**<  EVDO B. */                   D3     1
+    E_QSER_NW_RADIO_TECH_HSPA     = 7,    /**<  HSPA. */                      3     1
+    E_QSER_NW_RADIO_TECH_HSUPA    = 8,    /**<  HSUPA. */                     3.5   1
+    E_QSER_NW_RADIO_TECH_HSDPA    = 9,    /**<  HSDPA. */                     3.5   1
+    E_QSER_NW_RADIO_TECH_EVDO_A   = 10,   /**<  EVDO A. */                   D3     1
+    E_QSER_NW_RADIO_TECH_EVDO_0   = 11,   /**<  EVDO 0. */                   D3     1
+    E_QSER_NW_RADIO_TECH_1xRTT    = 12,   /**<  1xRTT. */                       2   0
+    E_QSER_NW_RADIO_TECH_IS95B    = 13,   /**<  IS95B. */                       3   0
+    E_QSER_NW_RADIO_TECH_IS95A    = 14,   /**<  IS95A. */                       3   0
+    E_QSER_NW_RADIO_TECH_UMTS     = 15,   /**<  UMTS. */                     L3     1
+    E_QSER_NW_RADIO_TECH_EDGE     = 16,   /**<  EDGE. */                      2.75  0
+    E_QSER_NW_RADIO_TECH_GPRS     = 17,   /**<  GPRS. */                      2.5   0
+    E_QSER_NW_RADIO_TECH_NONE     = 18    /**<  No technology selected. */
+#endif
+    /*
+    0 : GSM only
+    1 : UMTS only
+    2 : GSM/UMTS(auto)
+    3 : GSM/UMTS(GSM preferred)
+    4 : GSM/UMTS(UMTS preferred)
+    5 : LTE only
+    6 : GSM/LTE(auto)
+    7 : GSM/LTE(GSM preferred)
+    8 : GSM/LTE(LTE preferred)
+    9 : UMTS/LTE(auto)
+    10 : UMTS/LTE(UMTS preferred)
+    11 : UMTS/LTE(LTE preferred)
+    12 : GSM/UMTS/LTE(auto)
+    13 : GSM/UMTS/LTE(GSM preferred)
+    14 : GSM/UMTS/LTE(UMTS preferred)
+    15 : GSM/UMTS/LTE(LTE preferred)
+    */
+
+    if(mbtk_2_lynq) {
+        switch(net_mode)
+        {
+            //使用之前set的tmp_mode的值来进行回显get
+            case QSER_NW_MODE_GSM:
+                mbtk_net_pre = QSER_NW_MODE_GSM;
+                break;
+            case QSER_NW_MODE_WCDMA:
+                mbtk_net_pre = QSER_NW_MODE_WCDMA;
+                break;
+            case QSER_NW_MODE_CDMA:
+                mbtk_net_pre = QSER_NW_MODE_CDMA;
+                break;
+            case QSER_NW_MODE_EVDO:
+                mbtk_net_pre = QSER_NW_MODE_EVDO;
+                break;
+            case QSER_NW_MODE_LTE:
+                mbtk_net_pre = QSER_NW_MODE_LTE;
+                break;
+            case QSER_NW_MODE_TDSCDMA:
+                mbtk_net_pre = QSER_NW_MODE_TDSCDMA;
+                break;
+            default:
+                mbtk_net_pre = 0xFF;
+                break;
+        }
+    } else {
+        switch(net_mode)
+        {
+            //只做234G的only下配 MBTK_NET_PREF_GSM_ONLY/MBTK_NET_PREF_UMTS_ONLY/MBTK_NET_PREF_LTE_ONLY
+            case QSER_NW_MODE_GSM:
+                mbtk_net_pre = MBTK_NET_PREF_GSM_ONLY;
+                break;
+            case QSER_NW_MODE_WCDMA:
+                mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_UMTS_PREF;
+                break;
+            case QSER_NW_MODE_CDMA:
+                mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_UMTS_PREF;
+                break;
+            case QSER_NW_MODE_EVDO:
+                mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_UMTS_PREF;
+                break;
+            case QSER_NW_MODE_LTE:
+                mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF;
+                break;
+            case QSER_NW_MODE_TDSCDMA:
+                mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_UMTS_PREF;
+                break;
+            default:
+                mbtk_net_pre = 0xFF;
+                break;
+        }
+    }
+    return mbtk_net_pre;
+}
 
 int qser_nw_client_init(nw_client_handle_type *ph_nw)
 {
-    UNUSED(ph_nw);
+    //UNUSED(ph_nw);
 
+    if(lynq_nw_info_handle == NULL)
+    {
+        lynq_nw_info_handle = mbtk_info_handle_get();
+        if(lynq_nw_info_handle)
+        {
+            printf("creat lynq_nw_info_handle is success\n");
+            *ph_nw = lynq_nw_info_handle->client_fd;
+            g_nw_val = lynq_nw_info_handle->client_fd;
+        }
+        else
+        {
+            printf("creat lynq_nw_info_handle is fail\n");
+            return -1;
+        }
+    }
+    
     return 0;
 }
 
 int qser_nw_client_deinit(nw_client_handle_type h_nw)
 {
-    UNUSED(h_nw);
+    //UNUSED(h_nw);
+    if (h_nw != g_nw_val || g_nw_val == -1)
+    {
+        printf("handle NULL\n");
+        return -1;
+    }
+
+    if(lynq_nw_info_handle)
+    {
+        mbtk_info_handle_free(&lynq_nw_info_handle);
+    }
+    else
+    {
+        printf("deinit lynq_nw_info_handle is fail\n");
+        return -1;
+    }
 
     return 0;
 }
 
 int qser_nw_set_config(nw_client_handle_type h_nw,QSER_NW_CONFIG_INFO_T *pt_info)
 {
-    UNUSED(h_nw);
-    UNUSED(pt_info);
+    //UNUSED(h_nw);
+    //UNUSED(pt_info);
+    if (h_nw != g_nw_val || g_nw_val == -1)
+    {
+        printf("handle NULL\n");
+        return -1;
+    }
+
+    if(lynq_nw_info_handle == NULL)
+    {
+        printf("lynq_nw_info_handle == NULL.\n");
+        return -1;
+    }
+
+    if(pt_info == NULL)
+    {
+        printf("pt_info == NULL.\n");
+        return -1;
+    }
+
+    roaming_pref = pt_info->roaming_pref;
+
+    mbtk_band_info_t band;
+    memset(&band, 0, sizeof(mbtk_band_info_t));
+    tmp_mode = pt_info->preferred_nw_mode;//临时保存一下原本的mode
+
+    //printf("tmp_mode = [%llu]",tmp_mode);
+    band.net_pref = lynq_net_pre_change(FALSE, pt_info->preferred_nw_mode);
+    printf("band.net_pref = [%d]\n",band.net_pref);
+
+    if(band.net_pref == 0xFF)
+    {
+        LOGE("lynq_net_pre_change() fail.");
+        return -1;
+    }
+
+    if(mbtk_current_band_set(lynq_nw_info_handle, &band))
+    {
+        return -1;
+    }
 
     return 0;
 }
 
 int qser_nw_get_operator_name(nw_client_handle_type h_nw, QSER_NW_OPERATOR_NAME_INFO_T *pt_info)
 {
-    UNUSED(h_nw);
-    UNUSED(pt_info);
+    //UNUSED(h_nw);
+    //UNUSED(pt_info);
+    if (h_nw != g_nw_val || g_nw_val == -1)
+    {
+        printf("handle NULL\n");
+        return -1;
+    }
 
-    return 0;
+    if(lynq_nw_info_handle == NULL)
+    {
+        printf("lynq_nw_info_handle == NULL.\n");
+        return -1;
+    }
+
+    if(pt_info == NULL)
+    {
+        printf("pt_info == NULL.\n");
+        return -1;
+    }
+
+    char OperatorFN[128];
+    char OperatorSH[128];
+    char MccMnc[128];
+    mbtk_net_info_t net;
+    if(!mbtk_net_sel_mode_get(lynq_nw_info_handle, &net) && net.plmn > 0)
+    {
+        // printf("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
+        int i = 0;
+        while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
+        {
+            if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
+                break;
+            i++;
+        }
+
+        if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))   // No found mcc&mnc
+        {
+            strcpy(OperatorFN, "UNKNOWN");
+            strcpy(OperatorSH, "UNKNOWN");
+            sprintf(MccMnc, "%d", net.plmn);
+        }
+        else
+        {
+            strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
+            strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
+            sprintf(MccMnc, "%d", lynq_operator_mcc_mnc[i].lynq_mcc_mnc);
+        }
+        memset(pt_info->long_eons,0,128);
+        memcpy(pt_info->long_eons,lynq_operator_mcc_mnc[i].lynq_operator_l,strlen(lynq_operator_mcc_mnc[i].lynq_operator_l));
+        memset(pt_info->short_eons,0,128);
+        memcpy(pt_info->short_eons,lynq_operator_mcc_mnc[i].lynq_operator_s,strlen(lynq_operator_mcc_mnc[i].lynq_operator_s));
+        memset(pt_info->mcc,0,4);
+        memset(pt_info->mnc,0,4);
+        sprintf(pt_info->mcc, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
+        sprintf(pt_info->mnc, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
+        //pt_info->act;
+        return 0;
+    }
+
+    return -1;
 }
 
 int qser_nw_get_reg_status(nw_client_handle_type h_nw, QSER_NW_REG_STATUS_INFO_T *pt_info)
 {
-    UNUSED(h_nw);
-    UNUSED(pt_info);
+    //UNUSED(h_nw);
+    //UNUSED(pt_info);
+    if (h_nw != g_nw_val || g_nw_val == -1)
+    {
+        printf("handle NULL\n");
+        return -1;
+    }
+
+    if(lynq_nw_info_handle == NULL)
+    {
+        printf("lynq_nw_info_handle == NULL.\n");
+        return -1;
+    }
+
+    if(pt_info == NULL)
+    {
+        printf("pt_info == NULL.\n");
+        return -1;
+    }
+
+    /*VOICE/DATA/IMS*/
+    mbtk_net_reg_info_t reg;
+    int err = mbtk_net_reg_get(lynq_nw_info_handle, &reg);
+    if(err)
+    {
+        LOGE("mbtk_net_reg_get fail.");
+        return -1;
+    }
+    else
+    {
+        memset(pt_info, 0x0, sizeof(QSER_NW_REG_STATUS_INFO_T));
+
+
+        char OperatorFN[128];
+        char OperatorSH[128];
+        char MccMnc[128];
+        mbtk_net_info_t net;
+        if(!mbtk_net_sel_mode_get(lynq_nw_info_handle, &net) && net.plmn > 0)
+        {
+            // printf("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
+            int i = 0;
+            while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
+            {
+                if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
+                    break;
+                i++;
+            }
+        
+            if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))   // No found mcc&mnc
+            {
+                strcpy(OperatorFN, "UNKNOWN");
+                strcpy(OperatorSH, "UNKNOWN");
+                sprintf(MccMnc, "%d", net.plmn);
+            }
+            else
+            {
+                sprintf(MccMnc, "%d", lynq_operator_mcc_mnc[i].lynq_mcc_mnc);
+            }
+            sprintf(pt_info->data_registration_details_3gpp.mcc, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
+            sprintf(pt_info->data_registration_details_3gpp.mnc, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
+            sprintf(pt_info->voice_registration_details_3gpp.mcc, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
+            sprintf(pt_info->voice_registration_details_3gpp.mnc, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
+            //pt_info->act;
+        }
+
+        //暂时未知是否其他也被使用,现根据ql模块的传输情况,
+        //只配置3gpp,涉及call,data状态没有对应的匹配的就没有赋值
+
+        pt_info->voice_registration_valid = FALSE;
+        //pt_info->voice_registration
+
+        pt_info->data_registration_valid = FALSE;
+        //pt_info->data_registration
+
+        pt_info->voice_registration_details_3gpp_valid = TRUE;
+        pt_info->voice_registration_details_3gpp.lac = reg.lac;
+        pt_info->voice_registration_details_3gpp.cid = reg.ci;
+        //补位填0 or 1
+        pt_info->voice_registration_details_3gpp.tech_domain = 1;
+        pt_info->voice_registration_details_3gpp.roaming = 0;
+        pt_info->voice_registration_details_3gpp.forbidden = 0;
+        pt_info->voice_registration_details_3gpp.psc = 0;
+        pt_info->voice_registration_details_3gpp.tac = 0;
+
+        pt_info->data_registration_details_3gpp_valid = TRUE;
+        pt_info->data_registration_details_3gpp.lac = reg.lac;
+        pt_info->data_registration_details_3gpp.cid = reg.ci;
+        //补位填0 or 1
+        pt_info->data_registration_details_3gpp.tech_domain = 1;
+        pt_info->data_registration_details_3gpp.roaming = 0;
+        pt_info->data_registration_details_3gpp.forbidden = 0;
+        pt_info->data_registration_details_3gpp.psc = 0;
+        pt_info->data_registration_details_3gpp.tac = 0;
+
+
+        pt_info->voice_registration_details_3gpp2_valid = FALSE;
+        //pt_info->voice_registration_details_3gpp2
+
+        pt_info->data_registration_details_3gpp2_valid = FALSE;
+        //pt_info->data_registration_details_3gpp2
+
+
+        switch(reg.type)
+        {
+            case MBTK_RADIO_TECH_GSM:
+            case MBTK_RADIO_TECH_GSM_COMPACT:
+            case MBTK_RADIO_TECH_GSM_EGPRS:
+            case MBTK_RADIO_TECH_UTRAN_HSPA:
+            {
+                pt_info->data_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_GPRS;
+                pt_info->voice_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_GSM;
+                break;
+            }
+            case MBTK_RADIO_TECH_UTRAN:
+            case MBTK_RADIO_TECH_UTRAN_HSDPA:
+            case MBTK_RADIO_TECH_UTRAN_HSUPA:
+            case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
+            {
+                pt_info->data_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_UMTS;
+                pt_info->voice_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_UMTS;
+                break;
+            }
+            case MBTK_RADIO_TECH_E_UTRAN:
+            {
+                pt_info->data_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_LTE;
+                pt_info->voice_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_LTE;
+                break;
+            }
+            default:
+            {
+                pt_info->data_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_NONE;
+                pt_info->voice_registration_details_3gpp.radio_tech = E_QSER_NW_RADIO_TECH_NONE;
+                break;
+            }
+        }
+    }
 
     return 0;
 }
 
 int qser_nw_get_signal_strength(nw_client_handle_type h_nw,QSER_NW_SIGNAL_STRENGTH_INFO_T *pt_info)
 {
-    UNUSED(h_nw);
-    UNUSED(pt_info);
+    //UNUSED(h_nw);
+    //UNUSED(pt_info);
+    if (h_nw != g_nw_val || g_nw_val == -1)
+    {
+        printf("handle NULL\n");
+        return -1;
+    }
+
+    if(lynq_nw_info_handle == NULL)
+    {
+        printf("lynq_nw_info_handle == NULL.\n");
+        return -1;
+    }
+
+    if(pt_info == NULL)
+    {
+        printf("pt_info == NULL.\n");
+        return -1;
+    }
+
+    int ret;
+    mbtk_signal_info_t signal;
+    ret = mbtk_net_signal_get(lynq_nw_info_handle, &signal);
+    if(ret != 0) {
+        LOGE("mbtk_net_signal_get fail.");
+        return -1;
+    }
+    else
+    {
+        memset(pt_info, 0x0, sizeof(QSER_NW_SIGNAL_STRENGTH_INFO_T));
+        if(signal.type == MBTK_RADIO_TECH_GSM || signal.type == MBTK_RADIO_TECH_GSM_COMPACT || \
+           signal.type == MBTK_RADIO_TECH_GSM_EGPRS)              //GSM
+        {
+            pt_info->gsm_sig_info_valid = TRUE;
+            pt_info->gsm_sig_info.rssi = signal.rssi;
+        }
+        else if(signal.type == MBTK_RADIO_TECH_E_UTRAN)     //LTE
+        {
+            pt_info->lte_sig_info_valid = TRUE;
+            pt_info->lte_sig_info.rsrp = signal.rsrp;
+            pt_info->lte_sig_info.rsrq = signal.rsrq;
+            pt_info->lte_sig_info.snr = 0;                  //->MBTK接口无该参数,写死值为0
+            pt_info->lte_sig_info.rssi = signal.rssi;
+        }
+        else if (signal.type == MBTK_RADIO_TECH_UTRAN || signal.type == MBTK_RADIO_TECH_UTRAN_HSDPA || \
+                 signal.type == MBTK_RADIO_TECH_UTRAN_HSUPA || signal.type == MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA ||  \
+                 signal.type == MBTK_RADIO_TECH_UTRAN_HSPA )//WCDMA
+        {
+            pt_info->wcdma_sig_info_valid = TRUE;
+            pt_info->wcdma_sig_info.rssi = signal.rssi;
+            pt_info->wcdma_sig_info.ecio = 0;               //->MBTK接口无该参数,写死值为0
+        }
+        else
+        {
+            return -1;
+        }
+    }
 
     return 0;
 }
 
 int qser_nw_add_rx_msg_handler (nw_client_handle_type h_nw, QSER_NW_RxMsgHandlerFunc_t handlerPtr, void* contextPtr)
 {
-    UNUSED(h_nw);
-    UNUSED(handlerPtr);
-    UNUSED(contextPtr);
+    //UNUSED(h_nw);
+    //UNUSED(handlerPtr);
+    //UNUSED(contextPtr);
+
+    if (h_nw != g_nw_val || g_nw_val == -1)
+    {
+        printf("handle NULL\n");
+        return -1;
+    }
+
+    if(lynq_nw_info_handle == NULL)
+    {
+        printf("lynq_nw_info_handle == NULL.\n");
+        return -1;
+    }
+
+    lynq_func_cb_handle.handlerPtr = handlerPtr;
+    lynq_func_cb_handle.contextPtr = contextPtr;
+
+    mbtk_net_state_change_cb_reg(lynq_nw_info_handle, lynq_nw_state_change_cb);
 
     return 0;
 }
@@ -69,4 +596,79 @@
     UNUSED(pt_info);
 
     return 0;
-}
\ No newline at end of file
+}
+
+int qser_nw_set_rf_mode (nw_client_handle_type h_nw, E_QSER_NW_RF_MODE_TYPE_T rf_mode)
+{
+    //UNUSED(h_nw);
+    //UNUSED(rf_mode);
+    int ret;
+
+    if (h_nw != g_nw_val || g_nw_val == -1)
+    {
+        printf("handle NULL\n");
+        return -1;
+    }
+
+    if(lynq_nw_info_handle == NULL)
+    {
+        printf("lynq_nw_info_handle == NULL.\n");
+        return -1;
+    }
+
+    if (rf_mode == 4)
+    {
+        printf("Flight Mode no Support Now\n");
+        return -1;
+    }
+
+    ret = mbtk_radio_state_set(lynq_nw_info_handle, rf_mode);
+    if (ret != 0)
+    {
+        LOGE("mbtk_radio_state_set fail.");
+        return -1;
+    }
+    else
+    {
+        printf("qser_nw_set_rf_mode is success\n");
+    }
+
+    return 0;
+}
+
+int qser_nw_get_rf_mode (nw_client_handle_type h_nw, E_QSER_NW_RF_MODE_TYPE_T *rf_mode)
+{
+    //UNUSED(h_nw);
+    //UNUSED(rf_mode);
+    int ret;
+    int tmp_rf;
+
+    if (h_nw != g_nw_val || g_nw_val == -1)
+    {
+        printf("handle NULL\n");
+        return -1;
+    }
+
+    if(lynq_nw_info_handle == NULL)
+    {
+        printf("lynq_nw_info_handle == NULL.\n");
+        return -1;
+    }
+
+    ret = mbtk_radio_state_get(lynq_nw_info_handle, &tmp_rf);
+    if (ret != 0)
+    {
+        LOGE("mbtk_radio_state_get fail.");
+        return -1;
+    }
+    else
+    {
+        printf("qser_nw_get_rf_mode is success\n");
+        *rf_mode = tmp_rf;
+    }
+
+
+    return 0;
+}
+
+
diff --git a/mbtk/lynq_lib/src/lynq_sms.c b/mbtk/lynq_lib/src/lynq_sms.c
index 1d28ce9..bde4083 100755
--- a/mbtk/lynq_lib/src/lynq_sms.c
+++ b/mbtk/lynq_lib/src/lynq_sms.c
@@ -160,6 +160,7 @@
     char resp[RES_NUM_MIN] = {0};
     char pdu_data[512] = {0};
     char phone_lenth[10] = {0};
+    char mem[10] = {0};
     char *p = pdu_data;
     int mode = 0;
     int err = 0;
@@ -178,6 +179,29 @@
     else
         return -1;
 
+    //设置存储器
+
+    if (pt_sms_info->storage == 0)
+    {
+        strncpy(mem, "SM", 2);
+    }
+    else if (pt_sms_info->storage == 1)
+    {
+        strncpy(mem, "ME", 2);
+    }
+    else
+    {
+        printf("qser_sms_deletefromstorage storage is no Support \n");
+    }
+
+    memset(resp, 0, sizeof(resp));
+    err = mbtk_sms_cpms_set(sms_info_handle, mem, resp);
+    if(err) {
+        printf("Error : %d\n", err);
+    } else {
+        printf("cpms set success. resp:%s\n", resp);
+    }
+
     if(data == NULL)
     {
         printf("qser_sms_send_sms data NULL\n");
@@ -332,6 +356,9 @@
     char cmgd[128] = {0};
     int err = 0;
     int id_x = -1;
+    int t_storage = 0;
+    char mem[10] = {0};
+    char resp[RES_NUM_MIN] = {0};
 
     if (h_sms != g_sms_val || g_sms_val == -1)
     {
@@ -352,6 +379,29 @@
         return -1;
     }
 
+    t_storage = pt_sms_storage->storage; //设置存储器
+
+    if (t_storage == 0)
+    {
+        strncpy(mem, "SM", 2);
+    }
+    else if (t_storage == 1)
+    {
+        strncpy(mem, "ME", 2);
+    }
+    else
+    {
+        printf("qser_sms_deletefromstorage storage is no Support \n");
+    }
+
+    memset(resp, 0, sizeof(resp));
+    err = mbtk_sms_cpms_set(sms_info_handle, mem, resp);
+    if(err) {
+        printf("Error : %d\n", err);
+    } else {
+        printf("cpms set success. resp:%s\n", resp);
+    }
+
     id_x = pt_sms_storage->storage_idx;//获取idx的值
 
     if(id_x == -1)      //delete all
diff --git a/mbtk/lynq_lib/src/lynq_voice_call.c b/mbtk/lynq_lib/src/lynq_voice_call.c
index c7e67ff..96e6f63 100755
--- a/mbtk/lynq_lib/src/lynq_voice_call.c
+++ b/mbtk/lynq_lib/src/lynq_voice_call.c
Binary files differ