Choco OS  V.0.16.9.0
Join to the chocolate world
oc_programman.c
Go to the documentation of this file.
1 
27 #include <oc_programman.h>
28 #include <oc_programs_list.h>
29 #include <string.h>
30 #include <oc_processman.h>
31 #include <oc_debug.h>
32 
38 #define _________________________________________TYPES_SECTION______________________________________________________________________________
39 
40 
41 
42 #undef _________________________________________TYPES_SECTION______________________________________________________________________________
43 
49 #define _________________________________________VARIABLES_SECTION__________________________________________________________________________
50 
51 static bool ModuleEnabledFlag = false;
52 static oC_Program_t DefaultProgram = NULL;
53 static oC_List(oC_Program_t) Programs = NULL;
54 static const oC_Allocator_t Allocator = {
55  .Name = "program manager" ,
56  .EventFlags = 0 ,
57  .EventHandler = NULL
58 };
59 
60 #define DONT_DECLARE(...)
61 #define DECLARE_PROGRAM_REGISTRATION(ProgramName) \
62  extern const oC_Program_Registration_t ProgramName##Registration;
63  CFG_PROGRAMS_LIST(DECLARE_PROGRAM_REGISTRATION,DONT_DECLARE);
64 #undef DECLARE_PROGRAM_REGISTRATION
65 #undef DONT_DECLARE
66 
67 #undef _________________________________________VARIABLES_SECTION__________________________________________________________________________
68 
74 #define _________________________________________INTERFACE_FUNCTIONS_SECTION_______________________________________________________________
75 
76 //==========================================================================================================================================
77 //==========================================================================================================================================
78 oC_ErrorCode_t oC_ProgramMan_TurnOn( void )
79 {
80  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
81 
82  if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == false , oC_ErrorCode_ModuleIsTurnedOn))
83  {
84  DefaultProgram = NULL;
85  Programs = oC_List_New(&Allocator,AllocationFlags_NoWait);
86 
87  if(Programs)
88  {
89  ModuleEnabledFlag = true;
90  errorCode = oC_ErrorCode_None;
91 #define DONT_ADD(...)
92 #define ADD_PROGRAM_TO_LIST(ProgramName) oC_AssignErrorCode(&errorCode , oC_ProgramMan_AddProgram(&ProgramName##Registration));
93  CFG_PROGRAMS_LIST(ADD_PROGRAM_TO_LIST,DONT_ADD)
94 #undef ADD_PROGRAM_TO_LIST
95 #undef DONT_ADD
96 #define GET_PROGRAM_REGISTRATION(ProgramName) ProgramName##Registration
97 #define SET_DEFAULT_PROGRAM(ProgramName) oC_AssignErrorCode(&errorCode,oC_ProgramMan_SetDefaultProgram(&GET_PROGRAM_REGISTRATION(ProgramName)))
98  SET_DEFAULT_PROGRAM(CFG_PROGRAM_DEFAULT);
99 #undef SET_DEFAULT_PROGRAM
100 #undef GET_PROGRAM_REGISTRATION
101  }
102  else
103  {
104  errorCode = oC_ErrorCode_AllocationError;
105  }
106  }
107 
108  return errorCode;
109 }
110 
111 //==========================================================================================================================================
112 //==========================================================================================================================================
113 oC_ErrorCode_t oC_ProgramMan_TurnOff( void )
114 {
115  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
116 
117  if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet))
118  {
119  ModuleEnabledFlag = false;
120 
121  if(oC_List_Delete(Programs,AllocationFlags_CanWaitForever))
122  {
123  errorCode = oC_ErrorCode_None;
124  }
125  else
126  {
127  errorCode = oC_ErrorCode_ReleaseError;
128  }
129 
130  }
131 
132  return errorCode;
133 }
134 //==========================================================================================================================================
135 //==========================================================================================================================================
136 oC_ErrorCode_t oC_ProgramMan_AddProgram( oC_Program_t Program )
137 {
138  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
139 
140  if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet))
141  {
142  bool added = oC_List_PushBack(Programs,Program,&Allocator);
143 
144  if(added)
145  {
146  errorCode = oC_ErrorCode_None;
147  }
148  else
149  {
150  errorCode = oC_ErrorCode_CannotAddObjectToList;
151  }
152  }
153 
154  return errorCode;
155 }
156 
157 //==========================================================================================================================================
158 //==========================================================================================================================================
159 oC_ErrorCode_t oC_ProgramMan_RemoveProgram( oC_Program_t Program )
160 {
161  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
162 
163  if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet))
164  {
165  bool contains = oC_List_Contains(Programs,Program);
166 
167  if(contains)
168  {
169  bool removed = oC_List_RemoveAll(Programs,Program);
170 
171  if(removed)
172  {
173  errorCode = oC_ErrorCode_None;
174  }
175  else
176  {
177  errorCode = oC_ErrorCode_CannotRemoveObjectFromList;
178  }
179  }
180  else
181  {
182  errorCode = oC_ErrorCode_ObjectNotFoundOnList;
183  }
184  }
185 
186  return errorCode;
187 }
188 //==========================================================================================================================================
189 //==========================================================================================================================================
190 oC_ErrorCode_t oC_ProgramMan_SetDefaultProgram( oC_Program_t Program )
191 {
192  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
193 
194  if(
195  oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet) &&
196  oC_AssignErrorCodeIfFalse(&errorCode , oC_Program_IsCorrect(Program) , oC_ErrorCode_ObjectNotCorrect)
197  )
198  {
199  DefaultProgram = Program;
200  errorCode = oC_ErrorCode_None;
201  }
202 
203  return errorCode;
204 }
205 //==========================================================================================================================================
206 //==========================================================================================================================================
207 oC_List(oC_Program_t) oC_ProgramMan_GetList( void )
208 {
209  oC_List(oC_Program_t) programs = NULL;
210 
212  {
213  programs = Programs;
214  }
215 
216  return programs;
217 }
218 //==========================================================================================================================================
219 //==========================================================================================================================================
220 oC_Program_t oC_ProgramMan_GetDefaultProgram( void )
221 {
222  oC_Program_t program = NULL;
223 
225  {
226  program = DefaultProgram;
227  }
228 
229  return program;
230 }
231 //==========================================================================================================================================
232 //==========================================================================================================================================
233 oC_Program_t oC_ProgramMan_GetProgram( const char * Name )
234 {
235  oC_Program_t program = NULL;
236 
238  {
239  oC_List_Foreach(Programs,prog)
240  {
241  if(strcmp(oC_Program_GetName(prog),Name) == 0)
242  {
243  program = prog;
244  break;
245  }
246  }
247  }
248 
249  return program;
250 }
251 
252 //==========================================================================================================================================
253 //==========================================================================================================================================
254 oC_ErrorCode_t oC_ProgramMan_RunDefaultProgram( oC_User_t User )
255 {
256  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
257 
258  if(
259  oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet) &&
260  oC_AssignErrorCodeIfFalse(&errorCode , oC_Program_IsCorrect(DefaultProgram) , oC_ErrorCode_DefaultProgramNotSet) &&
261  oC_AssignErrorCodeIfFalse(&errorCode , oC_User_IsCorrect(User) , oC_ErrorCode_WrongUser)
262  )
263  {
264  oC_Process_t process = oC_Program_NewProcess(DefaultProgram,User);
265 
266  if(oC_AssignErrorCodeIfFalse(&errorCode , oC_Process_IsCorrect(process) , oC_ErrorCode_CannotCreateProcess))
267  {
268  if(
269  oC_AssignErrorCode(&errorCode , oC_Process_SetPriority ( process , oC_Process_Priority_DefaultProcess ))
270  && oC_AssignErrorCode(&errorCode , oC_ProcessMan_AddProcess( process ))
271  )
272  {
273  const char * name = oC_Program_GetName(DefaultProgram);
274  errorCode = oC_Program_Exec(DefaultProgram,process,1,&name,NULL);
275  }
276  else
277  {
278  if(oC_Process_Delete(&process))
279  {
280  oC_SaveError("RunDefaultProgram: cannot delete process" , oC_ErrorCode_ReleaseError);
281  }
282  }
283  }
284  }
285 
286 
287  return errorCode;
288 }
289 
290 //==========================================================================================================================================
291 //==========================================================================================================================================
292 uint32_t oC_ProgramMan_RerunDefualtIfNotRun( oC_User_t User )
293 {
294  static uint32_t rerunNumber = 0;
295  oC_Program_t defaultProgram = oC_ProgramMan_GetDefaultProgram();
296 
297  if(isaddresscorrect(defaultProgram))
298  {
299  oC_Process_t defaultProcess = oC_ProcessMan_GetProcess(oC_Program_GetName(defaultProgram));
300  oC_Process_State_t state = oC_Process_GetState(defaultProcess);
301 
302  if(state == oC_Process_State_Invalid || state == oC_Process_State_Killed || state == oC_Process_State_Zombie)
303  {
304  oC_ErrorCode_t errorCode = oC_ProgramMan_RunDefaultProgram(User);
305 
306  if(oC_ErrorOccur(errorCode))
307  {
308  kdebuglog(oC_LogType_Error , "rerundefaultprogram: Cannot run default program %s" , oC_Program_GetName(defaultProgram));
309  oC_SaveError("programman: rerun of default program failed!: " , errorCode);
310  }
311  else
312  {
313  rerunNumber++;
314  }
315  }
316 
317  }
318  else
319  {
320  oC_SaveError("ProgramMan: Default program is not correct!" , oC_ErrorCode_WrongAddress);
321  kdebuglog(oC_LogType_Error , "defaultprogram: the pointer of default program is not correct (0x%x)!" , defaultProgram);
322  }
323 
324  return rerunNumber;
325 }
326 
327 #undef _________________________________________INTERFACE_FUNCTIONS_SECTION_______________________________________________________________
328 
329 
FILE__DESCRIPTION
static bool ModuleEnabledFlag
Definition: oc_memman.c:211
const char * Name
Definition: oc_stdlib.h:161
identifier for allocations
Definition: oc_stdlib.h:159
The file with interface for process manager.
Definition: oc_user.c:43
The file with interface for program manager.
static const oC_Allocator_t Allocator
Definition: oc_eth.c:152
#define NULL
pointer to a zero
Definition: oc_null.h:37