]> rtime.felk.cvut.cz Git - arc.git/blobdiff - system/EcuM/EcuM.c
Merge in from default
[arc.git] / system / EcuM / EcuM.c
index 935eebc29e7a4946976231bc00cc00676c492b32..e7c4700b50600e715ad737c8a65d4697b051d266 100644 (file)
@@ -22,6 +22,9 @@
 #include "Mcu.h"\r
 #include "Det.h"\r
 #include "irq.h"\r
+#if    (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
+#include "Nvm.h"\r
+#endif\r
 \r
 EcuM_GobalType internal_data;\r
 \r
@@ -57,6 +60,11 @@ void EcuM_Init( void )
 \r
        // Set default application mode\r
        internal_data.app_mode = internal_data.config->EcuMDefaultAppMode;\r
+#if defined(USE_COMM)\r
+       internal_data.run_comm_requests = 0;\r
+#endif\r
+       internal_data.run_requests = 0;\r
+       internal_data.postrun_requests = 0;\r
 \r
        internal_data.initiated = TRUE;\r
 \r
@@ -68,6 +76,7 @@ void EcuM_StartupTwo()
 {\r
 #if    (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
        uint32 timer;\r
+       static NvM_RequestResultType readAllResult;\r
 #endif\r
 \r
        internal_data.current_state = ECUM_STATE_STARTUP_TWO;\r
@@ -90,11 +99,10 @@ void EcuM_StartupTwo()
 #endif\r
 \r
 #if    (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
-       // Wait for the NVM job to terminate\r
-       while(Os_SysTickGetValue()-timer < internal_data.config.EcuMNvramReadAllTimeout)\r
-       {\r
-               //TODO\r
-       }\r
+       // Wait for the NVM job (NvmReadAll) to terminate\r
+       do {\r
+               NvM_GetErrorStatus(0, &readAllResult);  // Read the multiblock status\r
+       } while( (readAllResult == NVM_REQ_PENDING) && !(Os_SysTickGetValue() - timer < internal_data.config->EcuMNvramReadAllTimeout) );\r
 #endif\r
 \r
        // Initialize drivers that need NVRAM data\r
@@ -128,13 +136,7 @@ void EcuM_Shutdown()
 \r
 Std_ReturnType EcuM_GetState(EcuM_StateType* state)\r
 {\r
-#if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
-       if (state == NULL)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GETSTATE_ID, ECUM_E_NULL_POINTER);\r
-               return E_NOT_OK;\r
-       }\r
-#endif\r
+       VALIDATE_RV(state != NULL, ECUM_GETSTATE_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
 \r
        *state = internal_data.current_state;\r
 \r
@@ -143,13 +145,7 @@ Std_ReturnType EcuM_GetState(EcuM_StateType* state)
 \r
 Std_ReturnType EcuM_SelectApplicationMode(AppModeType appMode)\r
 {\r
-#if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
-       if (!internal_data.initiated)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_SELECTAPPMODE_ID, ECUM_E_NOT_INITIATED);\r
-               return E_NOT_OK;\r
-       }\r
-#endif\r
+       VALIDATE_RV(internal_data.initiated, ECUM_SELECTAPPMODE_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
 \r
        // TODO Save this application mode for next startup\r
 \r
@@ -158,19 +154,8 @@ Std_ReturnType EcuM_SelectApplicationMode(AppModeType appMode)
 \r
 Std_ReturnType EcuM_GetApplicationMode(AppModeType* appMode)\r
 {\r
-#if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
-       if (!internal_data.initiated)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GETAPPMODE_ID, ECUM_E_NOT_INITIATED);\r
-               return E_NOT_OK;\r
-       }\r
-\r
-       if (appMode == NULL)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GETAPPMODE_ID, ECUM_E_NULL_POINTER);\r
-               return E_NOT_OK;\r
-       }\r
-#endif\r
+       VALIDATE_RV(internal_data.initiated, ECUM_GETAPPMODE_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(appMode != NULL, ECUM_GETAPPMODE_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
 \r
        *appMode = internal_data.app_mode;\r
 \r
@@ -179,13 +164,7 @@ Std_ReturnType EcuM_GetApplicationMode(AppModeType* appMode)
 \r
 Std_ReturnType EcuM_SelectBootTarget(EcuM_BootTargetType target)\r
 {\r
-#if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
-       if (!internal_data.initiated)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_SELECT_BOOTARGET_ID, ECUM_E_NOT_INITIATED);\r
-               return E_NOT_OK;\r
-       }\r
-#endif\r
+       VALIDATE_RV(internal_data.initiated, ECUM_SELECT_BOOTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
 \r
        // TODO Do something great here\r
 \r
@@ -194,21 +173,105 @@ Std_ReturnType EcuM_SelectBootTarget(EcuM_BootTargetType target)
 \r
 Std_ReturnType EcuM_GetBootTarget(EcuM_BootTargetType* target)\r
 {\r
-#if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
-       if (!internal_data.initiated)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GET_BOOTARGET_ID, ECUM_E_NOT_INITIATED);\r
-               return E_NOT_OK;\r
-       }\r
-\r
-       if (target == NULL)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GET_BOOTARGET_ID, ECUM_E_NULL_POINTER);\r
-               return E_NOT_OK;\r
-       }\r
-#endif\r
+       VALIDATE_RV(internal_data.initiated, ECUM_GET_BOOTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(target != NULL, ECUM_GET_BOOTARGET_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
 \r
        // TODO Return selected boot target here\r
 \r
        return E_NOT_OK;\r
 }\r
+\r
+\r
+Std_ReturnType EcuM_SelectShutdownTarget(EcuM_StateType target, uint8 mode)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_SELECTSHUTDOWNTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV((target == ECUM_STATE_OFF) || (target == ECUM_STATE_RESET) || (target == ECUM_STATE_SLEEP), ECUM_SELECTSHUTDOWNTARGET_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.shutdown_target = target;\r
+       internal_data.shutdown_mode = mode;\r
+\r
+       return E_OK;\r
+}\r
+\r
+\r
+Std_ReturnType EcuM_GetShutdownTarget(EcuM_StateType *shutdownTarget, uint8 *sleepMode)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_GETSHUTDOWNTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+\r
+       *shutdownTarget = internal_data.shutdown_target;\r
+       *sleepMode = internal_data.shutdown_mode;\r
+\r
+       return E_OK;\r
+}\r
+\r
+\r
+Std_ReturnType EcuM_RequestRUN(EcuM_UserType user)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_REQUESTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_REQUESTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.run_requests |= (uint32)1 << user;\r
+\r
+       return E_OK;\r
+}\r
+\r
+Std_ReturnType EcuM_ReleaseRUN(EcuM_UserType user)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_RELEASERUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_RELEASERUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.run_requests &= ~((uint32)1 << user);\r
+\r
+       return E_OK;\r
+}\r
+\r
+#if defined(USE_COMM)\r
+Std_ReturnType EcuM_ComM_RequestRUN(NetworkHandleType user)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_COMM_REQUESTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(user < 32, ECUM_COMM_REQUESTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.run_comm_requests |= (uint32)1 << user;\r
+\r
+       return E_OK;\r
+}\r
+\r
+Std_ReturnType EcuM_ComM_ReleaseRUN(NetworkHandleType user)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_COMM_RELEASERUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(user < 32, ECUM_COMM_RELEASERUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.run_comm_requests &= ~((uint32)1 << user);\r
+\r
+       return E_OK;\r
+}\r
+\r
+boolean EcuM_ComM_HasRequestedRUN(NetworkHandleType user)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_COMM_HASREQUESTEDRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(user < 32, ECUM_COMM_HASREQUESTEDRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       return (internal_data.run_comm_requests &((uint32)1 << user)) != 0;\r
+}\r
+#endif\r
+\r
+Std_ReturnType EcuM_RequestPOST_RUN(EcuM_UserType user)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_REQUESTPOSTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_REQUESTPOSTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.postrun_requests |= (uint32)1 << user;\r
+\r
+       return E_OK;\r
+}\r
+\r
+Std_ReturnType EcuM_ReleasePOST_RUN(EcuM_UserType user)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_RELEASEPOSTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_RELEASEPOSTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.postrun_requests &= ~((uint32)1 << user);\r
+\r
+       return E_OK;\r
+}\r
+\r