NorthStar-Endurance-TestBench/NorthStar-Emotas-Stack/colib_sl/src/co_store.c

422 lines
9.8 KiB
C

/*
* co_store.c - contains store/restore functionality
*
* Copyright (c) 2012-2024 emotas embedded communication GmbH
*-------------------------------------------------------------------
* $Id: co_store.c 54867 2024-08-01 10:45:53Z boe $
*
*
*-------------------------------------------------------------------
*
*
*/
/********************************************************************/
/**
* \brief Store/Restore functionality
*
* \file co_store.c
* contains routines for handling store/restore OD data
*
*/
/* header of standard C - libraries
---------------------------------------------------------------------------*/
#include <stddef.h>
/* header of project specific types
---------------------------------------------------------------------------*/
#include <gen_define.h>
#include <co_datatype.h>
#include <co_store.h>
#include <co_odaccess.h>
#include "ico_indication.h"
#include "ico_odaccess.h"
#include "ico_store.h"
/* constant definitions
---------------------------------------------------------------------------*/
/* local defined data types
---------------------------------------------------------------------------*/
/* list of external used functions, if not in headers
---------------------------------------------------------------------------*/
#ifdef CO_EVENT_STATIC_STORE_LOAD
extern CO_CONST CO_EVENT_STORE_T coEventStoreLoadInd;
#endif /* CO_EVENT_STATIC_STORE_LOAD */
#ifdef CO_EVENT_STATIC_STORE_CLEAR
extern CO_CONST CO_EVENT_STORE_T coEventStoreClearInd;
#endif /* CO_EVENT_STATIC_STORE_CLEAR */
#ifdef CO_EVENT_STATIC_STORE_SAVE
extern CO_CONST CO_EVENT_STORE_T coEventStoreSaveInd;
#endif /* CO_EVENT_STATIC_STORE_SAVE */
/* list of global defined functions
---------------------------------------------------------------------------*/
/* list of local defined functions
---------------------------------------------------------------------------*/
/* external variables
---------------------------------------------------------------------------*/
/* global variables
---------------------------------------------------------------------------*/
/* local defined variables
---------------------------------------------------------------------------*/
#ifdef CO_EVENT_STORE_CNT
static UNSIGNED16 storeCnt = 0u;
static CO_EVENT_STORE_T storeLoadFunction[CO_EVENT_STORE_CNT] = { NULL };
# ifdef CO_STORE_SUPPORTED
static CO_EVENT_STORE_T storeSaveFunction = NULL;
static CO_EVENT_STORE_T storeClearFunction = NULL;
# endif /* CO_STORE_SUPPORTED */
#endif /* CO_EVENT_STORE_CNT */
#ifdef CO_STORE_SUPPORTED
# ifdef CO_AUTO_STORE_HANDLED_BY_APPLICATION
static UNSIGNED32 storeObj[CO_STORE_CNT_MAX];
static UNSIGNED32 restoreObj[CO_STORE_CNT_MAX];
# else /* CO_AUTO_STORE_HANDLED_BY_APPLICATION */
static UNSIGNED32 storeObj;
static UNSIGNED32 restoreObj;
# endif /* CO_AUTO_STORE_HANDLED_BY_APPLICATION */
#endif /* CO_STORE_SUPPORTED */
/***************************************************************************/
/**
* \internal
*
* \brief void icoStoreLoadReq - load parameter requested
*
*
* \return none
*
*/
RET_T icoStoreLoadReq(
UNSIGNED8 subIndex
)
{
RET_T retVal = RET_OK;
#ifdef CO_EVENT_STORE_CNT
UNSIGNED16 i;
#endif /* CO_EVENT_STORE_CNT */
(void)subIndex; /* avoid unused warning */
#ifdef CO_EVENT_STORE
/* inform od functions */
icoOdSetLoadParaState(CO_TRUE);
# ifdef CO_EVENT_STORE_CNT
for (i = 0u; i < storeCnt; i++) {
/* call load parameter indication */
retVal = storeLoadFunction[i](subIndex);
}
# endif /* CO_EVENT_STORE_CNT */
# ifdef CO_EVENT_STATIC_STORE_LOAD
coEventStoreLoadInd(subIndex);
# endif /* CO_EVENT_STATIC_STORE_LOAD */
/* inform od functions */
icoOdSetLoadParaState(CO_FALSE);
#endif /* CO_EVENT_STORE */
return(retVal);
}
#ifdef CO_EVENT_STORE_CNT
/***************************************************************************/
/**
* \brief coEventRegister_LOAD_PARA - register LOAD_PARA event
*
* register indication function for LOAD_PARA events
*
* \return RET_T
*
*/
RET_T coEventRegister_LOAD_PARA(
CO_EVENT_STORE_T pFunction /**< pointer to function */
)
{
if (storeCnt >= CO_EVENT_STORE_CNT) {
return(RET_EVENT_NO_RESSOURCE);
}
if (pFunction == NULL) {
return(RET_INVALID_PARAMETER);
}
storeLoadFunction[storeCnt] = pFunction; /* save function pointer */
storeCnt++;
return(RET_OK);
}
# ifdef CO_STORE_SUPPORTED
/***************************************************************************/
/**
* \brief coEventRegister_SAVE_PARA - register SAVE_PARA event
*
* register indication function for SAVE_PARA events
*
* \return RET_T
*
*/
RET_T coEventRegister_SAVE_PARA(
CO_EVENT_STORE_T pFunction /**< pointer to function */
)
{
storeSaveFunction = pFunction; /* save function pointer */
return(RET_OK);
}
/***************************************************************************/
/**
* \brief coEventRegister_CLEAR_PARA - register CLEAR_PARA event
*
* register indication function for CLEAR_PARA events
*
* \return RET_T
*
*/
RET_T coEventRegister_CLEAR_PARA(
CO_EVENT_STORE_T pFunction /**< pointer to function */
)
{
storeClearFunction = pFunction; /* save function pointer */
return(RET_OK);
}
# endif /* CO_STORE_SUPPORTED */
#endif /* CO_EVENT_STORE_CNT */
#ifdef CO_STORE_SUPPORTED
/***************************************************************************/
/***************************************************************************/
/***************************************************************************/
/***************************************************************************/
/***************************************************************************/
/**
* \internal
*
* \brief icoStorGetObjectAddr - get Store object address
*
*
* \return RET_T
*
*/
void *icoStoreGetObjectAddr(
UNSIGNED16 idx, /* index */
UNSIGNED8 subIndex /* subindex */
)
{
void *pAddr = NULL;
(void)subIndex;
if (idx == 0x1010u) { /* store */
#ifdef CO_AUTO_STORE_HANDLED_BY_APPLICATION
pAddr = (void *)&storeObj[subIndex - 1u];
#else /* CO_AUTO_STORE_HANDLED_BY_APPLICATION */
pAddr = (void *)&storeObj;
/* store supported only on command */
storeObj = 1u;
#endif /* CO_AUTO_STORE_HANDLED_BY_APPLICATION */
} else {
if (idx == 0x1011u) { /* restore */
#ifdef CO_AUTO_STORE_HANDLED_BY_APPLICATION
pAddr = (void *)&restoreObj[subIndex - 1u];
#else /* CO_AUTO_STORE_HANDLED_BY_APPLICATION */
pAddr = (void *)&restoreObj;
/* restore supported only on command */
restoreObj = 1u;
#endif /* CO_AUTO_STORE_HANDLED_BY_APPLICATION */
}
}
return(pAddr);
}
/***************************************************************************/
/**
* \internal
*
* \brief icoStoreCheckObjLimit_u32 - check correct signature
*
*
* \return RET_T
*
*/
RET_T icoStoreCheckObjLimit_u32(
UNSIGNED16 index, /* index */
UNSIGNED32 signature /* written signature */
)
{
RET_T retVal = RET_OK;
if (index == 0x1010u) {
/* check for correct signature */
if (signature != CO_STORE_SIGNATURE_SAVE) {
retVal = RET_ERROR_STORE;
}
} else {
if (index == 0x1011u) {
/* check for correct signature */
if (signature != CO_STORE_SIGNATURE_LOAD) {
retVal = RET_ERROR_STORE;
}
}
}
return(retVal);
}
/***************************************************************************/
/**
* \internal
*
* \brief icoStoreObChanged - object was changed
*
*
* \return RET_T
*
*/
RET_T icoStoreObjChanged(
UNSIGNED16 index,
UNSIGNED8 subIndex
)
{
RET_T retVal = RET_OK;
#ifdef CO_EVENT_STORE_CNT
if (index == 0x1010u) { /* store */
if (storeSaveFunction != NULL) {
/* call save parameter indication */
retVal = storeSaveFunction(subIndex);
} else {
# ifdef CO_EVENT_STATIC_STORE_SAVE
# else /* CO_EVENT_STATIC_STORE_SAVE */
/* inform about not saved */
retVal = RET_HARDWARE_ERROR;
#endif /* CO_EVENT_STATIC_STORE_SAVE */
}
}
if (index == 0x1011u) { /* restore */
if (storeClearFunction != NULL) {
/* call Clear parameter indication */
retVal = storeClearFunction(subIndex);
} else {
# ifdef CO_EVENT_STATIC_STORE_CLEAR
# else /* CO_EVENT_STATIC_STORE_CLEAR */
/* inform about not restored */
retVal = RET_HARDWARE_ERROR;
# endif /* CO_EVENT_STATIC_STORE_CLEAR */
}
}
#else /* CO_EVENT_STORE_CNT */
(void)index;
(void)subIndex;
#endif /* CO_EVENT_STORE_CNT */
#ifdef CO_EVENT_STATIC_STORE_SAVE
if (index == 0x1010u) { /* store */
retVal = coEventStoreSaveInd(subIndex);
}
#endif /* CO_EVENT_STATIC_STORE_SAVE */
#ifdef CO_EVENT_STATIC_STORE_CLEAR
if (index == 0x1011u) { /* restore */
retVal = coEventStoreClearInd(subIndex);
}
#endif /* CO_EVENT_STATIC_STORE_CLEAR */
/* use similar error message */
if (retVal != RET_OK) {
retVal = RET_HARDWARE_ERROR;
}
return(retVal);
}
#endif /* CO_STORE_SUPPORTED */
#ifdef CO_STORE_SUPPORTED
# ifdef CO_AUTO_STORE_HANDLED_BY_APPLICATION
/***************************************************************************/
/**
* \internal
*
* \brief icoStoreReset - reset to default values
*
*
* \return RET_T
*
*/
void icoStoreReset(
void /* no parameter */
)
{
UNSIGNED16 i;
UNSIGNED32 val;
RET_T retVal;
for (i = 0u; i < 3u; i++) {
retVal = coOdGetDefaultVal_u32(0x1010u, i + 1u, &val);
if (retVal == RET_OK) {
storeObj[i] = val;
} else {
storeObj[i] = 1u;
}
}
}
# endif /* CO_AUTO_STORE_HANDLED_BY_APPLICATION */
#endif /* CO_STORE_SUPPORTED */
#ifdef CO_EVENT_STORE_CNT
/***************************************************************************/
/**
* \internal
*
* \brief icoStoreVarInit
*
*
* \return RET_T
*
*/
void icoStoreVarInit(
void
)
{
storeCnt = 0u;
# ifdef CO_STORE_SUPPORTED
storeSaveFunction = NULL;
storeClearFunction = NULL;
# ifdef CO_AUTO_STORE_HANDLED_BY_APPLICATION
{
UNSIGNED8 i;
for (i = 0u; i < CO_STORE_CNT_MAX; i++) {
/* set default: handled by command */
storeObj[i] = 1u;
restoreObj[i] = 1u;
}
}
# endif /* CO_AUTO_STORE_HANDLED_BY_APPLICATION */
# endif /* CO_STORE_SUPPORTED */
}
#endif /* CO_EVENT_STORE_CNT */