29 #include <oc_services_cfg.h> 37 #define _________________________________________MACROS_SECTION_____________________________________________________________________________ 39 #define MODULE_NAME "Service Manager" 40 #define TURN_ON_VERIFICATION(errorCode) oC_Module_TurnOnVerification ( &errorCode, oC_Module_ServiceMan ) 41 #define TURN_OFF_VERIFICATION(errorCode) oC_Module_TurnOffVerification( &errorCode, oC_Module_ServiceMan ) 42 #define IS_TURNED_ON oC_SaveIfFalse(oC_FUNCTION, oC_Module_IsTurnedOn(oC_Module_ServiceMan), oC_ErrorCode_ModuleNotStartedYet) 44 #undef _________________________________________MACROS_SECTION_____________________________________________________________________________ 53 #define _________________________________________TYPES_SECTION______________________________________________________________________________ 61 #undef _________________________________________TYPES_SECTION______________________________________________________________________________ 68 #define _________________________________________PROTOTYPES_SECTION_________________________________________________________________________ 76 #undef _________________________________________PROTOTYPES_SECTION_________________________________________________________________________ 85 #define _________________________________________GLOBALS_SECTION____________________________________________________________________________ 88 #define TURN_ON(ServiceName) \ 89 extern const oC_Service_Registration_t ServiceName; 91 CFG_LIST_SERVICES(TURN_ON,TURN_OFF);
98 .Module = oC_Module_ServiceMan ,
101 .RequiredModules = { oC_Module_ProcessMan , oC_Module_ThreadMan }
107 #undef _________________________________________GLOBALS_SECTION____________________________________________________________________________ 114 #define _________________________________________FUNCTIONS_SECTION__________________________________________________________________________ 123 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
125 if(TURN_OFF_VERIFICATION(errorCode))
127 Services = oC_List_New( &Allocator, AllocationFlags_Default );
129 if(ErrorCondition( Services !=
NULL , oC_ErrorCode_AllocationError ))
131 #define TURN_ON(ServiceName) \ 133 ServiceData_t * serviceData = ServiceData_New(&ServiceName); \ 135 if(oC_SaveIfFalse(ServiceName.Name, serviceData != NULL, oC_ErrorCode_AllocationError )) \ 137 oC_List_PushBack(Services, serviceData, &Allocator); \ 141 CFG_LIST_SERVICES(TURN_ON,TURN_OFF);
146 errorCode = oC_ErrorCode_None;
160 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
162 if(TURN_ON_VERIFICATION(errorCode))
164 bool allDeleted =
true;
166 oC_IntMan_EnterCriticalSection();
170 foreach(Services, serviceData)
178 bool listDeleted = oC_List_Delete(Services, AllocationFlags_Default);
180 if(ErrorCondition( listDeleted && allDeleted, oC_ErrorCode_ReleaseError ))
182 errorCode = oC_ErrorCode_None;
185 oC_IntMan_ExitCriticalSection();
200 foreach(Services,serviceData)
206 if(errorCode != oC_ErrorCode_RequiredModuleNotEnabled)
208 oC_SaveIfErrorOccur(serviceData->Registration->Name,errorCode);
224 foreach(Services,serviceData)
228 oC_ErrorCode_t errorCode =
StopService(serviceData);
230 if(errorCode != oC_ErrorCode_ModuleUsedByDifferentModule)
232 oC_SaveIfErrorOccur(serviceData->Registration->Name,errorCode);
248 if(IS_TURNED_ON && oC_SaveIfFalse(
"ServiceMan::IsActive - Name is not correct - ", isaddresscorrect(Name), oC_ErrorCode_WrongAddress))
252 if(oC_SaveIfFalse(
"ServiceMan::IsActive: ", serviceData !=
NULL , oC_ErrorCode_ObjectNotFoundOnList))
268 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
270 if(TURN_ON_VERIFICATION(errorCode) && ErrorCondition( isaddresscorrect(Name), oC_ErrorCode_WrongAddress ))
274 ErrorCondition( serviceData !=
NULL , oC_ErrorCode_ObjectNotFoundOnList )
275 && ErrorCondition(
oC_Service_IsActive(serviceData->Service) ==
false , oC_ErrorCode_ServiceAlreadyStarted )
292 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
294 if(TURN_ON_VERIFICATION(errorCode) && ErrorCondition( isaddresscorrect(Name), oC_ErrorCode_WrongAddress ))
298 ErrorCondition( serviceData !=
NULL , oC_ErrorCode_ObjectNotFoundOnList )
299 && ErrorCondition(
oC_Service_IsActive(serviceData->Service) ==
true , oC_ErrorCode_ServiceNotStarted )
318 if(IS_TURNED_ON && oC_SaveIfFalse(
"ServiceMan::GetService - Name is not correct ", isaddresscorrect(Name), oC_ErrorCode_WrongAddress))
323 oC_SaveIfFalse(
"ServiceMan::GetService: ", data !=
NULL , oC_ErrorCode_ObjectNotFoundOnList )
324 && oC_SaveIfFalse(
"ServiceMan::GetService: ", data->Service !=
NULL, oC_ErrorCode_InternalDataAreDamaged )
327 service = data->Service;
334 #undef _________________________________________FUNCTIONS_SECTION__________________________________________________________________________ 341 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ 352 if( oC_SaveIfFalse(
"ServiceManager::NewServiceData - Registration incorrect ", isaddresscorrect(Registration), oC_ErrorCode_WrongAddress ) )
354 serviceData = kmalloc(
sizeof(
ServiceData_t), &Allocator, AllocationFlags_Default );
356 if( oC_SaveIfFalse(
"ServiceManger::NewServiceData - data ", serviceData !=
NULL, oC_ErrorCode_AllocationError) )
360 if( oC_SaveIfFalse(
"ServiceManger::NewServiceData - service ", serviceData->Service !=
NULL, oC_ErrorCode_AllocationError) )
362 serviceData->Registration = Registration;
366 kfree(serviceData, AllocationFlags_Default);
382 || oC_SaveIfErrorOccur(
"ServiceManager::Delete - Cannot Stop Service - " ,
oC_Service_Stop(ServiceData->Service) );
383 bool serviceDeleted = oC_SaveIfFalse(
"ServiceManager::Delete - Cannot Delete Service - " ,
oC_Service_Delete(&ServiceData->Service), oC_ErrorCode_ReleaseError );
384 bool deleted = kfree( ServiceData, AllocationFlags_Default );
386 return deleted && serviceStopped && serviceDeleted;
398 foreach(Services,serviceData)
400 if(strcmp(serviceData->Registration->Name, Name) == 0)
402 foundServiceData = serviceData;
407 return foundServiceData;
417 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
419 if(ErrorCondition(
oC_Service_IsActive(ServiceData->Service) ==
false, oC_ErrorCode_ServiceAlreadyStarted))
421 bool allRequiredEnabled =
true;
423 for( uint32_t i = 0 ; i < MAX_REQUIRED_MODULES && allRequiredEnabled ; i++)
425 oC_Module_t requiredModule = ServiceData->Registration->RequiredModules[i];
426 if(requiredModule > oC_Module_None && requiredModule < oC_Module_NumberOfModules)
431 if(ErrorCondition(allRequiredEnabled , oC_ErrorCode_RequiredModuleNotEnabled))
447 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
449 if(ErrorCondition(
oC_Service_IsActive(ServiceData->Service) ==
false, oC_ErrorCode_ServiceNotStarted))
457 #undef _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ Interface of Service Manager.
static oC_ErrorCode_t StopService(ServiceData_t *ServiceData)
stops service
identifier for allocations
oC_Service_t oC_ServiceMan_GetService(const char *Name)
returns service with the given name
oC_Service_t oC_Service_New(const oC_Service_Registration_t *Registration)
allocates memory for a new service
static bool ServiceData_Delete(ServiceData_t *ServiceData)
deletes service data
bool oC_ServiceMan_IsServiceActive(const char *Name)
checks if the given service is activated
void oC_ServiceMan_StartAllPossible(void)
starts all services
static bool oC_Module_IsTurnedOn(oC_Module_t Module)
checks if the module is turned on
bool oC_Service_Delete(oC_Service_t *Service)
releases memory allocated for a service
oC_ErrorCode_t oC_ServiceMan_StartService(const char *Name)
starts the given service
oC_ErrorCode_t oC_Service_Start(oC_Service_t Service)
starts the service
oC_ErrorCode_t oC_ServiceMan_TurnOn(void)
turns on Service Manager
void oC_ServiceMan_StopAllPossible(void)
stops all services
ServiceData_t * ServiceData_New(const oC_Service_Registration_t *Registration)
allocates memory for a new service data
bool oC_Service_IsActive(oC_Service_t Service)
returns true if the service is correct and active
The file with interface for interrupt manager.
oC_ErrorCode_t oC_Service_Stop(oC_Service_t Service)
stops the service
static void oC_Module_TurnOn(oC_Module_t Module)
sets module as turned on
interface for handling services
oC_ErrorCode_t oC_ServiceMan_StopService(const char *Name)
stops the given service
static ServiceData_t * GetServiceData(const char *Name)
searches for a service data
oC_ErrorCode_t oC_ServiceMan_TurnOff(void)
turns off Service Manager
static oC_ErrorCode_t StartService(ServiceData_t *ServiceData)
starts service
#define NULL
pointer to a zero
static void oC_Module_TurnOff(oC_Module_t Module)
sets module as turned off