/*
 * Percepio DFM v2.1.0
 * Copyright 2023 Percepio AB
 * www.percepio.com
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * DFM
 */

#include <dfm.h>

#if ((DFM_CFG_ENABLED) >= 1)

#if (!defined(DFM_VERSION) || (DFM_VERSION < DFM_VERSION_INITIAL) || (DFM_VERSION > DFM_VERSION_2_0))
#error "Invalid DFM_VERSION!"
#endif

#include <assert.h>
#include <string.h>
#include <stdint.h>

static DfmData_t xDfmData;
static DfmData_t* pxDfmData = &xDfmData;

DfmUserCallback_t xDfmUserGetUniqueSessionID;
DfmUserCallback_t xDfmUserGetDeviceName;

DfmResult_t xDfmInitialize(DfmUserCallback_t xGetUniqueSessionID, DfmUserCallback_t xGetDeviceName)
{
	if (pxDfmData == (void*)0)
	{
		return DFM_FAIL;
	}

	if (xGetUniqueSessionID == 0)
	{
		return DFM_FAIL;
	}

	if (xGetDeviceName == 0)
	{
		return DFM_FAIL;
	}

	(void)memset(pxDfmData, 0, sizeof(DfmData_t));

	xDfmUserGetUniqueSessionID = xGetUniqueSessionID;
	xDfmUserGetDeviceName = xGetDeviceName;

	if (xDfmSessionInitialize(&pxDfmData->xSessionData) == DFM_FAIL)
	{
		return DFM_FAIL;
	}

	if (xDfmKernelPortInitialize(&pxDfmData->xKernelPortData) == DFM_FAIL)
	{
		return DFM_FAIL;
	}

	if (xDfmAlertInitialize(&pxDfmData->xAlertData) == DFM_FAIL)
	{
		return DFM_FAIL;
	}

	if (xDfmEntryInitialize(&pxDfmData->xEntryData) == DFM_FAIL)
	{
		return DFM_FAIL;
	}

	if (xDfmCloudInitialize(&pxDfmData->xCloudData) == DFM_FAIL)
	{
		return DFM_FAIL;
	}

	if (xDfmStorageInitialize(&pxDfmData->xStorageData) == DFM_FAIL)
	{
		return DFM_FAIL;
	}

#if (defined(DFM_CFG_RETAINED_MEMORY) && (DFM_CFG_RETAINED_MEMORY >= 1))
	if (xDfmRetainedMemoryInitialize(&pxDfmData->xRetainedMemoryData) == DFM_FAIL)
	{
		return DFM_FAIL;
	}
#endif

	pxDfmData->ulDfmInitialized = 1;

	(void)xDfmSessionEnable(0); /* Try to enable, but don't override if disabled */

	return DFM_SUCCESS;
}

uint32_t ulDfmIsInitialized(void)
{
	return xDfmData.ulDfmInitialized;
}

#endif