Add basic change for v1453

Change-Id: I9497a61bbc3717f66413794a4e7dee0347c0bc33
diff --git a/mbtk/libql_lib_v2_rilv2/ql_dm.c b/mbtk/libql_lib_v2_rilv2/ql_dm.c
new file mode 100755
index 0000000..867c4fd
--- /dev/null
+++ b/mbtk/libql_lib_v2_rilv2/ql_dm.c
@@ -0,0 +1,882 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_dm.h 
+  @brief device management API
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20200316   stan.li      Optimize the ql_dm_get_modem_state interface
+  20191224   stan.li      Add radio on/off API
+  20190625   stan.li      Created .
+-------------------------------------------------------------------------------------------------*/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <pthread.h>
+
+#include "mbtk_ril_api.h"
+#include "ql_type.h"
+#include "ql_dm.h"
+
+
+
+#define LYNQ_AIR_PLANE_MODE_ON      4    //at+cfun = 4
+#define LYNQ_AIR_PLANE_MODE_OFF     1   // at+cfun = 1
+
+
+#define MBTK_RILD_ERR      -1
+#define IMEI_VALID          1
+
+static mbtk_ril_handle* ql_info_handle = NULL;
+static mbtk_ril_handle* g_md_version_handle = NULL;
+
+static ql_dm_air_plane_mode_ind_cb g_air_plane_mode_cb = NULL;
+static ql_dm_service_error_cb_f global_dm_error_cb = NULL;
+static ql_dm_modem_state_ind_cb global_dm_modem_cb = NULL;
+
+
+static pthread_t g_air_plane_mode_thread;
+static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;
+static bool g_thread_running = false;
+
+
+static void mbtk_send_singnal()
+{
+    pthread_mutex_lock(&g_mutex);
+    pthread_cond_signal(&g_cond);
+    pthread_mutex_unlock(&g_mutex);
+
+}
+
+static void mbtk_dm_set_service_error_func(const void* data,int data_len)
+{
+    if(data !=NULL && data_len == sizeof(int))
+    {
+        const int *state = (const int*)(data);
+        if(*state)
+        {
+            if(global_dm_error_cb)
+            {
+                global_dm_error_cb(MBTK_RILD_ERR);
+            }
+
+        }
+    }
+        
+}
+
+static void mbtk_modem_state_change_cb(const void* data, int data_len)
+{
+    uint8 *ptr = (uint8*)data;
+    if(global_dm_modem_cb)
+    {
+        global_dm_modem_cb(*ptr);
+    }
+    
+}
+
+void* air_plane_mode_monitor(void* arg) 
+{
+    int ql_info = 0;
+    int ret = -1;
+    mbtk_radio_state_enum mbtk_info;
+
+    while (g_thread_running) 
+    {
+        pthread_mutex_lock(&g_mutex);
+        pthread_cond_wait(&g_cond, &g_mutex); 
+        ret = mbtk_radio_state_get(ql_info_handle, &mbtk_info);
+        if (ret != 0)
+        {
+            LOGE("mbtk_radio_state_get fail.");
+            return NULL;
+        }
+        
+        if(mbtk_info == LYNQ_AIR_PLANE_MODE_OFF)
+        {
+            ql_info = QL_DM_AIR_PLANE_MODE_OFF;
+        }
+        
+        if(mbtk_info == LYNQ_AIR_PLANE_MODE_ON)
+        {
+            ql_info = QL_DM_AIR_PLANE_MODE_ON;
+        }
+        
+        if(mbtk_info != LYNQ_AIR_PLANE_MODE_OFF && mbtk_info !=LYNQ_AIR_PLANE_MODE_ON)
+        {
+            
+            ql_info = QL_DM_AIR_PLANE_MODE_UNKNOWN;
+        }
+       
+        if(g_air_plane_mode_cb) 
+        {
+            
+            g_air_plane_mode_cb(ql_info);
+        }
+
+        pthread_mutex_unlock(&g_mutex);
+    }
+
+    return NULL;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Initialize DM service.
+  @note You must call this function before other functions can be used in this module.
+  @return Whether the DM service was successfully intialized.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+
+int ql_dm_init(void)
+{
+    
+    if(ql_info_handle == NULL)
+    {
+
+        mbtk_log_init("syslog", "QL_DM");
+
+        ql_info_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+        if(ql_info_handle)
+        {
+           
+            return QL_ERR_OK;
+        } 
+        else 
+        {
+            LOGE("mbtk_info_handle_get() fail.");
+            return QL_ERR_FAILED;
+        }
+
+     }
+     else
+     {
+        LOGE("No need init again");
+        return QL_ERR_FAILED;
+     }
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Denitialize DM service.
+  @return Whether the DM service was successfully deintialized.
+  @retval QL_ERR_OK successful.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_deinit(void)
+{
+    if(ql_info_handle)
+    {
+    
+        int ret = mbtk_ril_close(MBTK_AT_PORT_DEF);
+        if(ret != 0) 
+        {
+            LOGE("mbtk_info_handle_free fail.");
+            return QL_ERR_FAILED;
+        }
+        else 
+        {
+            LOGI("mbtk_info_handle_free success");
+            return QL_ERR_OK;
+        }
+    }
+    else
+    {
+        LOGE("DM not inited.");
+        return QL_ERR_NOT_INIT;
+    }
+   
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device software version.
+  @param[out] soft_ver Return software version
+  @param[in] soft_ver_len The length of soft_ver
+  @return Whether to successfully get the software version
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+
+int ql_dm_get_software_version(char *soft_ver, int soft_ver_len)
+{
+
+    int ret = -1;
+    if(soft_ver == NULL || soft_ver_len <= 0)
+    {
+         LOGE("Bad parameters  ");
+         return QL_ERR_FAILED;
+    }
+    if(ql_info_handle != NULL)
+    {
+    
+        ret = mbtk_version_get(ql_info_handle,soft_ver);
+        if(ret != 0)
+        {
+            LOGE("ql_dm_get_software_version  error.");
+            return QL_ERR_FAILED;
+        }
+    }
+    else
+    {
+        mbtk_ril_handle* mbtk_info_handle = NULL;
+        mbtk_info_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+        if(mbtk_info_handle == NULL)
+        {
+            LOGE("mbtk_info_handle_get fail.");
+            return QL_ERR_FAILED;
+        }
+        ret = mbtk_version_get(mbtk_info_handle,soft_ver);
+        if(ret != 0)
+        {
+            LOGE("ql_dm_get_software_version  error.");
+            
+        }
+        ret = mbtk_ril_close(MBTK_AT_PORT_DEF);
+        if(ret != 0) 
+        {
+            LOGE("mbtk_info_handle_free fail.");
+            return QL_ERR_FAILED;
+        }
+        
+    }
+    return QL_ERR_OK;
+    
+
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem state.
+  @details QL_DM_MODEM_STATE_ONLINE,if modem starts normally.
+  @details QL_DM_MODEM_STATE_OFFLINE,in modem starts abnormally.
+  @details QL_DM_MODEM_STATE_UNKNOWN,unknown error.
+  @param[out] modem_state The state of modem
+  @return Whether to successfully get the modem state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_modem_state(QL_DM_MODEM_STATE_TYPE_E *modem_state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register modem state event.
+  @param[in] cb_func modem state indication callback function
+  @return Whether the modem state event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+
+int ql_dm_set_modem_state_change_ind_cb(ql_dm_modem_state_ind_cb cb_func)
+{
+    
+        int ret =-1;
+        
+        global_dm_modem_cb = cb_func;
+        
+        if(ql_info_handle != NULL)
+        {
+            
+            ret = mbtk_radio_state_change_cb_reg(mbtk_modem_state_change_cb);
+            if(ret != 0)
+            {
+                LOGE("call mbtk_radio_state_change_cb_reg failed");
+                return QL_ERR_FAILED;
+            }
+        }
+        else 
+        {
+            if(g_md_version_handle == NULL)
+            {
+                g_md_version_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
+                if(g_md_version_handle == NULL)
+                {
+                    LOGE("g_md_version_handle get fail.");
+                    return QL_ERR_FAILED;
+                }
+            }
+            
+            ret = mbtk_radio_state_change_cb_reg(mbtk_modem_state_change_cb);
+            if(ret != 0)
+            {
+                
+                ret = mbtk_ril_close(MBTK_AT_PORT_DEF);
+                if(ret < 0) 
+                {
+                    LOGE("mbtk_info_handle_free fail.");
+                    return QL_ERR_FAILED;
+                }
+                
+                LOGE("call mbtk_radio_state_change_cb_reg failed");
+                return QL_ERR_FAILED;
+            }
+            
+        }
+        
+    return QL_ERR_OK;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get module temperature.
+  @param[out] temperature The current temperature
+  @return Whether to successfully get the temperature
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_temperature(float *temperature);
+
+    
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device serial numbers.
+  @param[out] p_info Pointer that point to ql_dm_device_serial_numbers_info_t
+  @return Whether to successfully get the serial numbers
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_device_serial_numbers(ql_dm_device_serial_numbers_info_t *p_info)
+{
+    int ret = -1;
+    if(ql_info_handle == NULL )
+    {
+        LOGE("DM no init");
+        return QL_ERR_NOT_INIT;
+    }
+    
+    ret = mbtk_imei_get(ql_info_handle, p_info->imei);
+    if(ret != 0) 
+    {
+        LOGE("Error : %d\n", ret);
+        return QL_ERR_FAILED;
+    } 
+    if(strlen(p_info->imei) > 0)
+    {
+        p_info->imei_valid = IMEI_VALID;
+    }
+
+
+    return QL_ERR_OK;
+  
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get device firmware revision identification.
+  @param[out] firmware_rev_id Return device firmware revision id
+  @param[in] firmware_rev_id_len The length of firmware_rev_id
+  @return Whether to successfully get the firmware revision id
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_device_firmware_rev_id(char *firmware_rev_id, int firmware_rev_id_len)
+{
+    int ret = -1;
+    
+    if(ql_info_handle == NULL)
+    {
+        LOGE("DM no init");
+        return QL_ERR_NOT_INIT;
+    }
+    
+    //ret = mbtk_get_modem_version(ql_info_handle, (void *)firmware_rev_id);
+    //mbtk_v2 do not have function
+    ret = -1;
+    if(ret < 0)
+    {
+        LOGE("get modem version failed");
+        return QL_ERR_FAILED;
+    }
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get air plane mode.
+  @param[out] p_info Pointer that point to QL_DM_AIR_PLANE_MODE_TYPE_E
+  @return Whether to successfully get the air plane mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_air_plane_mode(QL_DM_AIR_PLANE_MODE_TYPE_E *p_info)
+{
+    
+    int ret = -1;
+    mbtk_radio_state_enum tmp_rf;
+    if(ql_info_handle == NULL)
+    {
+        LOGE("DM no init");
+        return QL_ERR_NOT_INIT;
+    }
+    ret = mbtk_radio_state_get(ql_info_handle, &tmp_rf);
+    if (ret != 0)
+    {
+        LOGE("mbtk_radio_state_get fail.");
+        return QL_ERR_FAILED;
+    }
+    if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
+    {
+        *p_info = QL_DM_AIR_PLANE_MODE_OFF;
+    }
+    else if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
+    {
+        *p_info = QL_DM_AIR_PLANE_MODE_ON;
+    }
+        
+    return 0;
+
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set air plane mode.
+  @param[in] air_plane_mode 1:ON, 2:OFF
+  @return Whether to successfully set the air plane mode
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+
+
+int ql_dm_set_air_plane_mode(QL_DM_AIR_PLANE_MODE_TYPE_E air_plane_mode)
+{
+    mbtk_radio_state_enum radio = MBTK_RADIO_STATE_MINI_FUNC;
+    int reset = 0;
+    int rf_mode = -1;
+    int ret = -1;
+    
+    if(ql_info_handle == NULL)
+    {
+        LOGE("DM no init");
+        return QL_ERR_NOT_INIT;
+    }
+    if(air_plane_mode == QL_DM_AIR_PLANE_MODE_ON)
+    {
+        rf_mode = LYNQ_AIR_PLANE_MODE_ON;
+    }
+    
+    if(air_plane_mode == QL_DM_AIR_PLANE_MODE_OFF)
+    {
+        rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
+
+    }
+    
+    if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF) 
+    {
+        LOGE("Input mode is error!");
+        return QL_ERR_OP_UNSUPPORTED;
+    }
+
+    
+    ret = mbtk_radio_state_set(ql_info_handle, radio, reset);
+    if(ret != 0)
+    {
+        LOGE("ql_dm_set_air_plane_mode failed");
+    }
+    mbtk_send_singnal();
+    return QL_ERR_OK;
+
+
+}
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief register air plane mode event.
+  @param[in] cb_func Air plane mode indication callback function
+  @return Whether the air plane mode event was successfully registered.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+
+int ql_dm_set_air_plane_mode_ind_cb(ql_dm_air_plane_mode_ind_cb cb_func) 
+{
+    if(ql_info_handle == NULL)
+    {
+        LOGE("No init ");
+        return QL_ERR_NOT_INIT;
+    }
+    
+    g_air_plane_mode_cb = cb_func;
+
+    if (!g_thread_running) 
+    {
+        g_thread_running = true;
+        if (pthread_create(&g_air_plane_mode_thread, NULL, air_plane_mode_monitor, NULL) != 0) 
+        {
+            LOGE("Failed to create air plane mode monitor thread");
+            g_thread_running = false;
+            return QL_ERR_FAILED;
+        }
+    }
+    
+    return QL_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get cpu occupancy.
+  @param[out] cpu_occupancy The percentage of cpu occupancy
+  @return Whether to successfully get the cpu occupancy
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_cpu_occupancy(float *cpu_occupancy);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get mem usage.
+  @param[out] mem_use The percentage of mem usage
+  @return Whether to successfully get the memory usage
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_mem_usage(float *mem_use);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get NV item value.
+  @param[in] nv_item_name The NV item name that is either NV item id or NV item path
+  @param[out] nv_item_value The NV value buf of nv_item_name
+  param[in] nv_item_value_len The length of nv_item_value
+  param[out] nv_len The real length of nv_item_name
+  @return Whether to successfully get the NV value
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_nv_item_value(char *nv_item_name, unsigned char *nv_item_value, int nv_item_value_len, 
+        int *nv_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set NV item value.
+  @param[in] nv_item_name The NV item name that is either NV item id or NV item path
+  @param[in] nv_item_value The NV value of nv_item_name
+  @param[in] nv_item_value_len The length of nv_item_value
+  param[out] nv_len The real length of nv_item_name
+  @return Whether to successfully set the NV value
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_nv_item_value(char *nv_item_name, unsigned char *nv_item_value, int nv_item_value_len, 
+        int *nv_len);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set radio on, its function is the same as at+cfun=1.
+  @return Whether to successfully set the radio on
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_radio_on(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set radio off, its function is the same as at+cfun=0.
+  @return Whether to successfully set the radio off
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_radio_off(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem mem and CPU utilization.
+  @param[out] mem_use The percentage of modem utilization
+  @return Whether to successfully get the modem utilization
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_modem_cpu_occupancy(float *cpu_occupancy);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get modem mem utilization.
+  @param[out] mem_use The percentage of modem utilization
+  @return Whether to successfully get the modem utilization
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_modem_mem_usage(float *mem_use);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get QOOS enable state
+  @param[out] enable The enable state of QOOS
+  @return Whether to successfully get the QOOS enable state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_qoos_enable(char *enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set QOOS enable state
+  @param[in] enable The enable state of QOOS
+  @return Whether to successfully set the QOOS enable state
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_qoos_enable(char enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get QOOS configuration
+  @param[out] config The configuration of QOOS
+  @return Whether to successfully get the QOOS configuration
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int ql_dm_get_qoos_config(ql_dm_qoos_config_t *config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set QOOS configuration
+  @param[in] config The configuration of QOOS
+  @return Whether to successfully set the QOOS configuration
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+//int ql_dm_set_qoos_config(ql_dm_qoos_config_t config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief get MSSR(Modem SubSysem Reset) level.
+  @param[out] p_level The MSSR level
+  @return Whether to successfully get the MSSR level
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_mssr_level(int *p_level);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief set MSSR(Modem SubSysem Reset) level.
+  @param[in] level The MSSR level
+  @return Whether to successfully set the MSSR level
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_mssr_level(int level);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  bind subscription 
+  @param[in] sub_type subscription type 
+  @return Whether to successfully bind subscription.
+  @retval QL_ERR_OK successful
+  @retval QL_ERR_NOT_INIT uninitialized
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready
+  @retval QL_ERR_INVALID_ARG Invalid arguments
+  @retval Other error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_bind_subscription(QL_DM_BIND_SUB_TYPE_E sub_type);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_service_error_cb(ql_dm_service_error_cb_f cb)
+{
+    int ret = -1;
+    if(ql_info_handle == NULL)
+    {
+        LOGE("DM no init ");
+        return QL_ERR_NOT_INIT;
+
+    }
+    global_dm_error_cb = cb;
+    ret = mbtk_ril_ser_state_change_cb_reg(mbtk_dm_set_service_error_func);
+    if(ret != 0)
+    {
+        LOGE("call mbtk_ril_server_state_change_reg failed");
+        return QL_ERR_FAILED;
+    }
+    
+    return QL_ERR_OK;
+}
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get module the last time shutdown reason 
+  @param[out] shutdown_reason the shutdown reason
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_shutdown_reason(QL_DM_SHUTDOWN_REASON_E *shutdown_reason);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief Get module this time bootup reason 
+  @param[out] bootup_reason the bootup reason
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_bootup_reason(QL_DM_BOOT_UP_REASON_E *bootup_reason);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief set oos config 
+  @param[out] oos param
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_qoos_config(int p1, int p2, int p3);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief get oos config 
+  @param[out] oos param
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_get_qoos_config(int *p1, int *p2, int *p3);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief set oos enable 
+  @param[out] oos param
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_dm_set_qoos_enable(char enable);
+#ifdef __cplusplus
+}
+#endif
+
+
+