Choco OS  V.0.16.9.0
Join to the chocolate world
oc_moduleman.c
Go to the documentation of this file.
1 
27 #include <oc_moduleman.h>
28 #include <oc_modules_cfg.h>
29 #include <oc_stdlib.h>
30 #include <oc_array.h>
31 #include <oc_debug.h>
32 #include <oc_intman.h>
33 #include <oc_string.h>
34 
40 #define _________________________________________GLOBALS_SECTION____________________________________________________________________________
41 
42 #define TURN_OFF(...)
43 #define TURN_ON(Name) extern const oC_Module_Registration_t Name;
44 
45 CFG_LIST_MODULES(TURN_ON,TURN_OFF);
46 
47 #undef TURN_ON
48 
49 #define TURN_ON(ModuleName) &ModuleName ,
50 static const oC_Module_Registration_t * ModuleRegistrations[] = {
51 
52  CFG_LIST_MODULES(TURN_ON,TURN_OFF)
53 
54 };
55 #undef TURN_ON
56 
57 #undef _________________________________________GLOBALS_SECTION____________________________________________________________________________
58 
64 #define _________________________________________FUNCTIONS_SECTION__________________________________________________________________________
65 
66 //==========================================================================================================================================
70 //==========================================================================================================================================
72 {
73  oC_ARRAY_FOREACH_IN_ARRAY(ModuleRegistrations,registrationReference)
74  {
75  const oC_Module_Registration_t * registration = *registrationReference;
76 
77  if(
78  oC_SaveIfFalse(registration->Name, registration->Module != oC_Module_None, oC_ErrorCode_ModuleNotCorrect)
79  && oC_Module_IsTurnedOn(registration->Module) == false
80  )
81  {
82  bool allRequiredEnabled = true;
83 
84  for( uint32_t i = 0; allRequiredEnabled && i < MAX_REQUIRED_MODULES; i++ )
85  {
86  if(registration->RequiredModules[i] != oC_Module_None)
87  {
88  allRequiredEnabled = oC_Module_IsTurnedOn(registration->RequiredModules[i]);
89  }
90  }
91 
92  if(allRequiredEnabled)
93  {
94  if(oC_SaveIfFalse("ModuleManager: Turn on function is not set - ", isaddresscorrect(registration->TurnOnFunction), oC_ErrorCode_WrongAddress))
95  {
96  if(oC_SaveIfErrorOccur(registration->Name, registration->TurnOnFunction()))
97  {
98  oC_SaveIfFalse(registration->Name, oC_Module_IsTurnedOn(registration->Module), oC_ErrorCode_ModuleHasNotStartedCorrectly);
99  }
100  }
101  }
102  }
103  }
104 }
105 
106 //==========================================================================================================================================
110 //==========================================================================================================================================
112 {
113  for( uint32_t moduleToTurnOffIndex = 0; moduleToTurnOffIndex < oC_ARRAY_SIZE(ModuleRegistrations); moduleToTurnOffIndex++ )
114  {
115  bool someOfModulesRequireThisModule = false;
116  const oC_Module_Registration_t * moduleToTurnOff = ModuleRegistrations[moduleToTurnOffIndex];
117 
118  if(
119  oC_SaveIfFalse(moduleToTurnOff->Name, moduleToTurnOff->Module != oC_Module_None, oC_ErrorCode_ModuleNotCorrect)
120  && oC_Module_IsTurnedOn(moduleToTurnOff->Module) == true
121  )
122  {
123  for( uint32_t moduleToCheckRequirements = 0 ; someOfModulesRequireThisModule == false && moduleToCheckRequirements < oC_ARRAY_SIZE(ModuleRegistrations) ; moduleToCheckRequirements++ )
124  {
125  const oC_Module_Registration_t * moduleToCheck = ModuleRegistrations[moduleToCheckRequirements];
126 
127  for( uint32_t i = 0; someOfModulesRequireThisModule == false && i < MAX_REQUIRED_MODULES; i++ )
128  {
129  if(moduleToCheck->RequiredModules[i] == moduleToTurnOff->Module)
130  {
131  someOfModulesRequireThisModule = oC_Module_IsTurnedOn(moduleToCheck->RequiredModules[i]);
132  }
133  }
134  }
135 
136  if(someOfModulesRequireThisModule == false)
137  {
138  if(oC_SaveIfFalse("ModuleManager: Turn off function is not set - ", isaddresscorrect(moduleToTurnOff->TurnOffFunction), oC_ErrorCode_WrongAddress))
139  {
140  if(oC_SaveIfErrorOccur(moduleToTurnOff->Name, moduleToTurnOff->TurnOffFunction()))
141  {
142  oC_SaveIfFalse(moduleToTurnOff->Name, oC_Module_IsTurnedOn(moduleToTurnOff->Module) == false, oC_ErrorCode_ModuleHasNotBeenStoppedCorrectly );
143  }
144  }
145  }
146  }
147  }
148 }
149 
150 //==========================================================================================================================================
154 //==========================================================================================================================================
155 oC_ErrorCode_t oC_ModuleMan_TurnOnModule( const char * Name )
156 {
157  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
158 
159  if(ErrorCondition( isaddresscorrect(Name), oC_ErrorCode_WrongAddress))
160  {
161  errorCode = oC_ErrorCode_ObjectNotFoundOnList;
162 
163  oC_ARRAY_FOREACH_IN_ARRAY(ModuleRegistrations,registrationReference)
164  {
165  const oC_Module_Registration_t * registration = *registrationReference;
166  if(
167  strcmp(Name, registration->Name) == 0
168  && ErrorCondition(registration->Module != oC_Module_None , oC_ErrorCode_ModuleNotCorrect )
169  && ErrorCondition(oC_Module_IsTurnedOn(registration->Module) == false , oC_ErrorCode_ModuleIsTurnedOn )
170  )
171  {
172  bool allRequiredEnabled = true;
173 
174  for( uint32_t i = 0; allRequiredEnabled && i < MAX_REQUIRED_MODULES; i++ )
175  {
176  if(registration->RequiredModules[i] != oC_Module_None)
177  {
178  allRequiredEnabled = oC_Module_IsTurnedOn(registration->RequiredModules[i]);
179  }
180  }
181 
182  if(ErrorCondition( allRequiredEnabled, oC_ErrorCode_RequiredModuleNotEnabled ))
183  {
184  if(ErrorCondition( isaddresscorrect(registration->TurnOnFunction), oC_ErrorCode_WrongAddress ))
185  {
186  if( ErrorCode( registration->TurnOnFunction() ) )
187  {
188  errorCode = oC_ErrorCode_None;
189  ErrorCondition( oC_Module_IsTurnedOn(registration->Module), oC_ErrorCode_ModuleHasNotStartedCorrectly );
190  }
191  }
192  }
193  break;
194  }
195  }
196  }
197 
198  return errorCode;
199 }
200 
201 //==========================================================================================================================================
205 //==========================================================================================================================================
206 oC_ErrorCode_t oC_ModuleMan_TurnOffModule( const char * Name )
207 {
208  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
209 
210  if(ErrorCondition( isaddresscorrect(Name), oC_ErrorCode_WrongAddress))
211  {
212  errorCode = oC_ErrorCode_ObjectNotFoundOnList;
213 
214  for( uint32_t moduleToTurnOffIndex = 0; moduleToTurnOffIndex < oC_ARRAY_SIZE(ModuleRegistrations); moduleToTurnOffIndex++ )
215  {
216  bool someOfModulesRequireThisModule = false;
217  const oC_Module_Registration_t * moduleToTurnOff = ModuleRegistrations[moduleToTurnOffIndex];
218 
219  if(
220  strcmp(Name, moduleToTurnOff->Name) == 0
221  && ErrorCondition(moduleToTurnOff->Module != oC_Module_None , oC_ErrorCode_ModuleNotCorrect )
222  && ErrorCondition(oC_Module_IsTurnedOn(moduleToTurnOff->Module) == true , oC_ErrorCode_ModuleNotStartedYet )
223  )
224  {
225  for( uint32_t moduleToCheckRequirements = 0 ; someOfModulesRequireThisModule == false && moduleToCheckRequirements < oC_ARRAY_SIZE(ModuleRegistrations) ; moduleToCheckRequirements++ )
226  {
227  const oC_Module_Registration_t * moduleToCheck = ModuleRegistrations[moduleToCheckRequirements];
228 
229  for( uint32_t i = 0; someOfModulesRequireThisModule == false && i < MAX_REQUIRED_MODULES; i++ )
230  {
231  if(moduleToCheck->RequiredModules[i] == moduleToTurnOff->Module)
232  {
233  someOfModulesRequireThisModule = oC_Module_IsTurnedOn(moduleToCheck->RequiredModules[i]);
234  }
235  }
236  }
237 
238  if(ErrorCondition(someOfModulesRequireThisModule == false, oC_ErrorCode_ModuleUsedByDifferentModule))
239  {
240  if(ErrorCondition( isaddresscorrect(moduleToTurnOff->TurnOffFunction), oC_ErrorCode_WrongAddress ))
241  {
242  if( ErrorCode( moduleToTurnOff->TurnOffFunction() ) )
243  {
244  errorCode = oC_ErrorCode_None;
245  ErrorCondition( oC_Module_IsTurnedOn(moduleToTurnOff->Module) == false, oC_ErrorCode_ModuleHasNotBeenStoppedCorrectly );
246  }
247  }
248  }
249  }
250  }
251  }
252 
253  return errorCode;
254 }
255 
256 //==========================================================================================================================================
260 //==========================================================================================================================================
262 {
263  const oC_Module_Registration_t * foundRegistration = NULL;
264 
265  oC_ARRAY_FOREACH_IN_ARRAY(ModuleRegistrations,registrationReference)
266  {
267  const oC_Module_Registration_t * registration = *registrationReference;
268 
269  if(strcmp(Name,registration->Name) == 0)
270  {
271  foundRegistration = registration;
272  break;
273  }
274  }
275 
276  return foundRegistration;
277 }
278 
279 #undef _________________________________________FUNCTIONS_SECTION__________________________________________________________________________
280 
281 
282 
283 
oC_ErrorCode_t oC_ModuleMan_TurnOnModule(const char *Name)
turns on the module
Definition: oc_moduleman.c:155
FILE__DESCRIPTION
#define oC_ARRAY_SIZE(ARRAY)
returns size of static array
Definition: oc_array.h:36
oC_ErrorCode_t oC_ModuleMan_TurnOffModule(const char *Name)
turns off the module
Definition: oc_moduleman.c:206
static bool oC_Module_IsTurnedOn(oC_Module_t Module)
checks if the module is turned on
Definition: oc_module.h:121
The file with interface for interrupt manager.
void oC_ModuleMan_TurnOffAllPossible(void)
turns off all possible modules
Definition: oc_moduleman.c:111
Static array definitions.
The file with interface for string library.
const oC_Module_Registration_t * oC_ModuleMan_GetModuleRegistration(const char *Name)
returns module registration
Definition: oc_moduleman.c:261
void oC_ModuleMan_TurnOnAllPossible(void)
turns on all modules that turning on is possible
Definition: oc_moduleman.c:71
Manages modules in the system.
#define NULL
pointer to a zero
Definition: oc_null.h:37