/**********************************************************************************************************************
 *  COPYRIGHT
 *  -------------------------------------------------------------------------------------------------------------------
 *  \verbatim
 *  Copyright (c) 2025 by Vector Informatik GmbH.                                                  All rights reserved.
 *
 *                This software is copyright protected and proprietary to Vector Informatik GmbH.
 *                Vector Informatik GmbH grants to you only those rights as set out in the license conditions.
 *                All other rights remain with Vector Informatik GmbH.
 *  \endverbatim
 *  -------------------------------------------------------------------------------------------------------------------
 *  FILE DESCRIPTION
 *  -----------------------------------------------------------------------------------------------------------------*/
/** \file  File:  BrsMain_Appl.h
 *      Project:  Vector Basic Runtime System
 *       Module:  BrsMain
 *
 *  \brief Description:  Header of additional, Application-specific, implementation
 *
 *  \attention Please note:
 *    The demo and example programs only show special aspects of the software. With regard to the fact
 *    that these programs are meant for demonstration purposes only, Vector Informatik liability shall be
 *    expressly excluded in cases of ordinary negligence, to the extent admissible by law or statute.
 *********************************************************************************************************************/

/**********************************************************************************************************************
 *  REVISION HISTORY
 *  -------------------------------------------------------------------------------------------------------------------
 *  Refer to BrsMain.h.
 *********************************************************************************************************************/

#ifndef _BRSMAIN_APPL_H_
#define _BRSMAIN_APPL_H_

/**********************************************************************************************************************
 *  INCLUDES
 *********************************************************************************************************************/
#include "BrsMain.h"

#if defined (BRS_ENABLE_TESTSUITE_SUPPORT)
  #include "BrsTestsuite.h"
#endif

#if !defined (BRSMAINAPPL_DISABLE_CAN_EXCLUSIVEAREA_HANDLING)
# if defined (BRS_ENABLE_CAN_SUPPORT)
#  if defined (BRS_ENABLE_CAN_CORE_SUPPORT)
  #include "Can_30_Core.h"

#   if defined (VVIRTUALTARGET)
#    if defined (DRVCAN_CANOEEMUCANOEASR_VERSION)
  /*
  * Combination of CanGen3 HW driver with CanGen2 VTT driver detected. Special exclusive area handling should be
  * disabled
  */
  #define BRSMAINAPPL_DISABLE_CAN_EXCLUSIVEAREA_HANDLING
#    endif
#   else
  #include BRS_DRVCAN_HEADER_FILENAME
#   endif

#  elif defined (BRS_ENABLE_CAN_CLASSIC_SUPPORT)
  /* Just a check to verify, if either CAN_Classic or CAN_Core is active with CAN support enabled */

#  else
  #error "Neither a classic DrvCan nor a Can_30_Core DrvCan was detected, but DrvCan support is enabled. There seems to be something seems wrong here!"
#  endif /* BRS_ENABLE_CAN_X_SUPPORT */
# endif /* BRS_ENABLE_CAN_SUPPORT */
#endif /* BRSMAINAPPL_DISABLE_CAN_EXCLUSIVEAREA_HANDLING */

/**********************************************************************************************************************
 *  CONFIGURATION CHECK
 *********************************************************************************************************************/

/**********************************************************************************************************************
 *  GLOBAL TYPE DEFINITIONS
 *********************************************************************************************************************/
#if !defined (BRSMAINAPPL_DISABLE_CAN_EXCLUSIVEAREA_HANDLING) && defined (BRS_ENABLE_CAN_SUPPORT) && \
    defined (BRS_ENABLE_CAN_CORE_SUPPORT)
# if defined (CAN_30_CORE_COREVERSION)
#  if (CAN_30_CORE_COREVERSION >= 0x0203u)
  #define BRSMAIN_CAN_30_CORE_SPECIFIC_MEMMAP /* include "Can_30_Core_MemMap.h" instead of "MemMap.h" */
#  endif
# elif defined (CAN_30_CORE_SW_MAJOR_VERSION)
  #define BRSMAIN_CAN_30_CORE_SPECIFIC_MEMMAP /* include "Can_30_Core_MemMap.h" instead of "MemMap.h" */
# else
  #error "Detection of Can_30_Core driver version was not possible. Please configure here manually the valid MemMap header of the module."
# endif
#endif

/**********************************************************************************************************************
 *  GLOBAL CONSTANT MACROS
 *********************************************************************************************************************/

/**********************************************************************************************************************
 *  GLOBAL VARIABLES
 *********************************************************************************************************************/

