[feature][T106ZXW-60] add qser-network-demo 8
Change-Id: I85b9a72b9e06ebc40fb0f1f0170581fe3a1a2c14
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/mobiletek-tester-rdit/mobiletek-tester-rdit.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/mobiletek-tester-rdit/mobiletek-tester-rdit.bb
index 1af22a6..9582ab4 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/mobiletek-tester-rdit/mobiletek-tester-rdit.bb
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/mobiletek-tester-rdit/mobiletek-tester-rdit.bb
@@ -4,7 +4,9 @@
LICENSE = "CLOSED"
LICENSE = "CLOSED"
LIC_FILES_CHKSUM = "file://LICENSE;md5=b1e07e8d88e26263e71d3a9e2aa9a2ff"
-DEPENDS += "liblynq-call liblynq-sms liblynq-network liblynq-sim liblynq-data liblynq-qser-data"
+
+DEPENDS += "liblynq-call liblynq-sms liblynq-network liblynq-sim liblynq-data liblynq-qser-data liblynq-qser-network"
+
#inherit workonsrc
WORKONSRC = "${TOPDIR}/../src/lynq/packages/apps/Mobiletek_Tester_RDIT"
FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/packages/apps/:"
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
index b2967a7..fed6cb6 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
@@ -13,12 +13,13 @@
#define RESULT_OK (0)
#define RESULT_ERROR (-1)
#define INVALID_PREFER_TYPE (0xffff)
+#define INVALID_CLIENT_HANDLE (0)
-static QSER_NW_RxMsgHandlerFunc_t s_handlerPtr;
-static void* s_contextPtr;
+static QSER_NW_RxMsgHandlerFunc_t s_handlerPtr=NULL;
+static void* s_contextPtr=NULL;
static pthread_t s_new_network_tid =-1;
-nw_client_handle_type g_ph_hw = 0;
+nw_client_handle_type g_ph_hw = INVALID_CLIENT_HANDLE;
int switch_preferred_nw_mode(const uint64_t preferred_nw_mode)
{
@@ -161,9 +162,9 @@
int qser_nw_client_deinit(nw_client_handle_type h_nw)
{
- if(h_nw != g_ph_hw)
+ if(h_nw != g_ph_hw || h_nw == INVALID_CLIENT_HANDLE)
{
- LYERRLOG("not init %d %d",g_ph_hw,h_nw);
+ LYERRLOG("h_nw not right %d %d",h_nw,g_ph_hw);
return RESULT_ERROR;
}
@@ -187,7 +188,7 @@
return RESULT_ERROR;
}
- g_ph_hw=0;
+ g_ph_hw = INVALID_CLIENT_HANDLE;
return RESULT_OK;
}
@@ -195,11 +196,18 @@
int qser_nw_set_config(nw_client_handle_type h_nw,QSER_NW_CONFIG_INFO_T *pt_info)
{
int pretype = 0;
- if(h_nw == 0 || NULL == pt_info)
+ if(NULL == pt_info)
{
LYERRLOG("invalid client parameters incoming");
return RESULT_ERROR;
}
+
+ if(h_nw != g_ph_hw || h_nw == INVALID_CLIENT_HANDLE)
+ {
+ LYERRLOG("h_nw not right %d %d",h_nw,g_ph_hw);
+ return RESULT_ERROR;
+ }
+
pretype = switch_preferred_nw_mode(pt_info->preferred_nw_mode);
if (pretype ==INVALID_PREFER_TYPE)
{
@@ -230,11 +238,18 @@
int qser_nw_get_operator_name(nw_client_handle_type h_nw,QSER_NW_OPERATOR_NAME_INFO_T *pt_info)
{
- if(h_nw == 0 || NULL == pt_info)
+ if(NULL == pt_info)
{
LYERRLOG("invalid client parameters incoming");
return RESULT_ERROR;
}
+
+ if(h_nw != g_ph_hw || h_nw == INVALID_CLIENT_HANDLE)
+ {
+ LYERRLOG("h_nw not right %d %d",h_nw,g_ph_hw);
+ return RESULT_ERROR;
+ }
+
int ret = 0;
char op_FN[128];
char op_SN[128];
@@ -334,11 +349,18 @@
int qser_nw_get_reg_status(nw_client_handle_type h_nw,QSER_NW_REG_STATUS_INFO_T *pt_info)
{
- if(h_nw == 0 || NULL == pt_info)
+ if(NULL == pt_info)
{
LYERRLOG("invalid client parameters incoming");
return RESULT_ERROR;
}
+
+ if(h_nw != g_ph_hw || h_nw == INVALID_CLIENT_HANDLE)
+ {
+ LYERRLOG("h_nw not right %d %d",h_nw,g_ph_hw);
+ return RESULT_ERROR;
+ }
+
int ret = 0;
int regState = 0;
int imsRegState = 0;
@@ -353,7 +375,7 @@
{
pt_info->voice_registration_valid = 1;
pt_info->voice_registration.tech_domain = E_QSER_NW_TECH_DOMAIN_NONE;
- pt_info->voice_registration.radio_tech = qser_radio_tech_qurey(radioTechFam);
+ pt_info->voice_registration.radio_tech = qser_radio_tech_qurey(netType);
if (regState == 5)
{
pt_info->voice_registration.roaming = E_QSER_NW_ROAM_STATE_ON;
@@ -372,18 +394,18 @@
ret = lynq_query_registration_state("DATA",®State,&imsRegState,LAC,CID,&netType,&radioTechFam,&netreject);
if(ret == 0)
{
- pt_info->voice_registration_valid = 1;
- pt_info->voice_registration.tech_domain = E_QSER_NW_TECH_DOMAIN_NONE;
- pt_info->voice_registration.radio_tech = qser_radio_tech_qurey(radioTechFam);
+ pt_info->data_registration_valid = 1;
+ pt_info->data_registration.tech_domain = E_QSER_NW_TECH_DOMAIN_NONE;
+ pt_info->data_registration.radio_tech = qser_radio_tech_qurey(netType);
if (regState == 5)
{
- pt_info->voice_registration.roaming = E_QSER_NW_ROAM_STATE_ON;
+ pt_info->data_registration.roaming = E_QSER_NW_ROAM_STATE_ON;
}
else
{
- pt_info->voice_registration.roaming = E_QSER_NW_ROAM_STATE_OFF;
+ pt_info->data_registration.roaming = E_QSER_NW_ROAM_STATE_OFF;
}
- pt_info->voice_registration.registration_state = switch_nw_regstate(regState);
+ pt_info->data_registration.registration_state = switch_nw_regstate(regState);
}
else
{
@@ -410,11 +432,18 @@
int qser_nw_get_signal_strength(nw_client_handle_type h_nw,QSER_NW_SIGNAL_STRENGTH_INFO_T *pt_info)
{
- if(h_nw == 0 || NULL == pt_info)
+ if(NULL == pt_info)
{
LYERRLOG("invalid client parameters incoming");
return RESULT_ERROR;
}
+
+ if(h_nw != g_ph_hw || h_nw == INVALID_CLIENT_HANDLE)
+ {
+ LYERRLOG("h_nw not right %d %d",h_nw,g_ph_hw);
+ return RESULT_ERROR;
+ }
+
signalStrength_t lib_info;
int ret = 0;
ret = lynq_solicited_signal_strength(&lib_info);
@@ -424,15 +453,15 @@
return RESULT_ERROR;
}
pt_info->gsm_sig_info_valid = lib_info.gw_sig_valid;
- pt_info->gsm_sig_info.rssi = lib_info.rssi;
+ pt_info->gsm_sig_info.rssi = lib_info.rssi-110;
pt_info->wcdma_sig_info_valid = lib_info.wcdma_sig_valid;
- pt_info->wcdma_sig_info.rssi = lib_info.wcdma_signalstrength;
- pt_info->wcdma_sig_info.ecio = lib_info.ecno;
+ pt_info->wcdma_sig_info.rssi = lib_info.wcdma_signalstrength-110;
+ pt_info->wcdma_sig_info.ecio = lib_info.ecno/5;
pt_info->tdscdma_sig_info_valid = 0;
pt_info->lte_sig_info_valid = lib_info.lte_sig_valid;
- pt_info->lte_sig_info.rssi = lib_info.lte_signalstrength;
- pt_info->lte_sig_info.rsrp = lib_info.rsrp;
- pt_info->lte_sig_info.rsrq = lib_info.rsrq;
+ pt_info->lte_sig_info.rssi = lib_info.lte_signalstrength-110;
+ pt_info->lte_sig_info.rsrp = lib_info.rsrp*(-1);
+ pt_info->lte_sig_info.rsrq = lib_info.rsrq*(-1);
pt_info->lte_sig_info.snr = lib_info.rssnr;
pt_info->cdma_sig_info_valid = 0;
pt_info->hdr_sig_info_valid = 0;
@@ -450,6 +479,12 @@
int qser_nw_add_rx_msg_handler(nw_client_handle_type h_nw,QSER_NW_RxMsgHandlerFunc_t handlerPtr,void* contextPtr)
{
+ if(h_nw != g_ph_hw || h_nw == INVALID_CLIENT_HANDLE)
+ {
+ LYERRLOG("h_nw not right %d %d",h_nw,g_ph_hw);
+ return RESULT_ERROR;
+ }
+
s_handlerPtr = handlerPtr;
s_contextPtr = contextPtr;
if(s_handlerPtr!=NULL)
diff --git a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/lynq.h b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/lynq.h
index d37f10d..f989fd8 100755
--- a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/lynq.h
+++ b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/lynq.h
@@ -58,4 +58,13 @@
#define LYNQ_QSER_APN_DEL LYNQ_QSER_DATA + 9
#define LYNQ_QSER_APN_GET_LIST LYNQ_QSER_DATA + 10
+
+#define LYNQ_QSER_NETWORK LYNQ_BASE + 100
+#define LYNQ_QSER_NETWORK_INIT LYNQ_QSER_NETWORK + 1
+#define LYNQ_QSER_NETWORK_DEINIT LYNQ_QSER_NETWORK + 2
+#define LYNQ_QSER_NETWORK_SET_CONCIFG LYNQ_QSER_NETWORK + 3
+#define LYNQ_QSER_NETWORK_GTE_OPERRATOR_NAME LYNQ_QSER_NETWORK + 4
+#define LYNQ_QSER_NETWORK_GET_REG_STATUS LYNQ_QSER_NETWORK + 5
+#define LYNQ_QSER_NETWORK_SOLICITED_SIGNAL_STRENGTH LYNQ_QSER_NETWORK + 6
+
int create_socket(const int domain, const int type, const int protocol,const int port,const char *IP,const char *socket_name,void * addr,int backlog,int cs);
diff --git a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/makefile b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/makefile
index 5922e77..df7feff 100755
--- a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/makefile
+++ b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/makefile
@@ -28,6 +28,7 @@
-llynq-network \
-llynq-data \
-llynq-sim \
+ -llynq-qser-network \
-llynq-qser-data \
diff --git a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/network.cpp b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/network.cpp
index 748906b..bd1c263 100755
--- a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/network.cpp
+++ b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/network.cpp
@@ -1,8 +1,10 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
+#include <string.h>
#include <lynq_network/lynq_network/lynq_network.h>
#include "network.h"
+#include <include/lynq_qser_network.h>
#define TEST_RESULT "lynq_result="
int init_network(int argc, char *argv[], int sp_test)
@@ -99,7 +101,32 @@
ret = lynq_solicited_signal_strength(&solSigStren);
printf("%s%d\n",TEST_RESULT,ret);
- printf("LYNQ_SOLICITED_SIGNAL_STRENGTH: gw_sig_valid=%d, wcdma_valid=%d, lte_valid=%d, rssi=%d, wcdma sig strength is =%d lte sig strength is %d\n", solSigStren.gw_sig_valid, solSigStren.wcdma_sig_valid, solSigStren.lte_sig_valid,solSigStren.rssi, solSigStren.wcdma_signalstrength,solSigStren.lte_signalstrength);
+ if(ret==0)
+ {
+ printf("solicited_signal_strength gw_sig_valid = %d\n"
+ " rssi = %d\n"
+ " wcdma_sig_valid = %d\n"
+ " wcdma_signalstrength = %d\n"
+ " rscp"
+ " ecio = %d\n"
+ " lte_sig_info_valid = %d\n"
+ " lte_signalstrength = %d\n"
+ " rsrp = %d\n"
+ " rsrq = %d\n"
+ " rssnr = %d\n"
+ " nr_sig_valid = %d\n"
+ " ssRsrp = %d\n"
+ " ssRsrq = %d\n"
+ " ssSinr = %d\n"
+ " csiRsrp = %d\n"
+ " csiRsrq = %d\n"
+ " nr_sig_info.csiSinr = %d\n",
+ solSigStren.gw_sig_valid, solSigStren.rssi,
+ solSigStren.wcdma_sig_valid, solSigStren.wcdma_signalstrength, solSigStren.rscp,solSigStren.ecno,
+ solSigStren.lte_sig_valid, solSigStren.lte_signalstrength, solSigStren.rsrp, solSigStren.rsrq, solSigStren.rssnr,
+ solSigStren.nr_sig_valid, solSigStren.ssRsrp, solSigStren.ssRsrq, solSigStren.ssSinr,
+ solSigStren.csiRsrp, solSigStren.csiRsrq, solSigStren.csiSinr);
+ }
return ret;
}
int set_ims(int argc, char *argv[], int sp_test)
@@ -110,4 +137,175 @@
ret = lynq_set_ims(ims_mode);
printf("%s%d\n",TEST_RESULT,ret);
return ret;
-}
\ No newline at end of file
+}
+
+int qser_network_init(int argc, char *argv[], int sp_test)
+{
+ printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+
+ int ret = -1;
+ nw_client_handle_type h_nw;
+
+ ret = qser_nw_client_init(&h_nw);
+ printf("%s%d\n",TEST_RESULT,ret);
+ if(ret==0)
+ {
+ printf("qser_nw_client_init: h_nw=%d\n", h_nw);
+ }
+ return ret;
+}
+
+int qser_network_deinit(int argc, char *argv[], int sp_test)
+{
+ printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+
+ if(argc !=2)
+ {
+ printf("error, argc %d is not equal 2 \n",argc);
+ return -1;
+ }
+
+ int ret = -1;
+ nw_client_handle_type h_nw;
+
+ h_nw=atoi(argv[1]);
+ ret = qser_nw_client_deinit(h_nw);
+ printf("%s%d\n",TEST_RESULT,ret);
+ return ret;
+}
+
+int qser_network_set_config(int argc, char *argv[], int sp_test)
+{
+ printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+
+ if(argc !=3)
+ {
+ printf("error, argc %d is not equal 3 \n",argc);
+ return -1;
+ }
+
+ nw_client_handle_type h_nw;
+ QSER_NW_CONFIG_INFO_T t_info;
+
+ h_nw=atoi(argv[1]);
+ t_info.preferred_nw_mode=atoi(argv[2]);
+
+ int ret = -1;
+ ret = qser_nw_set_config(h_nw,&t_info);
+ printf("%s%d\n",TEST_RESULT,ret);
+ return ret;
+}
+
+int qser_network_get_operator_name(int argc, char *argv[], int sp_test)
+{
+ printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+
+ if(argc !=2)
+ {
+ printf("error, argc %d is not equal 2 \n",argc);
+ return -1;
+ }
+
+ nw_client_handle_type h_nw;
+ QSER_NW_OPERATOR_NAME_INFO_T t_info;
+
+ h_nw=atoi(argv[1]);
+
+ int ret = -1;
+ ret = qser_nw_get_operator_name(h_nw,&t_info);
+ printf("%s%d\n",TEST_RESULT,ret);
+ if(ret==0)
+ {
+ printf("qser_nw_get_operator_name: h_nw=%d, long_eons=%s, short_eons=%s, mcc=%s, mnc=%s \n", h_nw, t_info.long_eons,t_info.short_eons,t_info.mcc,t_info.mnc);
+ }
+ return ret;
+}
+
+int qser_network_get_reg_status(int argc, char *argv[], int sp_test)
+{
+ printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+
+ if(argc !=2)
+ {
+ printf("error, argc %d is not equal 3 \n",argc);
+ return -1;
+ }
+
+ nw_client_handle_type h_nw;
+ QSER_NW_REG_STATUS_INFO_T t_info;
+
+ h_nw=atoi(argv[1]);
+
+ int ret = -1;
+ ret = qser_nw_get_reg_status(h_nw,&t_info);
+ printf("%s%d\n",TEST_RESULT,ret);
+ if(ret==0)
+ {
+ printf("qser_nw_get_reg_status: voice_registration_valid=%d, tech_domain=%d, radio_tech=%d, roaming=%d deny_reason=%d registration_state=%d\n",
+ t_info.voice_registration_valid,
+ t_info.voice_registration.tech_domain,
+ t_info.voice_registration.radio_tech,
+ t_info.voice_registration.roaming,
+ t_info.voice_registration.deny_reason,
+ t_info.voice_registration.registration_state);
+ printf("qser_nw_get_reg_status: data_registration_valid=%d, tech_domain=%d, radio_tech=%d, roaming=%d deny_reason=%d registration_state=%d\n",
+ t_info.data_registration_valid,
+ t_info.data_registration.tech_domain,
+ t_info.data_registration.radio_tech,
+ t_info.data_registration.roaming,
+ t_info.data_registration.deny_reason,
+ t_info.data_registration.registration_state);
+ }
+ return ret;
+}
+
+
+int qser_network_solicited_signal_strength(int argc, char *argv[], int sp_test)
+{
+ printf("[%s][%d] enter!\n",__FUNCTION__,__LINE__);
+ if(argc !=2)
+ {
+ printf("error, argc %d is not equal 2 \n",argc);
+ return -1;
+ }
+ int ret = -1;
+ nw_client_handle_type h_nw;
+ QSER_NW_SIGNAL_STRENGTH_INFO_T t_info;
+ memset(&t_info,sizeof (t_info) , 0);
+ h_nw=atoi(argv[1]);
+ ret = qser_nw_get_signal_strength(h_nw,&t_info);
+ printf("%s%d\n",TEST_RESULT,ret);
+ if(ret==0)
+ {
+ printf("qser_solicited_signal_strength gsm_sig_info_valid = %d\n"
+ " gsm_sig_info.rssi = %d\n"
+ " wcdma _sig_info_valid = %d\n"
+ " wcdma_sig_info.rssi = %d\n"
+ " wcdma_sig_info.ecio = %d\n"
+ " tdscdma_sig_info_valid = %d\n"
+ " lte_sig_info_valid = %d\n"
+ " lte_sig_info.rssi = %d\n"
+ " lte_sig_info.rsrp = %d\n"
+ " lte_sig_info.rsrq = %d\n"
+ " lte_sig_info.snr = %d\n"
+ " cdma_sig_info_valid = %d\n"
+ " hdr_sig_info_valid = %d\n"
+ " nr_sig_info_valid = %d\n"
+ " nr_sig_info.ssRsrp = %d\n"
+ " nr_sig_info.ssRsrq = %d\n"
+ " nr_sig_info.ssSinr = %d\n"
+ " nr_sig_info.csiRsrp = %d\n"
+ " nr_sig_info.csiRsrq = %d\n"
+ " nr_sig_info.csiSinr = %d\n",
+ t_info.gsm_sig_info_valid, t_info.gsm_sig_info.rssi,
+ t_info.wcdma_sig_info_valid, t_info.wcdma_sig_info.rssi, t_info.wcdma_sig_info.ecio,
+ t_info.tdscdma_sig_info_valid,
+ t_info.lte_sig_info_valid, t_info.lte_sig_info.rssi, t_info.lte_sig_info.rsrp, t_info.lte_sig_info.rsrq, t_info.lte_sig_info.snr,
+ t_info.cdma_sig_info_valid,
+ t_info.hdr_sig_info_valid,
+ t_info.nr_sig_info_valid, t_info.nr_sig_info.ssRsrp, t_info.nr_sig_info.ssRsrq, t_info.nr_sig_info.ssSinr,
+ t_info.nr_sig_info.csiRsrp, t_info.nr_sig_info.csiRsrq, t_info.nr_sig_info.csiSinr);
+ }
+ return ret;
+}
+
diff --git a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/req_commands.h b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/req_commands.h
index a5017b5..49ff14c 100755
--- a/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/req_commands.h
+++ b/cap/zx297520v3/src/lynq/packages/apps/Mobiletek_Tester_RDIT/req_commands.h
@@ -31,6 +31,13 @@
{"LYNQ_DEACTIVATE_DATA_CALL",deactivte_data_call, "deactive data call", LYNQ_DEACTIVATE_DATA_CALL},
{"LYNQ_WAIT_DATA_CALL",wait_data_call, "wait data call", LYNQ_WAIT_DATA_CALL},
{"LYNQ_GET_DATA_CALL_LIST",get_data_call_list, "get data call list", LYNQ_GET_DATA_CALL_LIST},
+//QSER_NETWORK
+ {"LYNQ_QSER_NETWORK_INIT",qser_network_init, "init the network lib", LYNQ_QSER_NETWORK_INIT},
+ {"LYNQ_QSER_NETWORK_DEINIT",qser_network_deinit, "deinit the network lib", LYNQ_QSER_NETWORK_DEINIT},
+ {"LYNQ_QSER_NETWORK_SET_CONCIFG",qser_network_set_config, "set network config", LYNQ_QSER_NETWORK_SET_CONCIFG},
+ {"LYNQ_QSER_NETWORK_GTE_OPERRATOR_NAME",qser_network_get_operator_name, "query operater infomation", LYNQ_QSER_NETWORK_GTE_OPERRATOR_NAME},
+ {"LYNQ_QSER_NETWORK_GET_REG_STATUS",qser_network_get_reg_status, "query registration status", LYNQ_QSER_NETWORK_GET_REG_STATUS},
+ {"LYNQ_QSER_NETWORK_SOLICITED_SIGNAL_STRENGTH",qser_network_solicited_signal_strength, "solicited signal strength", LYNQ_QSER_NETWORK_SOLICITED_SIGNAL_STRENGTH},
//QSER_DATA
{"LYNQ_QSER_DATA_INIT",qser_init_data, "init the data lib", LYNQ_QSER_DATA_INIT},
{"LYNQ_QSER_DATA_DEINIT",qser_deinit_data, "deinit the data lib", LYNQ_QSER_DATA_DEINIT},