Choco OS  V.0.16.9.0
Join to the chocolate world
oc_serviceman.c
Go to the documentation of this file.
1 
27 #include <oc_service.h>
28 #include <oc_serviceman.h>
29 #include <oc_services_cfg.h>
30 #include <oc_intman.h>
31 
37 #define _________________________________________MACROS_SECTION_____________________________________________________________________________
38 
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)
43 
44 #undef _________________________________________MACROS_SECTION_____________________________________________________________________________
45 
46 
47 
53 #define _________________________________________TYPES_SECTION______________________________________________________________________________
54 
55 typedef struct
56 {
57  oC_Service_t Service;
58  const oC_Service_Registration_t* Registration;
60 
61 #undef _________________________________________TYPES_SECTION______________________________________________________________________________
62 
68 #define _________________________________________PROTOTYPES_SECTION_________________________________________________________________________
69 
71 static bool ServiceData_Delete ( ServiceData_t * ServiceData );
72 static ServiceData_t* GetServiceData ( const char * Name );
73 static oC_ErrorCode_t StartService ( ServiceData_t * ServiceData );
74 static oC_ErrorCode_t StopService ( ServiceData_t * ServiceData );
75 
76 #undef _________________________________________PROTOTYPES_SECTION_________________________________________________________________________
77 
78 
79 
85 #define _________________________________________GLOBALS_SECTION____________________________________________________________________________
86 
87 #define TURN_OFF(...)
88 #define TURN_ON(ServiceName) \
89 extern const oC_Service_Registration_t ServiceName;
90 
91 CFG_LIST_SERVICES(TURN_ON,TURN_OFF);
92 
93 #undef TURN_ON
94 
95 static oC_List(ServiceData_t*) Services = NULL;
96 const oC_Module_Registration_t ServiceMan = {
97  .Name = MODULE_NAME ,
98  .Module = oC_Module_ServiceMan ,
99  .TurnOnFunction = oC_ServiceMan_TurnOn ,
100  .TurnOffFunction = oC_ServiceMan_TurnOff ,
101  .RequiredModules = { oC_Module_ProcessMan , oC_Module_ThreadMan }
102 };
103 static const oC_Allocator_t Allocator = {
104  .Name = MODULE_NAME,
105 };
106 
107 #undef _________________________________________GLOBALS_SECTION____________________________________________________________________________
108 
114 #define _________________________________________FUNCTIONS_SECTION__________________________________________________________________________
115 
116 //==========================================================================================================================================
120 //==========================================================================================================================================
121 oC_ErrorCode_t oC_ServiceMan_TurnOn( void )
122 {
123  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
124 
125  if(TURN_OFF_VERIFICATION(errorCode))
126  {
127  Services = oC_List_New( &Allocator, AllocationFlags_Default );
128 
129  if(ErrorCondition( Services != NULL , oC_ErrorCode_AllocationError ))
130  {
131 #define TURN_ON(ServiceName) \
132  { \
133  ServiceData_t * serviceData = ServiceData_New(&ServiceName); \
134  \
135  if(oC_SaveIfFalse(ServiceName.Name, serviceData != NULL, oC_ErrorCode_AllocationError )) \
136  { \
137  oC_List_PushBack(Services, serviceData, &Allocator); \
138  } \
139  }
140 
141  CFG_LIST_SERVICES(TURN_ON,TURN_OFF);
142 
143 #undef TURN_ON
144 
145  oC_Module_TurnOn(oC_Module_ServiceMan);
146  errorCode = oC_ErrorCode_None;
147  }
148  }
149 
150  return errorCode;
151 }
152 
153 //==========================================================================================================================================
157 //==========================================================================================================================================
158 oC_ErrorCode_t oC_ServiceMan_TurnOff( void )
159 {
160  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
161 
162  if(TURN_ON_VERIFICATION(errorCode))
163  {
164  bool allDeleted = true;
165 
166  oC_IntMan_EnterCriticalSection();
167 
168  oC_Module_TurnOff(oC_Module_ServiceMan);
169 
170  foreach(Services, serviceData)
171  {
172  if(ServiceData_Delete(serviceData) == false)
173  {
174  allDeleted = false;
175  }
176  }
177 
178  bool listDeleted = oC_List_Delete(Services, AllocationFlags_Default);
179 
180  if(ErrorCondition( listDeleted && allDeleted, oC_ErrorCode_ReleaseError ))
181  {
182  errorCode = oC_ErrorCode_None;
183  }
184 
185  oC_IntMan_ExitCriticalSection();
186  }
187 
188  return errorCode;
189 }
190 
191 //==========================================================================================================================================
195 //==========================================================================================================================================
197 {
198  if(oC_Module_IsTurnedOn(oC_Module_ServiceMan))
199  {
200  foreach(Services,serviceData)
201  {
202  if(oC_Service_IsActive(serviceData->Service) == false)
203  {
204  oC_ErrorCode_t errorCode = StartService(serviceData);
205 
206  if(errorCode != oC_ErrorCode_RequiredModuleNotEnabled)
207  {
208  oC_SaveIfErrorOccur(serviceData->Registration->Name,errorCode);
209  }
210  }
211  }
212  }
213 }
214 
215 //==========================================================================================================================================
219 //==========================================================================================================================================
221 {
222  if(IS_TURNED_ON)
223  {
224  foreach(Services,serviceData)
225  {
226  if(oC_Service_IsActive(serviceData->Service) == false)
227  {
228  oC_ErrorCode_t errorCode = StopService(serviceData);
229 
230  if(errorCode != oC_ErrorCode_ModuleUsedByDifferentModule)
231  {
232  oC_SaveIfErrorOccur(serviceData->Registration->Name,errorCode);
233  }
234  }
235  }
236  }
237 }
238 
239 //==========================================================================================================================================
243 //==========================================================================================================================================
244 bool oC_ServiceMan_IsServiceActive( const char * Name )
245 {
246  bool active = false;
247 
248  if(IS_TURNED_ON && oC_SaveIfFalse("ServiceMan::IsActive - Name is not correct - ", isaddresscorrect(Name), oC_ErrorCode_WrongAddress))
249  {
250  ServiceData_t * serviceData = GetServiceData(Name);
251 
252  if(oC_SaveIfFalse("ServiceMan::IsActive: ", serviceData != NULL , oC_ErrorCode_ObjectNotFoundOnList))
253  {
254  active = oC_Service_IsActive(serviceData->Service);
255  }
256  }
257 
258  return active;
259 }
260 
261 //==========================================================================================================================================
265 //==========================================================================================================================================
266 oC_ErrorCode_t oC_ServiceMan_StartService( const char * Name )
267 {
268  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
269 
270  if(TURN_ON_VERIFICATION(errorCode) && ErrorCondition( isaddresscorrect(Name), oC_ErrorCode_WrongAddress ))
271  {
272  ServiceData_t * serviceData = GetServiceData(Name);
273  if(
274  ErrorCondition( serviceData != NULL , oC_ErrorCode_ObjectNotFoundOnList )
275  && ErrorCondition( oC_Service_IsActive(serviceData->Service) == false , oC_ErrorCode_ServiceAlreadyStarted )
276  )
277  {
278  errorCode = StartService(serviceData);
279  }
280  }
281 
282  return errorCode;
283 }
284 
285 //==========================================================================================================================================
289 //==========================================================================================================================================
290 oC_ErrorCode_t oC_ServiceMan_StopService( const char * Name )
291 {
292  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
293 
294  if(TURN_ON_VERIFICATION(errorCode) && ErrorCondition( isaddresscorrect(Name), oC_ErrorCode_WrongAddress ))
295  {
296  ServiceData_t * serviceData = GetServiceData(Name);
297  if(
298  ErrorCondition( serviceData != NULL , oC_ErrorCode_ObjectNotFoundOnList )
299  && ErrorCondition( oC_Service_IsActive(serviceData->Service) == true , oC_ErrorCode_ServiceNotStarted )
300  )
301  {
302  errorCode = StopService(serviceData);
303  }
304  }
305 
306  return errorCode;
307 }
308 
309 //==========================================================================================================================================
313 //==========================================================================================================================================
315 {
316  oC_Service_t service = NULL;
317 
318  if(IS_TURNED_ON && oC_SaveIfFalse("ServiceMan::GetService - Name is not correct ", isaddresscorrect(Name), oC_ErrorCode_WrongAddress))
319  {
320  ServiceData_t * data = GetServiceData(Name);
321 
322  if(
323  oC_SaveIfFalse("ServiceMan::GetService: ", data != NULL , oC_ErrorCode_ObjectNotFoundOnList )
324  && oC_SaveIfFalse("ServiceMan::GetService: ", data->Service != NULL, oC_ErrorCode_InternalDataAreDamaged )
325  )
326  {
327  service = data->Service;
328  }
329  }
330 
331  return service;
332 }
333 
334 #undef _________________________________________FUNCTIONS_SECTION__________________________________________________________________________
335 
341 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________
342 
343 //==========================================================================================================================================
347 //==========================================================================================================================================
349 {
350  ServiceData_t * serviceData = NULL;
351 
352  if( oC_SaveIfFalse("ServiceManager::NewServiceData - Registration incorrect ", isaddresscorrect(Registration), oC_ErrorCode_WrongAddress ) )
353  {
354  serviceData = kmalloc( sizeof(ServiceData_t), &Allocator, AllocationFlags_Default );
355 
356  if( oC_SaveIfFalse("ServiceManger::NewServiceData - data ", serviceData != NULL, oC_ErrorCode_AllocationError) )
357  {
358  serviceData->Service = oC_Service_New( Registration );
359 
360  if( oC_SaveIfFalse("ServiceManger::NewServiceData - service ", serviceData->Service != NULL, oC_ErrorCode_AllocationError) )
361  {
362  serviceData->Registration = Registration;
363  }
364  else
365  {
366  kfree(serviceData, AllocationFlags_Default);
367  serviceData = NULL;
368  }
369  }
370  }
371 
372  return serviceData;
373 }
374 //==========================================================================================================================================
378 //==========================================================================================================================================
379 static bool ServiceData_Delete( ServiceData_t * ServiceData )
380 {
381  bool serviceStopped = oC_Service_IsActive(ServiceData->Service) == false
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 );
385 
386  return deleted && serviceStopped && serviceDeleted;
387 }
388 
389 //==========================================================================================================================================
393 //==========================================================================================================================================
394 static ServiceData_t* GetServiceData( const char * Name )
395 {
396  ServiceData_t* foundServiceData = NULL;
397 
398  foreach(Services,serviceData)
399  {
400  if(strcmp(serviceData->Registration->Name, Name) == 0)
401  {
402  foundServiceData = serviceData;
403  break;
404  }
405  }
406 
407  return foundServiceData;
408 }
409 
410 //==========================================================================================================================================
414 //==========================================================================================================================================
415 static oC_ErrorCode_t StartService( ServiceData_t * ServiceData )
416 {
417  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
418 
419  if(ErrorCondition(oC_Service_IsActive(ServiceData->Service) == false, oC_ErrorCode_ServiceAlreadyStarted))
420  {
421  bool allRequiredEnabled = true;
422 
423  for( uint32_t i = 0 ; i < MAX_REQUIRED_MODULES && allRequiredEnabled ; i++)
424  {
425  oC_Module_t requiredModule = ServiceData->Registration->RequiredModules[i];
426  if(requiredModule > oC_Module_None && requiredModule < oC_Module_NumberOfModules)
427  {
428  allRequiredEnabled = oC_Module_IsTurnedOn(requiredModule);
429  }
430  }
431  if(ErrorCondition(allRequiredEnabled , oC_ErrorCode_RequiredModuleNotEnabled))
432  {
433  errorCode = oC_Service_Start(ServiceData->Service);
434  }
435  }
436 
437  return errorCode;
438 }
439 
440 //==========================================================================================================================================
444 //==========================================================================================================================================
445 static oC_ErrorCode_t StopService( ServiceData_t * ServiceData )
446 {
447  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
448 
449  if(ErrorCondition(oC_Service_IsActive(ServiceData->Service) == false, oC_ErrorCode_ServiceNotStarted))
450  {
451  errorCode = oC_Service_Stop(ServiceData->Service);
452  }
453 
454  return errorCode;
455 }
456 
457 #undef _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________
458 
459 
Interface of Service Manager.
const char * Name
Definition: oc_stdlib.h:161
static oC_ErrorCode_t StopService(ServiceData_t *ServiceData)
stops service
identifier for allocations
Definition: oc_stdlib.h:159
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
Definition: oc_service.c:111
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
Definition: oc_module.h:121
bool oC_Service_Delete(oC_Service_t *Service)
releases memory allocated for a service
Definition: oc_service.c:175
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
Definition: oc_service.c:232
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
Definition: oc_service.c:311
The file with interface for interrupt manager.
oC_ErrorCode_t oC_Service_Stop(oC_Service_t Service)
stops the service
Definition: oc_service.c:273
static void oC_Module_TurnOn(oC_Module_t Module)
sets module as turned on
Definition: oc_module.h:170
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
Definition: oc_null.h:37
static void oC_Module_TurnOff(oC_Module_t Module)
sets module as turned off
Definition: oc_module.h:185