/**********************************************************************************************************************
 *  GLOBAL FUNCTION PROTOTYPES
 *********************************************************************************************************************/
/*****************************************************************************/
/* @brief      Main initialization routine.
 *             Contains configuration specific initialization of BrsHw parts
 *             and BrsMain specific mechanisms.
 * @pre        -
 * @param[in]  -
 * @param[out] -
 * @return     -
 * @context    Function is called from main
 *****************************************************************************/
void BrsMain_Appl_Init(void);

#if defined (BRS_ENABLE_SCHM_STUB_GENERATION)
# if defined (BRS_ENABLE_FBL_SUPPORT)
 #define BRS_START_SEC_RAM_CODE
 #include "Brs_MemMap.h"
# endif
/*****************************************************************************/
/* @brief      Suspend all interrupts via OS call
 * @pre        -
 * @param[in]  -
 * @param[out] -
 * @return     -
 * @context    Function is used for SchM_Enter_* defines in vBrs generated
 *             SchM stub module specific header files. This allows the user to
 *             add project specific code. As default, SuspendAllInterrupts() is
 *             defined empty within BrsMain provided Os.h stub for delieveries
 *             w/o OS (no interrupt locking needed in polling environments)
 *****************************************************************************/
void BrsMain_Appl_SuspendAllInterrupts(void);

/*****************************************************************************/
/* @brief      Resume all interrupts via OS call
 * @pre        -
 * @param[in]  -
 * @param[out] -
 * @return     -
 * @context    Function is used for SchM_Exit_* defines in vBrs generated
 *             SchM stub module specific header files. This allows the user to
 *             add project specific code. As default, ResumeAllInterrupts() is
 *             defined empty within BrsMain provided Os.h stub for delieveries
 *             w/o OS (no interrupt locking needed in polling environments)
 *****************************************************************************/
void BrsMain_Appl_ResumeAllInterrupts(void);
# if defined (BRS_ENABLE_FBL_SUPPORT)
 #define BRS_STOP_SEC_RAM_CODE
 #include "Brs_MemMap.h"
# endif
#endif /* BRS_ENABLE_SCHM_STUB_GENERATION */

#if defined (BRS_ENABLE_HYPERVISOR_SUPPORT)
/*****************************************************************************/
/* @brief      Callout to let the additional configured cores started by the
 *             boot core, if necessary. This is just an initial template and
 *             may need project specific adaptions. It's called by every core.
 * @pre        -
 * @param[in]  coreID is the physical core ID of the actual running core
 * @param[out] -
 * @return     -
 * @context    Function is called from main, previously to vHyp_Init()
 *****************************************************************************/
void BrsMain_Appl_HypervisorStartCoreApi(uint32 coreID);

/*****************************************************************************/
/* @brief      Callout to implement user code previous to the call of
 *             vHyp_Start(). This is just an initial template and may need
 *             project specific adaptions. It's called by every core.
 * @pre        -
 * @param[in]  coreID is the physical core ID of the actual running core
 * @param[out] -
 * @return     -
 * @context    Function is called from main, previously to vHyp_Start()
 *****************************************************************************/
void BrsMain_Appl_HypervisorApi(uint32 coreID);
#endif

#if !defined (BRSMAINAPPL_DISABLE_CAN_EXCLUSIVEAREA_HANDLING)
# if defined (BRS_ENABLE_CAN_SUPPORT)
#  if defined (BRS_ENABLE_CAN_CLASSIC_SUPPORT)
/**********************************************************************************************************************
 * A classic (non-Gen3) DrvCan is part of the configuration. "Oldschool" implementation is needed
 *********************************************************************************************************************/

/**********************************************************************************************************************
 * UserDefined ExclusiveArea handling for CAN channels, according to AN-ISC-8-1149_ErrorHook_E_OS_DISABLED_INT.pdf
 *********************************************************************************************************************/
/* Macro is generated in vBrsCfg.h, to support drivers with infix.
   Sample w/o infix: void SchM_Enter_Can_CAN_EXCLUSIVE_AREA_0(void)
                     Can_DisableControllerInterrupts(0u);
   Sample w/ infix:  void SchM_Enter_Can_30_Mcan_CAN_30_MCAN_EXCLUSIVE_AREA_0(void)
                     Can_30_Mcan_DisableControllerInterrupts(0u);*/

