[Feature][T108][task-view-1499] change gsw .h file

Only Configure: No
Affected branch: GSW_V1453
Affected module: libgsw
Is it affected on IC: only ASR
Self-test: yes
Doc Update: no

Change-Id: I678871907e2be939e6673ee09bfed88992013348
diff --git a/mbtk/libgsw_lib/gsw_at_interface.c b/mbtk/libgsw_lib/gsw_at_interface.c
new file mode 100755
index 0000000..2f48b47
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_at_interface.c
@@ -0,0 +1,341 @@
+#include <sys/types.h>

+#include <sys/socket.h>

+#include <sys/un.h>

+#include <unistd.h>

+#include <arpa/inet.h>

+#include <stdio.h>

+#include <stdlib.h>

+#include <signal.h>

+#include <string.h>

+#include <pthread.h>

+#include <fcntl.h>

+#include <errno.h>

+#include <stdint.h>

+#include <dlfcn.h>

+#include <stdbool.h>

+#include "gsw_at_interface.h"

+#ifndef LOG_ERR_LEVEL

+#define LOG_ERR_LEVEL  3      /* error conditions */

+#endif

+#ifndef LOG_WARN_LEVEL

+#define LOG_WARN_LEVEL 4   /* warning conditions */

+#endif

+#ifndef LOG_INFO_LEVEL

+#define LOG_INFO_LEVEL 6      /* informational */

+#endif

+#ifndef LOG_DEBUG_LEVEL

+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */

+#endif

+#ifndef LOG_VERBOSE_LEVEL

+#define LOG_VERBOSE_LEVEL 8

+#endif

+

+#define GSW_AT "[HAL][GSW_AT]"

+

+#define LOGV(fmt, args ...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_AT"" fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGI(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: "GSW_AT"" fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGD(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_AT"" fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGW(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: "GSW_AT"" fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGE(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: "GSW_AT"" fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+    

+

+#define GSW_HAL_MEM_INVAILD -2 //表示入参地址为NULL

+

+#define OUT_MAX_SIZE 1024

+#define LINE __LINE__

+#define FUNC __FUNCTION__

+#define AT_EXTERSION_SOCKET_NAME "/tmp/atcmdext"

+#define SOCKET_ZERO   0

+#define SOCKET_SUCC   1

+#define SOCKET_FAIL  -1

+

+typedef void (*mbtk_log)(int level, const char *format,...);

+typedef enum

+{

+    A_SUCCESS = 0,

+    A_ERROR = -1

+}LYNQ_AT_E;

+

+static mbtk_log fun_ptr_log = NULL;

+void *dlHandle_at = NULL;

+char *lynqLib_at = "/lib/libmbtk_lib.so";

+char *output = NULL;

+int sockfd = 0;

+int result = A_SUCCESS;

+char buffer_at[OUT_MAX_SIZE] = {0};

+struct sockaddr_in addr_serv;

+struct sockaddr_un addr_server;

+LYNQ_AT_CALLBACK tmp = NULL;

+static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;

+socklen_t len;

+bool connect_state = false;

+

+

