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

Change-Id: I11f167edfea428d9fab198ff00ff1364932d1b0b
diff --git a/ap/lib/libvsim/ght_vsim_api.c b/ap/lib/libvsim/ght_vsim_api.c
index 5d2647f..12a5afa 100755
--- a/ap/lib/libvsim/ght_vsim_api.c
+++ b/ap/lib/libvsim/ght_vsim_api.c
@@ -10,8 +10,10 @@
 extern int32_t zte_mdm_event_regist(zte_mdm_event_ind_callback ind_cb);

 

 extern int32_t zte_atVsimInit(VSIM_COMMAND vsim_apdu_process_fn, uint8_t nSimID);

+extern int32_t zte_atSoftSimInit(SoftSim_COMMAND softssim_apdu_process_fn, uint8_t nSimID);

 

 extern int32_t zte_atVsimClose(VSIM_COMMAND vsim_apdu_process_fn, uint8_t nSimID);

+extern int32_t zte_atSoftSimClose(SoftSim_COMMAND softssim_apdu_process_fn, uint8_t nSimID);

 

 extern int32_t zte_atVsimReset(void);

 

@@ -96,6 +98,12 @@
 	zte_mdm_event_regist(fibo_mdm_event_ind_cb);

     zte_atVsimInit(vsim_apdu_process, nSimID);

 }

+void fibo_SoftSim_init(SoftSim_COMMAND softsim_apdu_process, uint8_t nSimID)

+{

+    printf("[VSIM] fibo_SoftSim_init,%d", nSimID);

+	zte_mdm_event_regist(fibo_mdm_event_ind_cb);

+    zte_atSoftSimInit(softsim_apdu_process, nSimID);

+}

 

 /**********************************************************

 ** Function Name: fibo_vsim_close

@@ -109,6 +117,11 @@
     printf("[VSIM] fibo_vsim_close,%d", nSimID);

     zte_atVsimClose(vsim_apdu_process, nSimID);

 }

+void fibo_SoftSim_close(SoftSim_COMMAND softsim_apdu_process, uint8_t nSimID)

+{

+    printf("[VSIM] fibo_SoftSim_close,%d", nSimID);

+    zte_atSoftSimClose(softsim_apdu_process, nSimID);

+}

 

 /**************************************************************

 ** Function Name: fibo_set_sim_workmode

diff --git a/ap/lib/libvsim/ght_vsim_api.h b/ap/lib/libvsim/ght_vsim_api.h
index 685794d..b381421 100755
--- a/ap/lib/libvsim/ght_vsim_api.h
+++ b/ap/lib/libvsim/ght_vsim_api.h
@@ -247,7 +247,7 @@
 *********************************************************************/

 

 typedef int (*VSIM_COMMAND)(uint8_t *apdu_req, uint16_t apdu_req_len,uint8_t *apdu_rsp, uint16_t *apdu_rsp_len, uint8_t slot);

-

+typedef int (*SoftSim_COMMAND)(uint8_t *apdu_req, uint16_t apdu_req_len,uint8_t *apdu_rsp, uint16_t *apdu_rsp_len, uint8_t slot);

 

 /*********************************************************************

 ** Ãû³Æ£º FIBO_MODEM_EVENT

@@ -282,6 +282,7 @@
 **************************************************************************/

 

 extern void fibo_vsim_init(VSIM_COMMAND vsim_apdu_process, uint8_t nSimID);

+extern void fibo_SoftSim_init(SoftSim_COMMAND softsim_apdu_process, uint8_t nSimID);

 

 /**********************************************************

 ** Function Name: fibo_vsim_close

@@ -293,6 +294,7 @@
 ***********************************************************/

 

 extern void fibo_vsim_close(VSIM_COMMAND vsim_apdu_process, uint8_t nSimID);

