add alive_checker
This commit is contained in:
		
							
								
								
									
										176
									
								
								306-controller_interface.X/middleware/alive_checker.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								306-controller_interface.X/middleware/alive_checker.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| /** | ||||
|  * @author R<>mi Heredero | ||||
|  * @version 1.0.0 | ||||
|  * @date August 2023 | ||||
|  * @file alive_checker.c | ||||
|  */ | ||||
|  | ||||
| #include "alive_checker.h" | ||||
|  | ||||
| void ALIVE_CHECKER_init(ALIVE_CHECKER* me){ | ||||
|     me->state = STAC_INIT; | ||||
|     me->isAlive = false; | ||||
|     me->aliveTime = 10; | ||||
|     me->setup.f = NULL; | ||||
|     me->born.f = NULL; | ||||
|     me->wait.f = NULL; | ||||
|     me->dead.f = NULL; | ||||
| } | ||||
|  | ||||
| void ALIVE_CHECKER_startBehaviour(ALIVE_CHECKER* me){ | ||||
|     POST(me, &ALIVE_CHECKER_processEvent, evACinit, 0, 0); | ||||
| } | ||||
|  | ||||
| bool ALIVE_CHECKER_processEvent(Event* ev) { | ||||
|     bool processed = false; | ||||
|     ALIVE_CHECKER* me = (ALIVE_CHECKER*)Event_getTarget(ev); | ||||
|     ALIVE_CHECKER_STATES oldState = me->state; | ||||
|     evIDT evid = Event_getId(ev); | ||||
|     uint64_t data = Event_getData(ev); | ||||
|      | ||||
|     switch (me->state) {        // onState | ||||
|         case STAC_INIT: | ||||
|             if (ev->id == evACinit) { | ||||
|                 me->state = STAC_SETUP; | ||||
|             } | ||||
|             break; | ||||
|          | ||||
|         case STAC_SETUP: | ||||
|             if (ev->id = evACborn) { | ||||
|                 me->state = STAC_BORN; | ||||
|             } | ||||
|             break; | ||||
|          | ||||
|         case STAC_BORN: | ||||
|             if (ev->id = evACready) { | ||||
|                 me->state = STAC_WAIT; | ||||
|                 ALIVE_CHECKER_emitPoll(me, me->aliveTime*10, 0); | ||||
|             }  | ||||
|             break; | ||||
|          | ||||
|         case STAC_WAIT: | ||||
|             if (ev->id = evACpoll) { | ||||
|                 if (me->isAlive) { | ||||
|                     me->state = STAC_WAIT; | ||||
|                     ALIVE_CHECKER_emitPoll(me, me->aliveTime*10, 0); | ||||
|                 } else { | ||||
|                     me->state = STAC_DEAD; | ||||
|                 } | ||||
|             } | ||||
|             break; | ||||
|          | ||||
|         case STAC_DEAD: | ||||
|             if(ev->id = evACborn) { | ||||
|                 me->state = STAC_BORN; | ||||
|             } | ||||
|             break; | ||||
|     } | ||||
|  | ||||
|     if(oldState != me->state){ | ||||
|         switch (oldState) {     // onExit | ||||
|             case STAC_INIT: | ||||
|                 break; | ||||
|              | ||||
|             case STAC_SETUP: | ||||
|                 break; | ||||
|              | ||||
|             case STAC_BORN: | ||||
|                 break; | ||||
|              | ||||
|             case STAC_WAIT: | ||||
|                 break; | ||||
|              | ||||
|             case STAC_DEAD: | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         switch (me->state) {    // onEntry | ||||
|             case STAC_INIT: | ||||
|                 break; | ||||
|              | ||||
|             case STAC_SETUP: | ||||
|                 if (me->setup.f != NULL) { | ||||
|                     me->setup.f(me->setup.p); | ||||
|                 } | ||||
|                 break; | ||||
|              | ||||
|             case STAC_BORN: | ||||
|                 if (me->born.f != NULL) { | ||||
|                     me->born.f(me->born.p); | ||||
|                 } | ||||
|                 break; | ||||
|              | ||||
|             case STAC_WAIT: | ||||
|                 me->isAlive = false; | ||||
|                 if (me->wait.f != NULL) { | ||||
|                     me->wait.f(me->wait.p); | ||||
|                 } | ||||
|                 break; | ||||
|              | ||||
|             case STAC_DEAD: | ||||
|                 if (me->dead.f != NULL) { | ||||
|                     me->dead.f(me->dead.p); | ||||
|                 } | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         processed = true; | ||||
|     } | ||||
|     return processed; | ||||
| } | ||||
|  | ||||
| /************* | ||||
|  * Callbacks * | ||||
|  *************/ | ||||
|  | ||||
| void ALIVE_CHECKER_onSetup(ALIVE_CHECKER* me, ALIVE_CHECKER_CALLBACK_FUNCTION f, void* p) { | ||||
|     me->setup.f = f; | ||||
|     me->setup.p = p; | ||||
| } | ||||
|  | ||||
| void ALIVE_CHECKER_onBorn(ALIVE_CHECKER* me, ALIVE_CHECKER_CALLBACK_FUNCTION f, void* p) { | ||||
|     me->born.f = f; | ||||
|     me->born.p = p; | ||||
| } | ||||
|  | ||||
| void ALIVE_CHECKER_onWait(ALIVE_CHECKER* me, ALIVE_CHECKER_CALLBACK_FUNCTION f, void* p) { | ||||
|     me->wait.f = f; | ||||
|     me->wait.p = p; | ||||
| } | ||||
|  | ||||
| void ALIVE_CHECKER_onDead(ALIVE_CHECKER* me, ALIVE_CHECKER_CALLBACK_FUNCTION f, void* p) { | ||||
|     me->dead.f = f; | ||||
|     me->dead.p = p; | ||||
| } | ||||
|  | ||||
| /************ | ||||
|  * EMITTERS * | ||||
|  ************/ | ||||
|  | ||||
| void ALIVE_CHECKER_emitBorn(ALIVE_CHECKER* me, uint16_t t, int64_t data) { | ||||
|     POST(me, &ALIVE_CHECKER_processEvent, evACborn, t, data); | ||||
| } | ||||
|  | ||||
| void ALIVE_CHECKER_emitReady(ALIVE_CHECKER* me, uint16_t t, int64_t data) { | ||||
|     POST(me, &ALIVE_CHECKER_processEvent, evACready, t, data); | ||||
| } | ||||
|  | ||||
| void ALIVE_CHECKER_emitPoll(ALIVE_CHECKER* me, uint16_t t, int64_t data) { | ||||
|     POST(me, &ALIVE_CHECKER_processEvent, evACpoll, t, data); | ||||
| } | ||||
|  | ||||
| /*********** | ||||
|  * SETTERS * | ||||
|  ***********/ | ||||
|  | ||||
| void ALIVE_CHECKER_setAliveTime(ALIVE_CHECKER* me, uint8_t v) { | ||||
|     me->aliveTime = v; | ||||
| } | ||||
|  | ||||
| void ALIVE_CHECKER_setIsAlive(ALIVE_CHECKER* me, bool v) { | ||||
|     me->aliveTime = v; | ||||
| } | ||||
|  | ||||
| void ALIVE_CHECKER_ISALIVE(ALIVE_CHECKER* me) { | ||||
|     ALIVE_CHECKER_setIsAlive(me, true); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user