[Feature][ZXW-33]merge ZXW 0428 version

Change-Id: I11f167edfea428d9fab198ff00ff1364932d1b0b
diff --git a/ap/lib/libatreg/atreg_common.c b/ap/lib/libatreg/atreg_common.c
new file mode 100755
index 0000000..84f8667
--- /dev/null
+++ b/ap/lib/libatreg/atreg_common.c
@@ -0,0 +1,264 @@
+/**

+ * @file atreg_common.c

+ * @brief Implementation of the inter APIs of libatreg.

+ *

+ * Copyright (C) 2021 Sanechips Technology Co., Ltd.

+ * @author 

+ * 

+ * This program is free software; you can redistribute it and/or modify

+ * it under the terms of the GNU General Public License version 2 as

+ * published by the Free Software Foundation. £¨±ØÑ¡£ºGPLv2 Licence£©

+ *

+ */

+

+

+/*******************************************************************************

+ * 						       Include header files 						   *

+ *******************************************************************************/

+#include <stdio.h>

+#include <string.h>

+#include <stdlib.h>

+

+#include "atreg_common.h"

+#include "at_utils.h"

+

+

+/*******************************************************************************

+ * 						    	Macro definitions							   *

+ *******************************************************************************/	 

+

+

+/*******************************************************************************

+ * 						       	Type definitions							   *

+ *******************************************************************************/

+

+ 

+/*******************************************************************************

+ * 					       Local variable definitions						   *

+ *******************************************************************************/

+ 

+ 

+/*******************************************************************************

+ * 					       Global variable definitions					       *

+ *******************************************************************************/

+ 

+struct atreg_ser_context_t atreg_ser_ctx;

+struct atreg_info_context_t atreg_info_ctx;

+struct atreg_common_context_t atreg_common_ctx;

+

+/** ser - ¶¯Ì¬id³Ø,	·¶Î§: 0~511 */

+unsigned char atreg_ser_dynamic_idpool[ATREG_SER_ID_MAX];

+/** info - ¶¯Ì¬id³Ø,	·¶Î§: 512~768 */

+unsigned char atreg_info_dynamic_idpool[ATREG_INFO_ID_MAX];

+

+extern int atreg_ser_cxt_is_init;

+extern int atreg_info_cxt_is_init;

+/*******************************************************************************

+ * 				           Local function declarations						   *

+ *******************************************************************************/

+ 

+ 

+/*******************************************************************************

+ * 					      Local function implementations 					   *

+ *******************************************************************************/

+static void *atreg_ser_search_instance_by_prefix_proc(char *at_cmd_prefix)

+{

+	struct atreg_ser_instance_t * entry = NULL;

+	

+	pthread_mutex_lock(&atreg_ser_ctx.at_ser_lock);

+    list_for_each_entry(entry, &atreg_ser_ctx.at_ser_list, list) {

+		if(0 == at_strncmp(at_cmd_prefix, entry->at_cmd_prefix, AT_CMD_PREFIX)) {

+			pthread_mutex_unlock(&atreg_ser_ctx.at_ser_lock);

+			

+			return (void *)entry;

+		}

+	}

+	pthread_mutex_unlock(&atreg_ser_ctx.at_ser_lock);

+	

+	return NULL;

+}

+

+

+static void *atreg_info_search_instance_by_prefix_proc(char *at_cmd_prefix)

+{

+	struct atreg_info_instance_t * entry = NULL;

+	

+	pthread_mutex_lock(&atreg_info_ctx.at_info_lock);

+	list_for_each_entry(entry, &atreg_info_ctx.at_info_list, list) {

+		if(0 == at_strncmp(at_cmd_prefix, entry->at_cmd_prefix, AT_CMD_PREFIX)) {

+			pthread_mutex_unlock(&atreg_info_ctx.at_info_lock);

+			

+			return (void *)entry;

+		}

+	}

+	pthread_mutex_unlock(&atreg_info_ctx.at_info_lock);

+	

+	return NULL;

+}

+

+

+static void *atreg_ser_search_instance_by_reqid_proc(int req_msg_id)

+{

+	struct atreg_ser_instance_t *entry = NULL;

+	

+    pthread_mutex_lock(&atreg_ser_ctx.at_ser_lock);

+	list_for_each_entry(entry, &atreg_ser_ctx.at_ser_list, list) {

+        if(entry->req_msg_id == req_msg_id) {

+		    pthread_mutex_unlock(&atreg_ser_ctx.at_ser_lock);

+			

+			return (void *)entry;

+		}

+    }

+    pthread_mutex_unlock(&atreg_ser_ctx.at_ser_lock);

+	

+    return NULL;

+}

+

+

+static void *atreg_info_search_instance_by_reqid_proc(int req_msg_id)

