Add basic change for v1453

Change-Id: I9497a61bbc3717f66413794a4e7dee0347c0bc33
diff --git a/mbtk/mbtk_at/src/mbtk_at.c b/mbtk/mbtk_at/src/mbtk_at.c
new file mode 100755
index 0000000..3389857
--- /dev/null
+++ b/mbtk/mbtk_at/src/mbtk_at.c
@@ -0,0 +1,229 @@
+/*
+*
+*
+* Author : lb
+* Date   : 2021/11/5 10:53:49
+*
+*/
+#include "telutl.h"
+#include "mbtk_at.h"
+#include <dlfcn.h>
+#include <include/log.h>
+#include <stdarg.h>
+#include <errno.h>
+
+// See utlAtParameterOp_T
+static char *at_op_list[] = {"UNKNOWN", "EXEC", "GET", "SET", "ACTION", "TEST", NULL};
+
+
+//void* mbtk_cmd_line_ex = NULL;
+#ifdef MBTK_DATA_MODE_SUPPORT
+static mbtk_data_mode_callback_func data_mode_cb = NULL;
+static TelAtParserID mbtk_atp_index = TEL_AT_CMD_ATP_0;
+static char datamode_buff[4096];
+static int datamode_buff_len = 0;
+#endif
+
+#if 0
+mbtk_audio_exec_f mbtk_at_play = NULL;
+mbtk_audio_exec_f mbtk_at_rec = NULL;
+#endif
+
+typedef struct {
+    /*mbtk_at_func_type_enum type;*/
+    char lib_name[50];
+    void *handle;
+} mbtk_at_lib_info_t;
+
+mbtk_at_func_t *func_list = NULL;
+static mbtk_at_lib_info_t lib_list[] = {
+    {"/lib/libmbtk_lib.so", NULL},      /* MBTK_AT_FUNC_TYPE_BASIC */
+    //{"/lib/libmbtk_factory.so", NULL},  /* MBTK_AT_FUNC_TYPE_FACTORY */
+    //{"/lib/libmbtk_audio.so", NULL},    /* MBTK_AT_FUNC_TYPE_AUDIO */
+    //{"/lib/libmbtk_gnss.so", NULL},     /* MBTK_AT_FUNC_TYPE_GNSS */
+    //{"/lib/libmbtk_ecall.so", NULL},    /* MBTK_AT_FUNC_TYPE_ECALL */
+    //{"/lib/libmbtk_socket.so", NULL},   /* MBTK_AT_FUNC_TYPE_SOCKET */
+    //{"/lib/libmbtk_tcpip.so", NULL},    /* MBTK_AT_FUNC_TYPE_TCPIP */
+    //{"/lib/libmbtk_http.so", NULL},     /* MBTK_AT_FUNC_TYPE_HTTP */
+    //{"/lib/libmbtk_ftp.so", NULL}       /* MBTK_AT_FUNC_TYPE_FTP */
+};
+
+BOOL getExtValue( const utlAtParameterValue_P2c param_value_p,
+                  int index,
+                  int *value_p,
+                  int minValue,
+                  int maxValue,
+                  int DefaultValue);
+
+BOOL getExtUValue(const utlAtParameterValue_P2c param_value_p,
+                  int index,
+                  unsigned int *value_p,
+                  unsigned int minValue,
+                  unsigned int maxValue,
+                  unsigned int DefaultValue);
+
+BOOL getExtString( const utlAtParameterValue_P2c param_value_p,
+                    int index,
+                    CHAR *outString,
+                    INT16 maxStringLength,
+                    INT16 *outStringLength,
+                    CHAR *defaultString);
+
+void mbtk_log(int level, const char *format, ...)
+{
+	char *timestr;
+	char buf[1024];
+	va_list ap;
+	struct timeval log_time;
+	int length = 0;
+
+	va_start(ap, format);
+	length = vsnprintf(buf,1024,format,ap);
+	if(length > 0) {
+        __android_log_printf(LOG_ID_RADIO, level, "%s", buf);
+    }
+
+	va_end(ap);
+}
+
+char *op2str(utlAtParameterOp_T op)
+{
+    return at_op_list[op];
+}
+
+static bool str_empty(const void *str)
+{
+    if (str && strlen((char*)str) > 0)
+        return false;
+
+    return true;
+}
+
+void func_add(mbtk_at_func_type_enum type, char *name)
+{
+    if(!str_empty(name)) {
+        mbtk_at_func_t *func_ptr = (mbtk_at_func_t*)malloc(sizeof(mbtk_at_func_t));
+        if(func_ptr) {
+            memset(func_ptr, 0x0, sizeof(mbtk_at_func_t));
+            func_ptr->type = type;
+            memcpy(func_ptr->name, name, strlen(name));
+
+            func_ptr->next = func_list;
+            func_list = func_ptr;
+        }
+    }
+}
+
+mbtk_at_func_t *func_get(char *name)
+{
+    mbtk_at_func_t *func_ptr = func_list;
+    while(func_ptr) {
+        if(!strcmp(func_ptr->name, name)) {
+            return func_ptr;
+        }
+        func_ptr = func_ptr->next;
+    }
+
+    return func_ptr;
+}
+
+void mbtk_at_proc_null()
+{
+    LOG("MBTK_AT function not found in so.");
+}
+
+int mbtk_lib_init()
+{
+    #define MBTK_FUNC_INIT
+    #include "mbtk_at_func.h"
+    #undef MBTK_FUNC_INIT
+
+    set_service_log_tag("MBTK_AT");
+    mbtk_at_func_t *func_ptr = func_list;
+    while(func_ptr) {
+        if(lib_list[func_ptr->type].handle == NULL) {
+            lib_list[func_ptr->type].handle = dlopen(lib_list[func_ptr->type].lib_name , RTLD_LAZY);
+        }
+
+        if(lib_list[func_ptr->type].handle) {
+            func_ptr->func = dlsym(lib_list[func_ptr->type].handle, func_ptr->name);
+            if(func_ptr->func == NULL) {
+                LOG("%s() dlsym from %s fail.", func_ptr->name, lib_list[func_ptr->type].lib_name);
+                //return -1;
+                func_ptr->func = mbtk_at_proc_null;
+            } else {
+                LOG("%s function : %s", lib_list[func_ptr->type].lib_name, func_ptr->name);
+            }
+        } else {
+            LOG("dlopen() %s fail : %d", lib_list[func_ptr->type].lib_name, errno);
+            //return -1;
+            func_ptr->func = mbtk_at_proc_null;
+        }
+
+        func_ptr = func_ptr->next;
+    }
+    return 0;
+}
+
+#ifdef MBTK_DATA_MODE_SUPPORT
+static utlReturnCode_T mbtk_utlAtTxLineDataFunction_P(const unsigned char *octets_p, const size_t n, void *arg_p)
+{
+    if(n > 0) {
+        LOG("DATA[%d]:%s", n, octets_p);
+        LOG("ARG:%s", arg_p);
+        if(datamode_buff_len + n > 4096) {
+            utlAtParserOp(aParser_p[mbtk_atp_index], utlAT_PARSER_OP_DISABLE_BYPASS_MODE);
+            ATRESP(MAKE_AT_HANDLE(mbtk_atp_index), ATCI_RESULT_CODE_ERROR, 0, NULL);
+            return utlSUCCESS;
+        }
+
+        memcpy(datamode_buff + datamode_buff_len, octets_p, n);
+        datamode_buff_len += n;
+
+        // control-z(0x1a)
+        if(datamode_buff[datamode_buff_len - 1] == 0x1a) {
+            utlAtParserOp(aParser_p[mbtk_atp_index], utlAT_PARSER_OP_DISABLE_BYPASS_MODE);
+            datamode_buff[datamode_buff_len - 1] = '\0';
+            datamode_buff_len--;
+
+            ATRESP(MAKE_AT_HANDLE(mbtk_atp_index), ATCI_RESULT_CODE_OK, 0, datamode_buff);
+            //ATRESP(MAKE_AT_HANDLE(mbtk_atp_index), ATCI_RESULT_CODE_OK, 0, "OK");
+
+            if(data_mode_cb) {
+                data_mode_cb(datamode_buff, datamode_buff_len);
+                data_mode_cb = NULL;
+            }
+        }
+    }
+
+    return utlSUCCESS;
+}
+
+utlReturnCode_T mbtk_data_mode_enter(TelAtParserID atp_index, mbtk_data_mode_callback_func cb)
+{
+    data_mode_cb = cb;
+    utlReturnCode_T result = utlAtParserOp(aParser_p[atp_index], utlAT_PARSER_OP_ENABLE_BYPASS_MODE);
+    if (result != utlSUCCESS)
+    {
+    	LOG("(utlAT_PARSER_OP_ENABLE_BYPASS_MODE)Enter data mode fail[%d].", result);
+    	result = ATRESP(MAKE_AT_HANDLE(atp_index), ATCI_RESULT_CODE_ERROR, 0, NULL);
+    } else {
+        result = utlAtParserOp(aParser_p[atp_index], utlAT_PARSER_OP_SET_TX_LINE_DATA_HANDLER, mbtk_utlAtTxLineDataFunction_P);
+        if (result == utlSUCCESS)
+        {
+            // ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, "\r\n>>\r\n");
+            LOG("Enter data mode success.");
+            mbtk_atp_index = atp_index;
+            memset(datamode_buff, 0x0, 4096);
+            datamode_buff_len = 0;
+
+            result = ATRESP(MAKE_AT_HANDLE(atp_index), ATCI_RESULT_CODE_OK, 0, ">>");
+        } else {
+            LOG("(utlAT_PARSER_OP_SET_TX_LINE_DATA_HANDLER)Enter data mode fail[%d].", result);
+            result = ATRESP(MAKE_AT_HANDLE(atp_index), ATCI_RESULT_CODE_ERROR, 0, NULL);
+        }
+    }
+
+    return result;
+}
+#endif
\ No newline at end of file