+extern void fibo_SoftSim_close(SoftSim_COMMAND softsim_apdu_process, uint8_t nSimID);

 

 /**************************************************************

 ** Function Name: fibo_set_dualsim

diff --git a/ap/lib/libvsim/libvsim.c b/ap/lib/libvsim/libvsim.c
index 22067cd..e0f275b 100755
--- a/ap/lib/libvsim/libvsim.c
+++ b/ap/lib/libvsim/libvsim.c
@@ -37,7 +37,9 @@
 int g_read_thread_state = -1;
 int g_msg_thread_state = -1;
 VSIM_COMMAND g_vsim_apdu_process_cb;
+SoftSim_COMMAND g_softsim_apdu_process_cb;
 zte_mdm_event_ind_callback g_vsim_event_ind_cb;
+unsigned char g_vsim_slot[2];
 
 int32_t zte_mdm_event_ind_cb(E_MODEM_EVENT_ID event_id, void *ind_data, uint32_t  ind_data_len)
 {
@@ -125,7 +127,7 @@
 static void read_thread_entry(void *arg)
 {
 	prctl(PR_SET_NAME, "vsim_read", 0, 0, 0);
-	while(g_vsim_apdu_process_cb)
+	while(g_vsim_event_ind_cb)
 	{
 		VSIM_MSG_BUF msg_in = {0};
 		VSIM_MSG_BUF msg_out = {0};
@@ -150,8 +152,14 @@
 			vsim_set(MSG_CMD_VSIM_SET_STANDBY,0);
 		}
 		msg_in.usDataLen = sizeof(msg_in.aucDataBuf);
-		ret = g_vsim_apdu_process_cb(&msg_out.aucDataBuf[2], msg_out.usDataLen, msg_in.aucDataBuf, 
-		&msg_in.usDataLen, msg_out.aucDataBuf[0]);
+		if(g_vsim_apdu_process_cb && msg_out.aucDataBuf[0] < 2 && g_vsim_slot[msg_out.aucDataBuf[0]] == 1){
+			ret = g_vsim_apdu_process_cb(&msg_out.aucDataBuf[2], msg_out.usDataLen, msg_in.aucDataBuf, 
+			&msg_in.usDataLen, msg_out.aucDataBuf[0]);
+		}
+		if(g_softsim_apdu_process_cb && msg_out.aucDataBuf[0] < 2 && g_vsim_slot[msg_out.aucDataBuf[0]] == 2){
+			ret = g_softsim_apdu_process_cb(&msg_out.aucDataBuf[2], msg_out.usDataLen, msg_in.aucDataBuf, 
+			&msg_in.usDataLen, msg_out.aucDataBuf[0]);
+		}
 		vsim_debug_printf("##vsim## g_vsim_apdu_process_cb ret=0x%x len=%d\n", ret, msg_in.usDataLen);
 		//ÇÐÐéÄ⿨
 		if(is_auth){
@@ -214,7 +222,11 @@
 					char imei[]="862769025435956";
 					fibo_set_IMEI_by_simid(imei,sizeof(imei),1);
 					fibo_mdm_event_regist(zte_mdm_event_ind_cb);
-					fibo_vsim_init(zte_vsim_ind_cb,1);
+					vsim_set(MSG_CMD_VSIM_SET_STANDBY,1);
+					vsim_card_switch_req(1);
+					vsim_set(MSG_CMD_VSIM_SET_SWITCH,1);
+					get_modem_info("AT+CFUN=1\r\n", NULL, NULL);
+					g_vsim_slot[1] = 1;
 				}
 				if(stMsg.aucDataBuf[0] == 2){
 					fibo_vsim_close(zte_vsim_ind_cb,1);
@@ -246,9 +258,13 @@
 
 int32_t zte_atVsimInit(VSIM_COMMAND vsim_apdu_process_fn, uint8_t nSimID)
 {
+	char stat[4] = {0};
+	
+	sc_cfg_get("vsim_stat",stat,sizeof(stat));
 	vsim_debug_printf("##vsim## [%s] start\n", __FUNCTION__);
-	if(vsim_apdu_process_fn == NULL || nSimID != 1){
-		printf("##vsim## init param err fn=0x%x sim=%d\n", vsim_apdu_process_fn, nSimID);
+	if(vsim_apdu_process_fn == NULL || nSimID != 1 || g_vsim_apdu_process_cb || atoi(stat)){
+		printf("##vsim## init param err fn=0x%x old=0x%x sim=%d stat=%d\n", 
+			vsim_apdu_process_fn, g_vsim_apdu_process_cb, nSimID, atoi(stat));
 		return -1;
 	}
 	g_vsim_apdu_process_cb = vsim_apdu_process_fn;
@@ -260,23 +276,113 @@
 		printf("##vsim## init fail read=%d msg=%d\n", g_read_thread_state, g_msg_thread_state);
 		return -1;
 	}
+	g_vsim_slot[1] = 1;
+	sc_cfg_set("vsim_stat","1");
 	vsim_set(MSG_CMD_VSIM_SET_STANDBY,1);//´ËÊ±ÔÆ¿¨Î´½¨ÍøÂçÁ´½Ó£¬ÏÈÇÐÊý¾ÝÔÙÇÐÍø
 	vsim_card_switch_req(1);
 	vsim_set(MSG_CMD_VSIM_SET_SWITCH,1);
+	get_modem_info("AT+ZCARDSWITCH=1,1\r\n", NULL, NULL);
 	get_modem_info("AT+CFUN=1\r\n", NULL, NULL);
 	return 0;
 }
 
-int32_t zte_atVsimClose(VSIM_COMMAND vsim_apdu_process_fn, uint8_t nSimID)
+int32_t zte_atSoftSimInit(SoftSim_COMMAND softssim_apdu_process_fn, uint8_t nSimID)
+{
+	char stat[4] = {0};
+	
+	sc_cfg_get("softsim_stat",stat,sizeof(stat));
+	vsim_debug_printf("##vsim## [%s] start\n", __FUNCTION__);
+	if(softssim_apdu_process_fn == NULL || (nSimID != 1 && nSimID != 0) || g_softsim_apdu_process_cb || atoi(stat)){
+		printf("##vsim## soft init param err fn=0x%x old=0x%x sim=%d\n", 
+			softssim_apdu_process_fn, g_softsim_apdu_process_cb, nSimID, atoi(stat));
+		return -1;
+	}
+	g_vsim_slot[nSimID] = 2;
+	sc_cfg_set("softsim_stat","1");
+	g_softsim_apdu_process_cb = softssim_apdu_process_fn;
+	if(nSimID){
+		vsim_set(MSG_CMD_VSIM_SET_STANDBY,1);//´ËÊ±ÔÆ¿¨Î´½¨ÍøÂçÁ´½Ó£¬ÏÈÇÐÊý¾ÝÔÙÇÐÍø
+		vsim_card_switch_req(1);
+		vsim_set(MSG_CMD_VSIM_SET_SWITCH,1);
+		get_modem_info("AT+ZCARDSWITCH=2,1\r\n", NULL, NULL);
+		get_modem_info("AT+CFUN=1\r\n", NULL, NULL);
+	}else{
+		uint8_t sim = 0;
+		uint8_t ret = 0;
+		zte_GetGTDUALSIM(&sim);
+		if(sim != nSimID)
+			zte_SetGTDUALSIM(nSimID);
+		ret = vsim_get_cardstat_fromps();
+		if(ret >= 0 && nSimID != ret)
+			vsim_card_switch_req(nSimID);
+		get_modem_info("AT+CFUN=0\r\n", NULL, NULL);
+		get_modem_info("AT+CFUN=5\r\n", NULL, NULL);
+		get_modem_info("AT+ZCARDSWITCH=2,0\r\n", NULL, NULL);
+		get_modem_info("AT+CFUN=1\r\n", NULL, NULL);
+		if(sim != nSimID)
+			zte_SetGTDUALSIM(sim);
+		if(ret >= 0 && nSimID != ret)
+			vsim_card_switch_req(ret);
+	}
+	return 0;
+}
+
+int32_t zte_atSoftSimClose(VSIM_COMMAND vsim_apdu_process_fn, uint8_t nSimID)
 {
 	vsim_debug_printf("##vsim## [%s] start\n", __FUNCTION__);
+	if(nSimID != 1 && nSimID != 0){
+		printf("##vsim## soft close param err sim=%d\n", nSimID);
+		return -1;
+	}
+	if(nSimID){
+		zte_SetGTDATASIM(1);
+		get_modem_info("AT+CFUN=0\r\n", NULL, NULL);
+		vsim_card_switch_req(0);
+		zte_SetGTDUALSIM(0);
+		vsim_set(MSG_CMD_VSIM_RESET_FLOW_STATISTIC,1);
+	}else{
+		uint8_t sim = 0;
+		uint8_t ret = 0;
+		zte_GetGTDUALSIM(&sim);
+		if(sim != nSimID)
+			zte_SetGTDUALSIM(nSimID);
+		ret = vsim_get_cardstat_fromps();
+		if(ret >= 0 && nSimID != ret)
+			vsim_card_switch_req(nSimID);
+		get_modem_info("AT+CFUN=0\r\n", NULL, NULL);
+		get_modem_info("AT+CFUN=5\r\n", NULL, NULL);
+		get_modem_info("AT+ZCARDSWITCH=0,0\r\n", NULL, NULL);
+		get_modem_info("AT+CFUN=1\r\n", NULL, NULL);
+		if(sim != nSimID)
+			zte_SetGTDUALSIM(sim);
+		if(ret >= 0 && nSimID != ret)
+			vsim_card_switch_req(ret);
+	}
+	g_vsim_apdu_process_cb = NULL;
+	g_vsim_slot[nSimID] = 0;
+	sc_cfg_set("softsim_stat","0");
+	return 0;
+}
+
+int32_t zte_atVsimClose(SoftSim_COMMAND softssim_apdu_process_fn, uint8_t nSimID)
+{
+	vsim_debug_printf("##vsim## [%s] start\n", __FUNCTION__);
+	if(nSimID != 1 && nSimID != 0){
+		printf("##vsim## close param err sim=%d\n", nSimID);
+		return -1;
+	}
 	zte_SetGTDATASIM(1);
 	get_modem_info("AT+CFUN=0\r\n", NULL, NULL);
 	vsim_card_switch_req(0);
 	zte_SetGTDUALSIM(0);
+	vsim_set(MSG_CMD_VSIM_RESET_FLOW_STATISTIC,1);
+	g_vsim_apdu_process_cb = NULL;
+	g_vsim_slot[1] = 0;
+	sc_cfg_set("vsim_stat","0");
 	return 0;
 }
 
+
 int32_t zte_SetGTDATASIM(uint8_t nSimID)
 {
 	int ret = 0;
diff --git a/ap/lib/libvsim/zte_vsim_api.h b/ap/lib/libvsim/zte_vsim_api.h
index 1552449..c3821dd 100755
--- a/ap/lib/libvsim/zte_vsim_api.h
+++ b/ap/lib/libvsim/zte_vsim_api.h
@@ -236,7 +236,7 @@
 *********************************************************************/

 

 typedef int (*VSIM_COMMAND)(uint8_t *apdu_req, uint16_t apdu_req_len,uint8_t *apdu_rsp, uint16_t *apdu_rsp_len, uint8_t slot);

-

+typedef int (*SoftSim_COMMAND)(uint8_t *apdu_req, uint16_t apdu_req_len,uint8_t *apdu_rsp, uint16_t *apdu_rsp_len, uint8_t slot);

 /*********************************************************************

 ** Ãû³Æ£º zte_mdm_event_ind_callback

 ** ÃèÊö£º ÏûϢʼþ֪ͨº¯ÊýµÄ½á¹¹¶¨Òå