add APP
This commit is contained in:
		
							
								
								
									
										216
									
								
								03-software/ch/kb28/blinkerProject/app/app.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								03-software/ch/kb28/blinkerProject/app/app.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | ||||
| /**  | ||||
|  * @author R<>mi Heredero (remi@heredero.ch) | ||||
|  * @version 1.0.0 | ||||
|  * @date 2023-06-15 | ||||
|  */ | ||||
|  | ||||
| #include "app.h" | ||||
| #include "factory/factory.h" | ||||
| #include "../middleware/blinker.h" | ||||
| #include "../middleware/clickHandler.h" | ||||
|  | ||||
| void clickL(APP* me){ | ||||
|     POST(me, &APP_processEvent, evAPclickL, 0, 0); | ||||
| } | ||||
| void clickLn(APP* me){ | ||||
|     POST(me, &APP_processEvent, evAPclickLn, 0, 0); | ||||
| } | ||||
| void clickR(APP* me){ | ||||
|     POST(me, &APP_processEvent, evAPclickR, 0, 0); | ||||
| } | ||||
| void clickRn(APP* me){ | ||||
|     POST(me, &APP_processEvent, evAPclickRn, 0, 0); | ||||
| } | ||||
| void endL(APP* me){ | ||||
|     POST(me, &APP_processEvent, evAPendL, 0, 0); | ||||
| } | ||||
| void endR(APP* me){ | ||||
|     POST(me, &APP_processEvent, evAPendR, 0, 0); | ||||
| } | ||||
| void longClick(APP* me){ | ||||
|     POST(me, &APP_processEvent, evAPlongClick, 0, 0); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void APP_init(APP* me){ | ||||
|      | ||||
|     me->state = STAP_INIT; | ||||
|      | ||||
|     CLICK_HANDLER_setSingleClickCallback(ch1(), CLICK_HANDLER_defineCallBack(&clickL, me)); | ||||
|     CLICK_HANDLER_setSingleClickCallback(ch3(), CLICK_HANDLER_defineCallBack(&clickR, me)); | ||||
|      | ||||
|     CLICK_HANDLER_setDoubleClickCallback(ch1(), CLICK_HANDLER_defineCallBack(&clickLn, me)); | ||||
|     CLICK_HANDLER_setDoubleClickCallback(ch3(), CLICK_HANDLER_defineCallBack(&clickRn, me)); | ||||
|      | ||||
|     CLICK_HANDLER_setLongClickCallback(ch1(), CLICK_HANDLER_defineCallBack(&longClick, me)); | ||||
|     CLICK_HANDLER_setLongClickCallback(ch3(), CLICK_HANDLER_defineCallBack(&longClick, me)); | ||||
|      | ||||
|     BLINKER_setFinished(blL(), BLINKER_defineCallBack(&endL, me)); | ||||
|     BLINKER_setFinished(blR(), BLINKER_defineCallBack(&endR, me)); | ||||
|      | ||||
| } | ||||
|  | ||||
| void APP_startBehaviour(APP* me){ | ||||
|     POST(me, &APP_processEvent, evAPinit, 0, 0); | ||||
| } | ||||
|  | ||||
| bool APP_processEvent(Event* ev){ | ||||
|     bool processed = false; | ||||
|     APP* me = (APP*) Event_getTarget(ev); | ||||
|     APP_STATES oldState = me->state; | ||||
|     evIDT evid = Event_getId(ev); | ||||
|      | ||||
|     switch(me->state) { // In state | ||||
|         case STAP_INIT: | ||||
|             if(evid == evAPinit) { | ||||
|                 me->state = STAP_WAIT; | ||||
|             } | ||||
|             break; | ||||
|              | ||||
|         case STAP_WAIT: | ||||
|             if(evid == evAPclickL) { | ||||
|                 me->state = STAP_BLINKER_L; | ||||
|                 BLINKER_blink(blL()); | ||||
|             } | ||||
|             if(evid == evAPclickLn) { | ||||
|                 me->state = STAP_BLINKER_L; | ||||
|                 BLINKER_blinkN(blL()); | ||||
|             } | ||||
|             if(evid == evAPclickR) { | ||||
|                 me->state = STAP_BLINKER_R; | ||||
|                 BLINKER_blink(blR()); | ||||
|             } | ||||
|             if(evid == evAPclickRn) { | ||||
|                 me->state = STAP_BLINKER_R; | ||||
|                 BLINKER_blinkN(blR()); | ||||
|             } | ||||
|             if(evid == evAPlongClick) { | ||||
|                 me->state = STAP_BLINKER_W; | ||||
|                 BLINKER_blink(blB()); | ||||
|             } | ||||
|             break; | ||||
|              | ||||
|         case STAP_BLINKER_L: | ||||
|             if(evid == evAPclickR){ | ||||
|                 me->state = STAP_BLINKER_LR; | ||||
|                 BLINKER_blink(blR()); | ||||
|             } | ||||
|             if(evid == evAPclickRn){ | ||||
|                 me->state = STAP_BLINKER_LR; | ||||
|                 BLINKER_blinkN(blR()); | ||||
|             } | ||||
|             if(evid == evAPclickL) { | ||||
|                 me->state = STAP_WAIT; | ||||
|                 BLINKER_endBlink(blL()); | ||||
|             } | ||||
|             if(evid == evAPendL) { | ||||
|                 me->state = STAP_WAIT; | ||||
|             } | ||||
|             if(evid == evAPlongClick) { | ||||
|                 me->state = STAP_BLINKER_W; | ||||
|                 BLINKER_endBlink(blL()); | ||||
|                 BLINKER_blink(blB()); | ||||
|             } | ||||
|             break; | ||||
|              | ||||
|         case STAP_BLINKER_R: | ||||
|             if(evid == evAPclickL){ | ||||
|                 me->state = STAP_BLINKER_LR; | ||||
|                 BLINKER_blink(blL()); | ||||
|             } | ||||
|             if(evid == evAPclickLn){ | ||||
|                 me->state = STAP_BLINKER_LR; | ||||
|                 BLINKER_blinkN(blL()); | ||||
|             } | ||||
|             if(evid == evAPclickR) { | ||||
|                 me->state = STAP_WAIT; | ||||
|                 BLINKER_endBlink(blR()); | ||||
|             } | ||||
|             if(evid == evAPendR) { | ||||
|                 me->state = STAP_WAIT; | ||||
|             } | ||||
|             if(evid == evAPlongClick) { | ||||
|                 me->state = STAP_BLINKER_W; | ||||
|                 BLINKER_endBlink(blR()); | ||||
|                 BLINKER_blink(blB()); | ||||
|             } | ||||
|             break; | ||||
|              | ||||
|         case STAP_BLINKER_LR: | ||||
|             if(evid == evAPclickR) { | ||||
|                 me->state = STAP_BLINKER_L; | ||||
|                 BLINKER_endBlink(blR()); | ||||
|             } | ||||
|             if(evid == evAPendR) { | ||||
|                 me->state = STAP_BLINKER_L; | ||||
|             } | ||||
|             if(evid == evAPclickL) { | ||||
|                 me->state = STAP_BLINKER_R; | ||||
|                 BLINKER_endBlink(blL()); | ||||
|             } | ||||
|             if(evid == evAPendL) { | ||||
|                 me->state = STAP_BLINKER_R; | ||||
|             } | ||||
|             if(evid == evAPlongClick) { | ||||
|                 me->state = STAP_BLINKER_W; | ||||
|                 BLINKER_endBlink(blL()); | ||||
|                 BLINKER_endBlink(blR()); | ||||
|                 BLINKER_blink(blB()); | ||||
|             } | ||||
|             break; | ||||
|              | ||||
|         case STAP_BLINKER_W: | ||||
|             if(evid == evAPlongClick){ | ||||
|                 me->state = STAP_WAIT; | ||||
|                 BLINKER_endBlink(blB()); | ||||
|             } | ||||
|             break; | ||||
|              | ||||
|     } | ||||
|      | ||||
|     if(oldState != me->state) { | ||||
|         switch(oldState) { // on exit | ||||
|             case STAP_INIT: | ||||
|                 break; | ||||
|                  | ||||
|             case STAP_WAIT: | ||||
|                 break; | ||||
|                  | ||||
|             case STAP_BLINKER_L: | ||||
|                 break; | ||||
|                  | ||||
|             case STAP_BLINKER_R: | ||||
|                 break; | ||||
|                  | ||||
|             case STAP_BLINKER_LR: | ||||
|                 break; | ||||
|                  | ||||
|             case STAP_BLINKER_W: | ||||
|                 break; | ||||
|         } | ||||
|          | ||||
|         switch(me->state) { // on entry | ||||
|             case STAP_INIT: | ||||
|                 break; | ||||
|                  | ||||
|             case STAP_WAIT: | ||||
|                 break; | ||||
|                  | ||||
|             case STAP_BLINKER_L: | ||||
|                 break; | ||||
|                  | ||||
|             case STAP_BLINKER_R: | ||||
|                 break; | ||||
|                  | ||||
|             case STAP_BLINKER_LR: | ||||
|                 break; | ||||
|                  | ||||
|             case STAP_BLINKER_W: | ||||
|                 break; | ||||
|                  | ||||
|         } | ||||
|         processed = true; | ||||
|     } | ||||
|     return processed; | ||||
| } | ||||
							
								
								
									
										40
									
								
								03-software/ch/kb28/blinkerProject/app/app.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								03-software/ch/kb28/blinkerProject/app/app.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| /** | ||||
|  * @author R<>mi Heredero (remi@heredero.ch) | ||||
|  * @version 1.0.0 | ||||
|  * @date 2023-06-17 | ||||
|  */ | ||||
| #ifndef APP_H | ||||
| #define	APP_H | ||||
|  | ||||
| #include "../xf/xf.h" | ||||
|  | ||||
| typedef enum { | ||||
|     STAP_INIT, | ||||
|     STAP_WAIT, | ||||
|     STAP_BLINKER_L, | ||||
|     STAP_BLINKER_R, | ||||
|     STAP_BLINKER_LR, | ||||
|     STAP_BLINKER_W | ||||
| } APP_STATES; | ||||
|  | ||||
| typedef enum { | ||||
|     evAPinit = 150, | ||||
|     evAPclickL, | ||||
|     evAPclickLn, | ||||
|     evAPclickR, | ||||
|     evAPclickRn, | ||||
|     evAPendL, | ||||
|     evAPendR, | ||||
|     evAPlongClick | ||||
| } APP_EVENTS; | ||||
|  | ||||
| typedef struct { | ||||
|     APP_STATES state; // Actual state | ||||
| } APP; | ||||
|  | ||||
| void APP_init(APP* me); | ||||
| void APP_startBehaviour(APP* me); | ||||
| bool APP_processEvent(Event* ev); | ||||
|  | ||||
| #endif	/* APP_H */ | ||||
|  | ||||
| @@ -72,6 +72,10 @@ BLINKER* blB() { | ||||
|     return &theFactory.blB_; | ||||
| } | ||||
|  | ||||
| APP* app() { | ||||
|     return &theFactory.app_; | ||||
| } | ||||
|  | ||||
| //initialize all objects | ||||
| void Factory_init() { | ||||
|     LED_init(l1(), 1); | ||||
| @@ -113,6 +117,8 @@ void Factory_init() { | ||||
|     BLINKER_init(blR()); | ||||
|     BLINKER_init(blB()); | ||||
|      | ||||
|     APP_init(app()); | ||||
|      | ||||
| } | ||||
|  | ||||
| void warningBlink(void* on_){ | ||||
| @@ -130,7 +136,6 @@ void warningBlink(void* on_){ | ||||
|  | ||||
| //connect objects if required | ||||
| void Factory_build() { | ||||
|          | ||||
|      | ||||
|     BLINKER_setTurnOn(blL(), BLINKER_defineCallBack(&LED_on, l1())); | ||||
|     BLINKER_setTurnOff(blL(), BLINKER_defineCallBack(&LED_off, l1())); | ||||
| @@ -139,15 +144,6 @@ void Factory_build() { | ||||
|     BLINKER_setTurnOn(blB(), BLINKER_defineCallBack(&warningBlink, true)); | ||||
|     BLINKER_setTurnOff(blB(), BLINKER_defineCallBack(&warningBlink, false)); | ||||
|      | ||||
|     CLICK_HANDLER_setSingleClickCallback(ch1(), CLICK_HANDLER_defineCallBack(&BLINKER_toggle, blL())); | ||||
|     CLICK_HANDLER_setSingleClickCallback(ch3(), CLICK_HANDLER_defineCallBack(&BLINKER_toggle, blR())); | ||||
|      | ||||
|     CLICK_HANDLER_setDoubleClickCallback(ch1(), CLICK_HANDLER_defineCallBack(&BLINKER_blinkN, blL())); | ||||
|     CLICK_HANDLER_setDoubleClickCallback(ch3(), CLICK_HANDLER_defineCallBack(&BLINKER_blinkN, blR())); | ||||
|      | ||||
|     CLICK_HANDLER_setLongClickCallback(ch1(), CLICK_HANDLER_defineCallBack(&BLINKER_toggle, blB())); | ||||
|     CLICK_HANDLER_setLongClickCallback(ch3(), CLICK_HANDLER_defineCallBack(&BLINKER_toggle, blB())); | ||||
|      | ||||
| } | ||||
|  | ||||
| //start all state machines | ||||
| @@ -161,4 +157,5 @@ void Factory_start() { | ||||
|     BLINKER_starBehaviour(blL()); | ||||
|     BLINKER_starBehaviour(blR()); | ||||
|     BLINKER_starBehaviour(blB()); | ||||
|     APP_startBehaviour(app()); | ||||
| } | ||||
|   | ||||
| @@ -14,6 +14,7 @@ | ||||
| #include "../../board/button/button.h" | ||||
| #include "../../middleware/clickHandler.h" | ||||
| #include "../../middleware/blinker.h" | ||||
| #include "../app.h" | ||||
|  | ||||
| typedef struct { | ||||
|     LED l1_; | ||||
| @@ -35,6 +36,7 @@ typedef struct { | ||||
|     BLINKER blL_; | ||||
|     BLINKER blR_; | ||||
|     BLINKER blB_; | ||||
|     APP app_; | ||||
| } Factory; | ||||
|  | ||||
|  | ||||
| @@ -66,4 +68,6 @@ BLINKER* blL(); | ||||
| BLINKER* blR(); | ||||
| BLINKER* blB(); | ||||
|  | ||||
| APP* app(); | ||||
|  | ||||
| #endif | ||||
| @@ -37,6 +37,10 @@ void BLINKER_setTurnOff(BLINKER* me, blinkerCallBack callBack) { | ||||
|     me->turnOff = callBack; | ||||
| } | ||||
|  | ||||
| void BLINKER_setFinished(BLINKER* me, blinkerCallBack callBack){ | ||||
|     me->finished = callBack; | ||||
| } | ||||
|  | ||||
| void BLINKER_defineNblink(BLINKER* me, uint8_t n){ | ||||
|     me->nBlink = n; | ||||
| } | ||||
| @@ -101,6 +105,7 @@ bool BLINKER_processEvent(Event* ev) { | ||||
|             if(evid == evBLtimer) { | ||||
|                 if(me->remainBlinks == 0) { | ||||
|                     me->state = STBL_WAIT; | ||||
|                     if(me->finished.fCallBack != NULL) me->finished.fCallBack(me->finished.param); | ||||
|                 } else { | ||||
|                     me->state = STBL_ON; | ||||
|                     POST(me, &BLINKER_processEvent, evBLtimer, me->tON, 0); | ||||
| @@ -111,7 +116,7 @@ bool BLINKER_processEvent(Event* ev) { | ||||
|     } | ||||
|      | ||||
|     if(oldState != me->state) { | ||||
|         switch(me->state) { | ||||
|         switch(me->state) { // on entry | ||||
|             case STBL_INIT: | ||||
|                 break; | ||||
|  | ||||
| @@ -126,7 +131,9 @@ bool BLINKER_processEvent(Event* ev) { | ||||
|                 if(me->turnOff.fCallBack != NULL) me->turnOff.fCallBack(me->turnOff.param); | ||||
|                 break; | ||||
|         } | ||||
|         processed = true; | ||||
|     } | ||||
|     return processed; | ||||
| } | ||||
|  | ||||
| void BLINKER_endBlink(BLINKER* me) { | ||||
| @@ -145,5 +152,4 @@ void BLINKER_toggle(BLINKER* me){ | ||||
|             BLINKER_endBlink(me); | ||||
|             break; | ||||
|     } | ||||
|     me->toggleRemainBlinks = me->remainBlinks; | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /** | ||||
|  * @author R<>mi Heredero (remi@heredero.ch) | ||||
|  * @version. 1.0.0 | ||||
|  * @version 1.0.0 | ||||
|  * @date 2023-06-15 | ||||
|  */ | ||||
|  | ||||
| @@ -39,6 +39,7 @@ typedef struct { | ||||
|     uint8_t remainBlinks; // Actual remain blink | ||||
|     blinkerCallBack turnOn; // Callback for turnOn | ||||
|     blinkerCallBack turnOff; // Calbback for turnOff | ||||
|     blinkerCallBack finished; // Callback for finish n blink | ||||
| }BLINKER; | ||||
|  | ||||
| /** | ||||
| @@ -75,6 +76,13 @@ void BLINKER_setTurnOn(BLINKER* me, blinkerCallBack callBack); | ||||
|  */ | ||||
| void BLINKER_setTurnOff(BLINKER* me, blinkerCallBack callBack); | ||||
|  | ||||
| /** | ||||
|  * Set callback event functions for when the blinker has blink n times | ||||
|  * @param me the blinker itseld | ||||
|  * @param callBack callBack function when the blinker has blink n times | ||||
|  */ | ||||
| void BLINKER_setFinished(BLINKER* me, blinkerCallBack callBack); | ||||
|  | ||||
| /** | ||||
|  * define number of time the Blinker have to blink | ||||
|  * @param me the blinker itself | ||||
|   | ||||
| @@ -147,5 +147,7 @@ bool CLICK_HANDLER_processEvent(Event* ev) { | ||||
|             case STCH_DOUBLE_CLICK: | ||||
|                 break; | ||||
|         } | ||||
|         processed = true; | ||||
|     } | ||||
|     return processed; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user