#define CAN_START_SEC_CODE
/*
* to support CAN driver name infix, vBRS generator provides a wrapper
* for usage of the driver specific MemMap.h define in vBrsCfg.h
*/
#include "vBrsCfg.h"
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Enter, EXCLUSIVE_AREA_0);
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Exit, EXCLUSIVE_AREA_0);
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Enter, EXCLUSIVE_AREA_6);
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Exit, EXCLUSIVE_AREA_6);
#define CAN_STOP_SEC_CODE
/*
* to support CAN driver name infix, vBRS generator provides a wrapper
* for usage of the driver specific MemMap.h define in vBrsCfg.h
*/
#include "vBrsCfg.h"

#   if !defined (BRS_ENABLE_FBL_SUPPORT)
#define CANIF_START_SEC_CODE
#include "MemMap.h"
void SchM_Enter_CanIf_CANIF_EXCLUSIVE_AREA_0(void);
void SchM_Exit_CanIf_CANIF_EXCLUSIVE_AREA_0(void);
#define CANIF_STOP_SEC_CODE
#include "MemMap.h"

#define CANSM_START_SEC_CODE
#include "MemMap.h"
void SchM_Enter_CanSM_CANSM_EXCLUSIVE_AREA_4(void);
void SchM_Exit_CanSM_CANSM_EXCLUSIVE_AREA_4(void);
void SchM_Enter_CanSM_CANSM_EXCLUSIVE_AREA_1(void);
void SchM_Exit_CanSM_CANSM_EXCLUSIVE_AREA_1(void);
#define CANSM_STOP_SEC_CODE
#include "MemMap.h"

#define COMM_START_SEC_CODE
#include "MemMap.h"
void SchM_Enter_ComM_COMM_EXCLUSIVE_AREA_1(void);
void SchM_Exit_ComM_COMM_EXCLUSIVE_AREA_1(void);
#define COMM_STOP_SEC_CODE
#include "MemMap.h"
#   endif /* !BRS_ENABLE_FBL_SUPPORT */
#  endif /* BRS_ENABLE_CAN_CLASSIC_SUPPORT */

#  if defined (BRS_ENABLE_CAN_CORE_SUPPORT)
/**********************************************************************************************************************
 * A new (Gen3) DrvCan is part of the configuration. New implementation is needed
 *********************************************************************************************************************/
#   if (Can_30_Core_IsHardwareCancelByApplOfGeneralFeature(0u) && Can_30_Core_IsHardwareLoopCheckOfGeneralFeature(0u))

#    if !defined (BRS_ENABLE_FBL_SUPPORT)
  /* Within a FBL project, depending APIs are already available within Fbl_cw.c */
/**********************************************************************************************************************
 * Hardware Loop Check / Timeout Monitoring for CAN Driver, according to TechnicalReference_Can_30_Core.pdf,
 * chapter 2.8.2
 *********************************************************************************************************************/
#define CAN_30_CORE_START_SEC_CODE
#     if defined (BRSMAIN_CAN_30_CORE_SPECIFIC_MEMMAP)
  #include "Can_30_Core_MemMap.h"
#     else
  #include "MemMap.h"
#     endif
void Appl_30_CoreCanTimerStart(uint8 Controller, uint8 source);
void Appl_30_CoreCanTimerEnd(uint8 Controller, uint8 source);
Can_ReturnType Appl_30_CoreCanTimerLoop(uint8 Controller, uint8 source);
#define CAN_30_CORE_STOP_SEC_CODE
#     if defined (BRSMAIN_CAN_30_CORE_SPECIFIC_MEMMAP)
  #include "Can_30_Core_MemMap.h"
#     else
  #include "MemMap.h"
#     endif
#    endif /* !BRS_ENABLE_FBL_SUPPORT */

#   else
/**********************************************************************************************************************
 * UserDefined ExclusiveArea handling for CAN Driver Core, according to TechnicalReference_Can_30_Core.pdf, Note within
 * chapter 3.2
 *********************************************************************************************************************/
#define CAN_30_CORE_START_SEC_CODE
#    if defined (BRSMAIN_CAN_30_CORE_SPECIFIC_MEMMAP)
  #include "Can_30_Core_MemMap.h"
#    else
  #include "MemMap.h"
#    endif
void SchM_Enter_Can_30_Core_CAN_30_CORE_EXCLUSIVE_AREA_6(void);
void SchM_Exit_Can_30_Core_CAN_30_CORE_EXCLUSIVE_AREA_6(void);
#define CAN_30_CORE_STOP_SEC_CODE
#    if defined (BRSMAIN_CAN_30_CORE_SPECIFIC_MEMMAP)
  #include "Can_30_Core_MemMap.h"