+{

+	struct atreg_info_instance_t *entry = NULL;

+	

+    pthread_mutex_lock(&atreg_info_ctx.at_info_lock);

+	list_for_each_entry(entry, &atreg_info_ctx.at_info_list, list) {

+        if(entry->req_msg_id == req_msg_id) {

+		    pthread_mutex_unlock(&atreg_info_ctx.at_info_lock);

+			

+			return (void *)entry;

+		}

+    }

+    pthread_mutex_unlock(&atreg_info_ctx.at_info_lock);

+	

+    return NULL;

+}

+

+

+static void *atreg_ser_search_instance_tmp_by_reqid_proc(int req_msg_id)

+{

+	struct atreg_ser_instance_t *entry = NULL;

+	

+    pthread_mutex_lock(&atreg_ser_ctx.at_ser_lock_tmp);

+	list_for_each_entry(entry, &atreg_ser_ctx.at_ser_list_tmp, list) {

+        if(entry->req_msg_id == req_msg_id) {

+		    pthread_mutex_unlock(&atreg_ser_ctx.at_ser_lock_tmp);

+			

+			return (void *)entry;

+		}

+    }

+    pthread_mutex_unlock(&atreg_ser_ctx.at_ser_lock_tmp);

+	

+    return NULL;

+}

+

+

+static void *atreg_info_search_instance_tmp_by_reqid_proc(int req_msg_id)

+{

+	struct atreg_info_instance_t *entry = NULL;

+	

+    pthread_mutex_lock(&atreg_info_ctx.at_info_lock_tmp);

+	list_for_each_entry(entry, &atreg_info_ctx.at_info_list_tmp, list) {

+        if(entry->req_msg_id == req_msg_id) {

+		    pthread_mutex_unlock(&atreg_info_ctx.at_info_lock_tmp);

+			

+			return (void *)entry;

+		}

+    }

+    pthread_mutex_unlock(&atreg_info_ctx.at_info_lock_tmp);

+	

+    return NULL;

+}

+

+

+/*******************************************************************************

+ * 				       	  Global function implementations					   *

+ *******************************************************************************/

+void atreg_wait_rsp(int msg_cmd)

+{

+	int ret = -1;

+	

+	if (clock_gettime(CLOCK_REALTIME, &atreg_common_ctx.ts) == -1) {

+		slog(ATREG_PRINT, SLOG_NORMAL, "atreg_wait_rsp clock_gettime fail.\n");

+		return;

+	}

+	atreg_common_ctx.ts.tv_sec += WAIT_RSP_TIMEOUT;

+	

+	while ((ret = sem_timedwait(&atreg_common_ctx.sem_id, &atreg_common_ctx.ts)) == -1 && errno == EINTR)

+		continue;

+	if(-1 == ret) {

+		slog(ATREG_PRINT, SLOG_ERR, "Err: atreg_wait_rsp wait msg(%x) timeout.\n", msg_cmd); 				

+	}

+	else {

+		slog(ATREG_PRINT, SLOG_NORMAL, "atreg_wait_rsp post msg(%x) response.\n", msg_cmd);

+	}

+

+	return;

+}

+

+

+void *atreg_search_instance_by_prefix(char *at_cmd_prefix, int atreg_type)

+{

+	void* patreg = NULL;

+

+	switch (atreg_type) {

+		case AT_REG_SER:

+			patreg = atreg_ser_search_instance_by_prefix_proc(at_cmd_prefix);

+			break;

+

+		case AT_REG_INFO:

+			patreg = atreg_info_search_instance_by_prefix_proc(at_cmd_prefix);

+			break;

+

+		default:

+			break;

+	}

+

+	return patreg;

+}

+

+

+void *atreg_search_instance_tmp_by_reqid(int req_msg_id, int atreg_type)

+{

+	void* patreg = NULL;

+

+	switch (atreg_type) {

+	case AT_REG_SER:

+		patreg = atreg_ser_search_instance_tmp_by_reqid_proc(req_msg_id);

+		break;

+

+	case AT_REG_INFO:

+		patreg = atreg_info_search_instance_tmp_by_reqid_proc(req_msg_id);

+		break;

+

+	default:

+		break;

+	}

+

+	return patreg;

+}

+

+

+struct atreg_instance_and_type_t atreg_search_instance_and_type_by_reqid(int req_msg_id)

+{

+    void* patreg = NULL;

+	struct atreg_instance_and_type_t atreg_instance_and_type = {0};

+

+	if(atreg_ser_cxt_is_init)

+	patreg = atreg_ser_search_instance_by_reqid_proc(req_msg_id);

+	if (NULL != patreg) {

+		atreg_instance_and_type.type = AT_REG_SER;

+		atreg_instance_and_type.instance = patreg;

+

+		return atreg_instance_and_type;

+	}

+	if(atreg_info_cxt_is_init)

+	patreg = atreg_info_search_instance_by_reqid_proc(req_msg_id);

+	if (NULL != patreg) {

+		atreg_instance_and_type.type = AT_REG_INFO;

+		atreg_instance_and_type.instance = patreg;

+

+		return atreg_instance_and_type;

+	}

+	atreg_instance_and_type.type = -1;

+	return atreg_instance_and_type;

+}

+