HRESULT MV_CC_DSS_Init(void)
{
	HRESULT res;

	if (pMV_APP_DSS != NULL)
		MV_CC_DBG_Error(E_NOTREADY, "MV_CC_DSS_Init", NULL);

	pMV_APP_DSS = MV_OSAL_Malloc(sizeof(MV_CC_DSP_t));
	if (pMV_APP_DSS == NULL)
		MV_CC_DBG_Error(E_OUTOFMEMORY, "MV_CC_DSS_Init"
				" MV_OSAL_Malloc", NULL);

	pMV_APP_DSS->m_SeqID = MV_CC_ServiceID_DynamicStart;

	MV_OSAL_Mutex_Create(&(pMV_APP_DSS->m_SeqIDMutex));
	MV_OSAL_Mutex_Create(&(pMV_APP_DSS->m_hGSListMutex));

	MV_OSAL_Mutex_Lock(pMV_APP_DSS->m_hGSListMutex);

	res = MV_CC_DSS_GlobalServiceList_Init();
	if (res != S_OK)
		MV_CC_DBG_Error(res, "MV_CC_DSS_Init"
		" MV_CC_DSS_GlobalServiceList_Init", NULL);

	pMV_APP_DSS->m_Status.m_RegCount =
	pMV_APP_DSS->m_Status.m_RegErrCount =
	pMV_APP_DSS->m_Status.m_FreeCount =
	pMV_APP_DSS->m_Status.m_FreeErrCount =
	pMV_APP_DSS->m_Status.m_InquiryCount =
	pMV_APP_DSS->m_Status.m_InquiryErrCount =
	pMV_APP_DSS->m_Status.m_UpdateCount =
	pMV_APP_DSS->m_Status.m_UpdateErrCount =
	pMV_APP_DSS->m_Status.m_ServiceCount =
	pMV_APP_DSS->m_Status.m_LastServiceID = 0;
	pMV_APP_DSS->m_Status.m_SeqID = pMV_APP_DSS->m_SeqID;

	MV_OSAL_Mutex_Unlock(pMV_APP_DSS->m_hGSListMutex);

	return S_OK;
}
HRESULT MV_CC_DSS_Constructor(	pMV_CC_DSP_t 		self,
								pMV_CC_ICCNet_t 	pICCNet)
{
    HRESULT res;
	
	/* Parameter Check */
	if ((self == NULL) || (pICCNet == NULL))
		MV_CC_DBG_Error(E_INVALIDARG, "MV_CC_DSS_Constructor", NULL);

	if (pMV_APP_DSS != NULL)
		MV_CC_DBG_Error(E_NOTREADY, "MV_CC_DSS_Constructor", NULL);
		    
	self->m_PrType = MV_CC_Protocol_CCDSP;
	self->OnRecvDemux = MV_CC_DSS_DSPOnRecvDemux;
	self->m_pICCNet = pICCNet;

	self->m_RdCount = 0;
	self->m_RdErrCount = 0;	
	self->m_WrCount = 0;
	self->m_WrErrCount = 0;

    self->m_bStatusUpdate = false;
    self->m_RemoteCPU = MV_CC_DSS_REMOTECPU_INIT;
    self->m_SeqID = MV_CC_ServiceID_DynamicStart;

	MV_OSAL_Mutex_Create(&(self->m_SeqIDMutex));
	MV_OSAL_Mutex_Create(&(self->m_hGSListMutex));

	MV_OSAL_Mutex_Lock(self->m_hGSListMutex);
		
	res = MV_CC_DSS_GlobalServiceList_Init();
	if (res != S_OK)
	    MV_CC_DBG_Error(res, "MV_CC_DSS_Constructor MV_CC_DSS_GlobalServiceList_Init", NULL);

	MV_OSAL_Mutex_Unlock(self->m_hGSListMutex);


	if (MV_OSAL_CPU_LOCAL == MV_OSAL_CPU_MASTER)
		goto MV_CC_DSS_Constructor_Exit;

	// Check Remote CPU
	res = MV_CC_StartStatus_Check();
	if ((res == S_OK) || (res == MV_CC_STATUS_OK))
	{

		// Synchronize with Remote CPU
		res = MV_CC_DSS_DSPSendTo(	self,
						 			self->m_RemoteCPU,
						 			DSPPacket_HeadGEN(CMD_DSS_AskUpdate, 0, 0, 0),
						 			NULL,
						 			0);
		if (res != S_OK)
			MV_CC_DBG_Error(res, "MV_CC_DSS_Constructor Synchronize with Remote CPU (AskUpdate)", NULL);
	}

MV_CC_DSS_Constructor_Exit:

	pMV_APP_DSS = self;
	
	return S_OK;
}