+int socket_local_client (char* name) {

+    LOGD("[%d][%s] enter",LINE,FUNC);

+    sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

+    if (sockfd < 0)

+    {

+        LOGD("Can't open stream socket (%s)", name);

+        return -1;

+    }

+    addr_server.sun_family = AF_UNIX;

+    memset(addr_server.sun_path, '\0', sizeof(addr_server.sun_path));

+    strncpy(addr_server.sun_path, name, sizeof(addr_server.sun_path) - 1);

+    if (connect(sockfd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)

+    {

+        close(sockfd);

+        LOGD("Can't connect to server side, path: %s, %s", name, strerror(errno));

+        return -1;

+    }

+    LOGD("[%d][%s] connect %s success",LINE,FUNC,name);

+    return sockfd;

+}

+bool send_msg_to_service(int fd,char *msg,int size)

+{

+    LOGD("[%d][%s] enter",LINE,FUNC);

+    if (fd < 0)

+    {

+        LOGD("fd invalid when send to atci service. errno = %d", errno);

+        return false;

+    }

+    if(NULL == msg)

+    {

+        LOGD("atcmd is null.");

+        return false;

+    }

+    int sendLen = send(fd, msg, size, 0);

+    if (sendLen != size)

+    {

+        LOGD("lose data when send to atci service. errno = %d", errno);

+        return false;

+    }

+    LOGD("client send to app demo: %s", msg);

+    return true;

+}

+

+int atsvc_cmd_recv(int fd, char *buf, int len)

+{

+    int ret = 0;

+    ret = recv(fd, buf, len, 0);

+    LOGD("[%d][%s] recv after",LINE,FUNC);

+    if (ret < 0)

+    {

+        LOGD("acti_cmd_recv client select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);

+        return SOCKET_FAIL;

+    }

+    else if(ret == 0)

+    {

+        LOGD("acti_cmd_recv client recv error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);

+        return SOCKET_ZERO;

+    }

+  return SOCKET_SUCC;

+}

+/**

+ * @brief send third cmd to service and receive input,then send output to service

+ * 

+ * @param parm 

+ * @return void* 

+ */

+void *thread_recv(void *parm)

+{

+    LOGD("[%d][%s] enter",LINE,FUNC);

+    char at_cmd[100] = {0};

+    int fd = -1;

+    int ret = 0;

+    fd = socket_local_client(AT_EXTERSION_SOCKET_NAME);

+    if(fd <= 0)

+    {

+        LOGE("socket_local_client  fail\n");

+        connect_state = false;

+        pthread_mutex_unlock(&s_startupMutex);

+        return NULL;

+    }

+    int len_buf = strlen(buffer_at);

+    if(!send_msg_to_service(fd,buffer_at,len_buf))

+    {

+        LOGE("send_msg_to_service  fail\n");

+        connect_state = false;

+        pthread_mutex_unlock(&s_startupMutex);

+        return NULL;

+    }

+    connect_state = true;

+    pthread_mutex_unlock(&s_startupMutex);

+    char *input = NULL;

+    output = (char *)malloc(sizeof(char)*OUT_MAX_SIZE);

+    if(NULL == output)

+    {

+        LOGE("thread_recv malloc fail\n");

+        return NULL;

+    }

+    TryNewLink:

+    if(connect_state == false)

+    {

+        if (connect(fd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)

+        {

+            close(fd);

+            LOGE("Can't connect to server side, path: %s, errno:%d", AT_EXTERSION_SOCKET_NAME, errno);

+            return NULL;

+        }

+        connect_state = true;

+    }

+    while (1)

+    {

+        /*receive at cmd*/

+        memset(at_cmd, 0, sizeof(at_cmd));

+        ret = atsvc_cmd_recv(fd, at_cmd,sizeof(at_cmd));

+        if (ret < 0)

+        {

+            LOGE("[%d][%s]receive CMD error",LINE,FUNC);

+            continue;

+        }

+        else if(ret == SOCKET_ZERO)

+        {

+            LOGE("maybe client socket closed 1. retry new link!");

+            connect_state = false;

+            goto TryNewLink;

+        }

+        input = at_cmd;

+        int len = strlen(input);

+        while (len > 0 && (input[len - 1] == '\r' || input[len - 1] == '\n'))

+	    {

+            input[--len] = '\0';

+	    }

+        //begin deal with callback

+        tmp(input, output, OUT_MAX_SIZE);

+        LOGD("lynq_reg_third_at send output to service\n");

+        if(!send_msg_to_service(fd,output, strlen(output)))

+        {

+            LOGE("thread_recv send fail\n");

+            continue;

+        }

+    }

+    free(output);

+    output = NULL;

+    if(fd != 0)

+    {

+        close(fd);

+    }

+    return NULL;

+}

+

+/**

+ * @brief Threads are created to communicate with the server

+ * 

+ * @return int 

+ */

+int lynq_connect_service_start(void)

+{

+    LOGD("[%d][%s] enter",LINE,FUNC);

+    pthread_t lynq_at_tid;

+    int rt = pthread_create(&lynq_at_tid, NULL, thread_recv, NULL);

+    pthread_mutex_lock(&s_startupMutex);

+    LOGD("[%d][%s] pthread mutex unlock",LINE,FUNC);

+    if((connect_state != true) && rt < 0)

+    {

+        LOGE("connect fail,rt:%d,connect state:%d\n",rt,connect_state);

+        return -1;

+    }

+    return 0;

+}

+

+/**

+ * @brief Type:[IN] send third at cmd to service

+ * @param ext_at Type:[IN] input at cmd

+ * @param callback Type:[IN]

+ * @return int 

+ */

+int32_t gsw_reg_atcmd(const char *atcmd,LYNQ_AT_CALLBACK func)

+{

+    if(NULL == atcmd || NULL == func)

+    {

+        return GSW_HAL_NORMAL_FAIL;

+    }

+    dlHandle_at = dlopen(lynqLib_at, RTLD_NOW);

+    fun_ptr_log = (mbtk_log)dlsym(dlHandle_at, "mbtk_log");

+    if(fun_ptr_log == NULL || dlHandle_at == NULL)

+    {

+        return GSW_HAL_NORMAL_FAIL;

+    }

+    memcpy(buffer_at, atcmd, strlen(atcmd));

+    tmp = func;

+    LOGD("lynq_reg_third_at start\n");

+    int ret = lynq_connect_service_start();

+    

+    if(ret != 0)

+    {

+        LOGE("lynq_connect_service_start start failed\n");

+        return GSW_HAL_NORMAL_FAIL;

+    }

+    LOGD("lynq_connect_service_start success ret:%d\n",ret);

+    return GSW_HAL_SUCCESS;

+}

+

+int32_t gsw_sdk_at_init(void)

+{

+    return GSW_HAL_SUCCESS;

+}