#    else
  #include "MemMap.h"
#    endif

#    if !defined (BRS_ENABLE_CAN_CLASSIC_SUPPORT)
/**********************************************************************************************************************
 * UserDefined ExclusiveArea handling for vCAN Driver, according to TechnicalReference_vCan_30_Mcan.pdf, Note within
 * chapter 3.2
 *********************************************************************************************************************/
#define CAN_START_SEC_CODE
/*
* to support CAN driver name infix, vBRS generator provides a wrapper
* for usage of the driver specific MemMap.h define in vBrsCfg.h
*/
#include "vBrsCfg.h"
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Enter,EXCLUSIVE_AREA_0);
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Exit,EXCLUSIVE_AREA_0);
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Enter,EXCLUSIVE_AREA_1);
BRS_DRVCAN_EXCLUSIVE_AREA_INFIX(Exit,EXCLUSIVE_AREA_1);
#define CAN_STOP_SEC_CODE
/*
* to support CAN driver name infix, vBRS generator provides a wrapper
* for usage of the driver specific MemMap.h define in vBrsCfg.h
*/
#include "vBrsCfg.h"
#    endif /* !BRS_ENABLE_CAN_CLASSIC_SUPPORT */

#    if defined (BRS_DRVCAN1_HEADER_FILENAME)
  /* 2nd DrvCan instance detected */
#define CAN1_START_SEC_CODE
/*
* to support CAN driver name infix, vBRS generator provides a wrapper
* for usage of the driver specific MemMap.h define in vBrsCfg.h
*/
#include "vBrsCfg.h"
BRS_DRVCAN1_EXCLUSIVE_AREA_INFIX(Enter,EXCLUSIVE_AREA_0);
BRS_DRVCAN1_EXCLUSIVE_AREA_INFIX(Exit,EXCLUSIVE_AREA_0);
BRS_DRVCAN1_EXCLUSIVE_AREA_INFIX(Enter,EXCLUSIVE_AREA_1);
BRS_DRVCAN1_EXCLUSIVE_AREA_INFIX(Exit,EXCLUSIVE_AREA_1);
#define CAN1_STOP_SEC_CODE
/*
* to support CAN driver name infix, vBRS generator provides a wrapper
* for usage of the driver specific MemMap.h define in vBrsCfg.h
*/
#include "vBrsCfg.h"
#    endif /* BRS_DRVCAN1_HEADER_FILENAME */

#    if !defined (BRS_ENABLE_FBL_SUPPORT)
#     if !defined (BRS_ENABLE_CAN_CLASSIC_SUPPORT)
#define CANIF_START_SEC_CODE
#include "MemMap.h"
void SchM_Enter_CanIf_CANIF_EXCLUSIVE_AREA_0(void);
void SchM_Exit_CanIf_CANIF_EXCLUSIVE_AREA_0(void);
#define CANIF_STOP_SEC_CODE
#include "MemMap.h"

#define CANSM_START_SEC_CODE
#include "MemMap.h"
void SchM_Enter_CanSM_CANSM_EXCLUSIVE_AREA_4(void);
void SchM_Exit_CanSM_CANSM_EXCLUSIVE_AREA_4(void);
void SchM_Enter_CanSM_CANSM_EXCLUSIVE_AREA_1(void);
void SchM_Exit_CanSM_CANSM_EXCLUSIVE_AREA_1(void);
#define CANSM_STOP_SEC_CODE
#include "MemMap.h"

#define COMM_START_SEC_CODE
#include "MemMap.h"
void SchM_Enter_ComM_COMM_EXCLUSIVE_AREA_1(void);
void SchM_Exit_ComM_COMM_EXCLUSIVE_AREA_1(void);
#define COMM_STOP_SEC_CODE
#include "MemMap.h"
#     endif /* !BRS_ENABLE_CAN_CLASSIC_SUPPORT */
#    endif /* !BRS_ENABLE_FBL_SUPPORT */
#   endif /* Can_30_Core_IsHardwareCancelByApplOfGeneralFeature(0u) &&
             Can_30_Core_IsHardwareLoopCheckOfGeneralFeature(0u) */
#  endif /* BRS_ENABLE_CAN_CORE_SUPPORT */
# endif /* BRS_ENABLE_CAN_SUPPORT */
#endif /* !BRSMAINAPPL_DISABLE_CAN_EXCLUSIVEAREA_HANDLING */
#endif /* _BRSMAIN_APPL_H_ */
