//***************************************************************************** // (C) Automotive Lighting Reutlingen GmbH // Tuebinger Strasse 123, 72762 Reutlingen, Germany // // Automotive Lighting Reutlingen GmbH owns all the rights to this work. // This work shall not be copied, reproduced, used, modified, transferred // or its information shall not be disclosed without the prior written // authorization of Automotive Lighting Reutlingen GmbH. //***************************************************************************** ///----------------------------------------------------------------------------- /// \file CodM.c /// /// \brief Coding Manager module for Hongqi H5 /// /// \descr Source: ECU8.x_CodingTool.xlsm. /// Version TBD /// For further details see coding parameter /// /// \author Kakade, Amol ALDE-RT/EES3 (Initial POC version) /// /// \date 21.06.2021, 10:51:08 ///----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Standard / system header file includes //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Project-specific header file includes //----------------------------------------------------------------------------- #include #include #include #include #include #include //----------------------------------------------------------------------------- // "define" and "typedef" statements at the module level //----------------------------------------------------------------------------- /** Swap the byte ordering of a 32-bit value */ #define CY_SWAP_ENDIAN32(x) ((uint32)((((x) >> 24u) & 0x000000FFu) | (((x) & 0x00FF0000u) >> 8u) | \ (((x) & 0x0000FF00u) << 8u) | ((x) << 24u))) #define NULL ((void *)0) //TBD #define VALIDATION_CYCLE_COUNTER_MAX 5u //----------------------------------------------------------------------------- // Global variable declarations //----------------------------------------------------------------------------- //============================================================================= // Start definitions of static or initialized variables of type of type structures, unions, or arrays //============================================================================= #define ctasCtrlStp_START_SEC_VAR_INIT_UNSPECIFIED #include "ctasCtrlStp_MemMap.h" // -------------- Start variable definitions. /* Actual coding Data - read address 0x00034000 -0x0003FFFBUL */ const tRomPara_CodingArea applicationCodingData __attribute__((section(".APPL_CODING_DATA"))); // -------------- Stop variable definitions. #define ctasCtrlStp_STOP_SEC_VAR_INIT_UNSPECIFIED #include "ctasCtrlStp_MemMap.h" //============================================================================= // End definitions of static or initialized variables of type of type structures, unions, or arrays //============================================================================= //============================================================================= // Start definitions of static or initialized variables of type of type structures, unions, or arrays //============================================================================= #define ctaaCodM_START_SEC_VAR_INIT_UNSPECIFIED #include "ctaaCodM_MemMap.h" // -------------- Start variable definitions. STATIC_AL uint8 CodM_pucCodingLabels[] = "X01_AN012_CODD_0001.0002"; // -------------- Stop variable definitions. #define ctaaCodM_STOP_SEC_VAR_INIT_UNSPECIFIED #include "ctaaCodM_MemMap.h" //============================================================================= // End definitions of static or initialized variables of type of type structures, unions, or arrays //============================================================================= //============================================================================= // Start definitions of uninitialized 8 bit variables //============================================================================= #define ctaaCodM_START_SEC_VAR_NO_INIT_8 #include "ctaaCodM_MemMap.h" // -------------- Start variable definitions. // -------------- Stop variable definitions. #define ctaaCodM_STOP_SEC_VAR_NO_INIT_8 #include "ctaaCodM_MemMap.h" //============================================================================= // End definitions of uninitialized 8 bit variables //============================================================================= //============================================================================= // Start definitions of static or initialized 8 bit variables //============================================================================= #define ctaaCodM_START_SEC_VAR_INIT_8 #include "ctaaCodM_MemMap.h" // -------------- Start variable definitions. STATIC_AL boolean CodM_bIsCodingLabelsCompatible = FALSE; STATIC_AL boolean CodM_boCrcCodingTestResultIsOk = FALSE; // -------------- Stop variable definitions. #define ctaaCodM_STOP_SEC_VAR_INIT_8 #include "ctaaCodM_MemMap.h" //============================================================================= // End definitions of static or initialized 8 bit variables //============================================================================= //============================================================================= // Start declaration or definitions of functions //============================================================================= #define ctaaCodM_START_SEC_CODE #include "ctaaCodM_MemMap.h" // -------------- Start function declarations or definitions. STATIC_AL void CodM_ValidateCodingData(void); //----------------------------------------------------------------------------- // Static variable declarations //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Function prototypes //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Function definitions //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /// \brief initialisation function for CodM /// /// \descr CodM_Init() is initializing the RTE outputs, privat variables and /// coding data. /// Calling once at start up. /// /// \param void /// /// \return void //----------------------------------------------------------------------------- static void CodM_Init(void) { CodM_ValidateCodingData(); // if(CodM_bIsCodingDataValidated == FALSE) //{ // CodM_bIsCodingDataValidated = TRUE; // CodM_ValidateCodingData(); // CodM_Rte_Call_SysMonGetSafetyCodingErrorReason(&CodM_SafetyCodingErrorReason); // if(( CodM_boCrcCodingTestResultIsOk == TRUE) && (CodM_SafetyCodingErrorReason == 0xFEu)) // { // CodM_Rte_Write_CodMFuSaCodingDataStatus(TRUE); // } // else // { // CodM_Rte_Write_CodMFuSaCodingDataStatus(FALSE); // } //} } //----------------------------------------------------------------------------- /// \brief deinitialisation function for CodM /// /// \descr CodM_DeInit() is doing nothing /// Calling once before go to sleep. /// /// \param void /// /// \return void //----------------------------------------------------------------------------- static void CodM_DeInit(void) { // do absolute nothing } // PRQA S 5334 1 // program architecture and code readability FUNC(Std_ReturnType, ctaaCodM_CODE) ctaaCodM_roCodMStartCodingDataVerification(void) { return TRUE; } //============================================================================= // Start runnable //============================================================================= //----------------------------------------------------------------------------- /// \brief initialisation runnable /// /// \descr initialisation runnable for CodM /// Calling once at start up. /// /// \param void /// /// \return void //----------------------------------------------------------------------------- FUNC(void, ctaaCodM_CODE) ctaaCodM_riCodMInit(void) { CodM_Init(); } //----------------------------------------------------------------------------- /// \brief initialisation runnable /// /// \descr initialisation runnable for CodM /// Calling once at start up. /// /// \param void /// /// \return void //----------------------------------------------------------------------------- FUNC(void, ctaaCodM_CODE) ctaaCodM_rdCodMDeInit(void) { CodM_DeInit(); } //============================================================================= // End runnable //============================================================================= //----------------------------------------------------------------------------- /// \brief cyclic function for CodM /// /// \descr CodM_Cycle20ms() is to be updated further. /// /// \param void /// /// \return void //----------------------------------------------------------------------------- //STATIC_AL void CodM_Cycle20ms(void) //{ // //Read Coding Error for Fusa Coding Error // CodM_Rte_Call_SysMonGetSafetyCodingErrorReason(&CodM_SafetyCodingErrorReason); // PRQA S 3200// program architecture and readability // // if(( CodM_boCrcCodingTestResultIsOk == TRUE) && (CodM_SafetyCodingErrorReason == 0xFEu)) // { // CodM_Rte_Write_CodMFuSaCodingDataStatus(TRUE); // //TODO --Shall be changed once DTC is finalize // //Rte_Call_ppaclSetDtcStatusE00100_SetEventStatus(DEM_EVENT_STATUS_PASSED); // } // else // { // CodM_Rte_Write_CodMFuSaCodingDataStatus(FALSE); // //TODO --Shall be changed once DTC is finalize // //Rte_Call_ppaclSetDtcStatusE00100_SetEventStatus(DEM_EVENT_STATUS_FAILED); // } //} //----------------------------------------------------------------------------- // Runnable Definitions //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /// \brief deinitialisation runnable /// /// \descr deinitialisation runnable for CodM /// Calling once before go to sleep. /// /// \param void /// /// \return void //----------------------------------------------------------------------------- FUNC(void, ctaaCodM_CODE) rdCodMDeInit(void) { CodM_DeInit(); } //----------------------------------------------------------------------------- /// \brief Init Runnables /// /// \descr CodM_IsCodingLabelsCompatible /// Calling at init. /// /// \param void /// /// \return boolean //----------------------------------------------------------------------------- boolean CodM_IsCodingLabelsCompatible(unsigned char* szSrc, unsigned char* szDest) { while (((unsigned char)'\0' != *szSrc) && ((unsigned char)'\0' != *szDest) && (*szSrc == *szDest)) { // PRQA S 1881// program architecture and readability szSrc++; szDest++; } return ((*szSrc - *szDest) == 0u ? TRUE : FALSE); // PRQA S 1863// program architecture and readability } //not used //FUNC(Std_ReturnType, ctaaCodM_CODE) roCodMStartCodingDataVerification(void) //{ // if(CodM_bIsCodingDataValidated == FALSE) // { // CodM_ValidateCodingData(); // CodM_Rte_Call_SysMonGetSafetyCodingErrorReason(&CodM_SafetyCodingErrorReason); // if ((CodM_boCrcCodingTestResultIsOk == TRUE) && (CodM_SafetyCodingErrorReason == 0xFEu)) // { // CodM_Rte_Write_CodMFuSaCodingDataStatus(TRUE); // } // else // { // CodM_Rte_Write_CodMFuSaCodingDataStatus(FALSE); // } // CodM_bIsCodingDataValidated = TRUE; // } // return RTE_E_OK; //} STATIC_AL void CodM_ValidateCodingData(void) { uint32 ulCrcCodingData; unsigned char ucCodingLabels[25] = {(unsigned char)'\0',(unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0',(unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0',(unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0',(unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0',(unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0'}; uint32* pulCrcCodingExpected = (uint32*)CODING_CRC_ADDRESS; // PRQA S 306// program architecture and readability uint8* pucCrcCodingData = (uint8*)CODING_START_ADDRESS; // PRQA S 306// program architecture and readability uint32 ulExpectedCRC;//read CRC value in Hex file #ifndef UNIT_TEST // Crc_CalculateCRC32: unit test crashes at this point if ((pulCrcCodingExpected != NULL) && (pucCrcCodingData != NULL)) { //Calculate CRC value ulCrcCodingData = Crc_CalculateCRC32P4(pucCrcCodingData, (uint32) (CODING_END_ADDRESS - CODING_START_ADDRESS + 1u), (uint32) 0xFFFFFFFFUL, (boolean) TRUE); ulExpectedCRC = *pulCrcCodingExpected; //Swap Byte order ulExpectedCRC = CY_SWAP_ENDIAN32(ulExpectedCRC); //Compare calculated value and CRC value in Hex file CodM_boCrcCodingTestResultIsOk = (ulCrcCodingData == ulExpectedCRC) ? TRUE : FALSE; //Read Coding Labels (void)Bsw_MemCpy(ucCodingLabels, &(applicationCodingData.CodingLabels[0]), sizeof(ucCodingLabels)-1u); // PRQA S 1840// program architecture and readability //Compare Coding Labels CodM_bIsCodingLabelsCompatible = CodM_IsCodingLabelsCompatible(ucCodingLabels, CodM_pucCodingLabels); //Check Combined coding validity CodM_boCrcCodingTestResultIsOk &= CodM_bIsCodingLabelsCompatible; } else { //do nothing } #else extern uint8 setValue; CodM_boCrcCodingTestResultIsOk = Crc_CalculateCRCTest(setValue); #endif if (CodM_boCrcCodingTestResultIsOk == TRUE) { CodM_Rte_Write_CodMCodingDataStatus(TRUE); //For UT } else { CodM_Rte_Write_CodMCodingDataStatus(FALSE); //For UT } } // -------------- Stop function declarations or definitions. #define ctaaCodM_STOP_SEC_CODE #include "ctaaCodM_MemMap.h" //============================================================================= // End declaration or definitions of functions //=============================================================================