add clickHandler
This commit is contained in:
		| @@ -47,6 +47,16 @@ BUTTON* b3() { | ||||
|     return &theFactory.b3_; | ||||
| } | ||||
|  | ||||
| CLICK_HANDLER* ch1() { | ||||
|     return &theFactory.ch1_; | ||||
| } | ||||
| CLICK_HANDLER* ch2() { | ||||
|     return &theFactory.ch2_; | ||||
| } | ||||
| CLICK_HANDLER* ch3() { | ||||
|     return &theFactory.ch3_; | ||||
| } | ||||
|  | ||||
|  | ||||
| LEDBlinker* lb() { | ||||
|     return &theFactory.lb_; | ||||
| @@ -69,6 +79,10 @@ void Factory_init() { | ||||
|     BUTTON_init(b2(), 2); | ||||
|     BUTTON_init(b3(), 3); | ||||
|      | ||||
|     CLICK_HANDLER_init(ch1(), b1()); | ||||
|     CLICK_HANDLER_init(ch2(), b2()); | ||||
|     CLICK_HANDLER_init(ch3(), b3()); | ||||
|      | ||||
|      | ||||
|     LED_initHW(l1()); | ||||
|     LED_initHW(l2()); | ||||
| @@ -86,30 +100,29 @@ void Factory_init() { | ||||
|     BUTTON_initHW(b3()); | ||||
| } | ||||
|  | ||||
| //typedef void (*fButtonCallback)(void*); | ||||
| buttonCallBack myFunction; | ||||
|  | ||||
| void lON(void * l){ | ||||
|     LED* l_ = (LED*)l; | ||||
|     LED_on(l_); | ||||
| } | ||||
|  | ||||
|  | ||||
| void lOFF(void* l) { | ||||
|     LED* l_ = (LED*)l; | ||||
|     LED_off(l_); | ||||
| } | ||||
|  | ||||
|  | ||||
| //connect objects if required | ||||
| void Factory_build() { | ||||
|     BUTTON_setEventFunctions(b1(), BUTTON_defineCallBack(&lON, l1()), BUTTON_defineCallBack(NULL, NULL)); | ||||
|     BUTTON_setEventFunctions(b3(), BUTTON_defineCallBack(&lOFF, l1()), BUTTON_defineCallBack(NULL, NULL)); | ||||
|     //BUTTON_setEventFunctions(b1(), BUTTON_defineCallBack(&LED_on, l1()), BUTTON_defineCallBack(NULL, NULL)); | ||||
|     //BUTTON_setEventFunctions(b3(), BUTTON_defineCallBack(&LED_off, l1()), BUTTON_defineCallBack(NULL, NULL)); | ||||
|      | ||||
|      | ||||
|     CLICK_HANDLER_setSingleClickCallback(ch1(), CLICK_HANDLER_defineCallBack(&LED_on, l1())); | ||||
|     CLICK_HANDLER_setSingleClickCallback(ch3(), CLICK_HANDLER_defineCallBack(&LED_on, l3())); | ||||
|      | ||||
|     CLICK_HANDLER_setDoubleClickCallback(ch1(), CLICK_HANDLER_defineCallBack(&LED_off, l1())); | ||||
|     CLICK_HANDLER_setDoubleClickCallback(ch3(), CLICK_HANDLER_defineCallBack(&LED_off, l3())); | ||||
|      | ||||
|     CLICK_HANDLER_setLongClickCallback(ch1(), CLICK_HANDLER_defineCallBack(&LED_on, l2())); | ||||
|     CLICK_HANDLER_setLongClickCallback(ch3(), CLICK_HANDLER_defineCallBack(&LED_off, l2())); | ||||
| } | ||||
|  | ||||
| //start all state machines | ||||
| void Factory_start() { | ||||
|     //LEDBlinker_startBehaviour(lb()); | ||||
|     BUTTON_startBehaviour(b1()); | ||||
|     BUTTON_startBehaviour(b2()); | ||||
|     BUTTON_startBehaviour(b3()); | ||||
|     CLICK_HANDLER_startBehaviour(ch1()); | ||||
|     CLICK_HANDLER_startBehaviour(ch2()); | ||||
|     CLICK_HANDLER_startBehaviour(ch3()); | ||||
| } | ||||
|   | ||||
| @@ -10,8 +10,7 @@ | ||||
| #include "../../board/led/led.h" | ||||
| #include "../../board/button/button.h" | ||||
| #include "../ledblinker.h" | ||||
| #define LID 1 | ||||
|  | ||||
| #include "../../middleware/clickHandler.h" | ||||
|  | ||||
| typedef struct { | ||||
|     LED l1_; | ||||
| @@ -27,6 +26,9 @@ typedef struct { | ||||
|     BUTTON b1_; | ||||
|     BUTTON b2_; | ||||
|     BUTTON b3_; | ||||
|     CLICK_HANDLER ch1_; | ||||
|     CLICK_HANDLER ch2_; | ||||
|     CLICK_HANDLER ch3_; | ||||
|      | ||||
|     LEDBlinker lb_; | ||||
| } Factory; | ||||
| @@ -52,6 +54,10 @@ BUTTON* b1(); | ||||
| BUTTON* b2(); | ||||
| BUTTON* b3(); | ||||
|  | ||||
| CLICK_HANDLER* ch1(); | ||||
| CLICK_HANDLER* ch2(); | ||||
| CLICK_HANDLER* ch3(); | ||||
|  | ||||
| LEDBlinker* lb(); | ||||
|  | ||||
| #endif | ||||
| @@ -1,8 +1,8 @@ | ||||
| /** | ||||
|  * @file button.c | ||||
|  * @author R<>mi Heredero (remi@heredero.ch) | ||||
|  * @version 0.1 | ||||
|  * @date 2023-06-06 | ||||
|  * @version 1 | ||||
|  * @date 2023-06-13 | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| /** | ||||
|  * @file button.h | ||||
|  * @author R<>mi Heredero (remi@heredero.ch) | ||||
|  * @version 0.1 | ||||
|  * @date 2023-06-06 | ||||
|  * @version 1 | ||||
|  * @date 2023-06-13 | ||||
|  *  | ||||
|  */ | ||||
| #ifndef BUTTON_H | ||||
| @@ -30,13 +30,33 @@ typedef struct { | ||||
|     buttonCallBack release; | ||||
| } BUTTON; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * @brief Initialize the button | ||||
|  *  | ||||
|  * @param me The object to initialize | ||||
|  * @param id The id of the button | ||||
|  */ | ||||
| void BUTTON_init(BUTTON* me, uint8_t id); | ||||
|  | ||||
| /** | ||||
|  * @brief Initialize the hardware of the button | ||||
|  *  | ||||
|  * @param me The object to initialize | ||||
|  */ | ||||
| void BUTTON_initHW(BUTTON* me); | ||||
|  | ||||
| /** | ||||
|  * @brief Check if the button is pressed | ||||
|  * The function returns true if the button is pressed, false otherwise | ||||
|  *  | ||||
|  * @param me The object to check | ||||
|  * @return true if the button is pressed | ||||
|  * @return false if the button is not pressed | ||||
|  */ | ||||
| void BUTTON_setEventFunctions(BUTTON* me, buttonCallBack fPress, buttonCallBack release); | ||||
| bool BUTTON_isPressed(BUTTON* me); | ||||
| void BUTTON_startBehaviour(BUTTON* me); | ||||
| bool BUTTON_processEvent(Event* ev); | ||||
| void BUTTON_setEventFunctions(BUTTON* me, buttonCallBack fPress, buttonCallBack release); | ||||
| buttonCallBack BUTTON_defineCallBack(fButtonCallback f, void* param); | ||||
|  | ||||
| #endif	/* BUTTON_H */ | ||||
| @@ -1,8 +1,7 @@ | ||||
| #include "led.h" | ||||
| #include "../../mcc_generated_files/pin_manager.h" | ||||
|  | ||||
| void LED_init(LED* me, uint8_t id) | ||||
| { | ||||
| void LED_init(LED* me, uint8_t id) { | ||||
|     me->id = id; | ||||
| } | ||||
|  | ||||
| @@ -10,15 +9,13 @@ void LED_init(LED* me, uint8_t id) | ||||
|  * @brief Initialize the Driver | ||||
|  *  | ||||
|  */ | ||||
| void LED_initHW(LED* me) | ||||
| { | ||||
| void LED_initHW(LED* me) { | ||||
|     LED_off(me); | ||||
| } | ||||
|  | ||||
| void LED_on(LED* me) | ||||
| { | ||||
|     switch (me->id) | ||||
|     { | ||||
| void LED_on(void* me) { | ||||
|     LED* l = (LED*) me; | ||||
|     switch (l->id) { | ||||
|         case 1: | ||||
|             OUTPUT1_SetHigh(); | ||||
|         break; | ||||
| @@ -53,10 +50,9 @@ void LED_on(LED* me) | ||||
|        | ||||
| } | ||||
|  | ||||
| void LED_off(LED* me) | ||||
| { | ||||
|     switch (me->id) | ||||
|     { | ||||
| void LED_off(void* me) { | ||||
|     LED* l = (LED*) me; | ||||
|     switch (l->id) { | ||||
|         case 1: | ||||
|             OUTPUT1_SetLow(); | ||||
|         break; | ||||
|   | ||||
| @@ -19,8 +19,8 @@ typedef struct LED_ LED; | ||||
|  | ||||
| void LED_init(LED* me, uint8_t id); | ||||
| void LED_initHW(LED* me); | ||||
| void LED_on(LED* me); | ||||
| void LED_off(LED* me); | ||||
| void LED_on(void* me); | ||||
| void LED_off(void* me); | ||||
|  | ||||
| #endif	/* LED_H */ | ||||
|  | ||||
|   | ||||
							
								
								
									
										152
									
								
								03-software/ch/kb28/blinkerProject/middleware/clickHandler.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								03-software/ch/kb28/blinkerProject/middleware/clickHandler.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,152 @@ | ||||
| /** | ||||
|  * @file clickHandler.c | ||||
|  * @author R<>mi Heredero (remi@heredero.ch) | ||||
|  * @version 0.1 | ||||
|  * @date 2023-06-13 | ||||
|  */ | ||||
|  | ||||
| #include "clickHandler.h" | ||||
|  | ||||
| void CLICK_HANDLER_BUTTON_PRESS(CLICK_HANDLER* me){ | ||||
|     POST(me, &CLICK_HANDLER_processEvent, evCHpbPress, 0, 0); | ||||
| } | ||||
|  | ||||
| void CLICK_HANDLER_BUTTON_RELEASE(CLICK_HANDLER * me) { | ||||
|     POST(me, &CLICK_HANDLER_processEvent, evCHpbRelease, 0, 0); | ||||
| } | ||||
|  | ||||
| void CLICK_HANDLER_init(CLICK_HANDLER* me, BUTTON* b){ | ||||
|     me->button = b; | ||||
|     me->state = STCH_INIT; | ||||
|     me->longClick.fCallBack = NULL; | ||||
|     me->singleClick.fCallBack = NULL; | ||||
|     me->doubleClick.fCallBack = NULL; | ||||
|      | ||||
|     buttonCallBack pbPressCallBack; | ||||
|     pbPressCallBack.fCallBack = CLICK_HANDLER_BUTTON_PRESS; | ||||
|     pbPressCallBack.param = me; | ||||
|      | ||||
|     buttonCallBack pbReleaseCallBack; | ||||
|     pbReleaseCallBack.fCallBack = CLICK_HANDLER_BUTTON_RELEASE; | ||||
|     pbReleaseCallBack.param = me; | ||||
|      | ||||
|     BUTTON_setEventFunctions(b, pbPressCallBack, pbReleaseCallBack); | ||||
| } | ||||
|  | ||||
| void CLICK_HANDLER_startBehaviour(CLICK_HANDLER* me){ | ||||
|     POST(me, &CLICK_HANDLER_processEvent, evCHinit, 0, 0); | ||||
| } | ||||
|  | ||||
| clickHandlerCallBack CLICK_HANDLER_defineCallBack(fClickHandlerCallBack f, void* param) { | ||||
|     clickHandlerCallBack c; | ||||
|     c.fCallBack = f; | ||||
|     c.param = param; | ||||
|     return c; | ||||
| } | ||||
|  | ||||
| void CLICK_HANDLER_setLongClickCallback(CLICK_HANDLER* me, clickHandlerCallBack callBack) { | ||||
|     me->longClick = callBack; | ||||
| } | ||||
|  | ||||
| void CLICK_HANDLER_setSingleClickCallback(CLICK_HANDLER* me, clickHandlerCallBack callBack) { | ||||
|     me->singleClick = callBack; | ||||
| } | ||||
|  | ||||
| void CLICK_HANDLER_setDoubleClickCallback(CLICK_HANDLER* me, clickHandlerCallBack callBack) { | ||||
|     me->doubleClick = callBack; | ||||
| } | ||||
|  | ||||
| bool CLICK_HANDLER_processEvent(Event* ev) { | ||||
|     bool processed = false;  | ||||
|     CLICK_HANDLER* me = (CLICK_HANDLER*)Event_getTarget(ev); | ||||
|     CLICK_HANDLER_STATES oldState = me->state; | ||||
|     evIDT evid = Event_getId(ev); | ||||
|      | ||||
|     switch(me->state) { | ||||
|         case STCH_INIT: | ||||
|             if(evid == evCHinit) { | ||||
|                 me->state = STCH_WAIT; | ||||
|             } | ||||
|             break; | ||||
|              | ||||
|         case STCH_WAIT: | ||||
|              | ||||
|             if(evid == evCHpbPress) { | ||||
|                 me->state = STCH_LONG_CLICK; | ||||
|                 POST(me, &CLICK_HANDLER_processEvent, evCHtimer, CH_CLICK_TIMER, 0); | ||||
|             } | ||||
|              | ||||
|             break; | ||||
|              | ||||
|              | ||||
|         case STCH_LONG_CLICK:  | ||||
|              | ||||
|             if(evid == evCHpbRelease) { | ||||
|                 me->state = STCH_SINGLE_CLICK; | ||||
|             } | ||||
|              | ||||
|             if(evid == evCHtimer) { | ||||
|                 me->state = STCH_WAIT; | ||||
|                 if(me->longClick.fCallBack != NULL) { | ||||
|                     me->longClick.fCallBack(me->longClick.param); | ||||
|                 } | ||||
|             } | ||||
|              | ||||
|             break; | ||||
|              | ||||
|              | ||||
|         case STCH_SINGLE_CLICK: | ||||
|              | ||||
|             if(evid == evCHpbPress) { | ||||
|                 me->state = STCH_DOUBLE_CLICK; | ||||
|             } | ||||
|              | ||||
|             if(evid == evCHtimer) { | ||||
|                 me->state = STCH_WAIT; | ||||
|                 if(me->singleClick.fCallBack != NULL) { | ||||
|                     me->singleClick.fCallBack(me->singleClick.param); | ||||
|                 } | ||||
|             } | ||||
|              | ||||
|             break; | ||||
|              | ||||
|              | ||||
|         case STCH_DOUBLE_CLICK: | ||||
|              | ||||
|             if(evid == evCHpbRelease){ | ||||
|                 me->state = STCH_WAIT; | ||||
|                 if(me->doubleClick.fCallBack != NULL){ | ||||
|                     me->doubleClick.fCallBack(me->doubleClick.param); | ||||
|                 } | ||||
|             } | ||||
|              | ||||
|             if(evid == evCHtimer) { | ||||
|                 me->state = STCH_WAIT; | ||||
|                 if(me->doubleClick.fCallBack != NULL) { | ||||
|                     me->doubleClick.fCallBack(me->doubleClick.param); | ||||
|                 } | ||||
|             } | ||||
|              | ||||
|             break; | ||||
|              | ||||
|     } | ||||
|      | ||||
|     if(oldState != me->state) { | ||||
|         switch(oldState) { | ||||
|             case STCH_INIT:  | ||||
|                 break; | ||||
|                  | ||||
|             case STCH_WAIT: | ||||
|                 break; | ||||
|                  | ||||
|             case STCH_LONG_CLICK: | ||||
|                 break; | ||||
|                  | ||||
|             case STCH_SINGLE_CLICK: | ||||
|                 break; | ||||
|                  | ||||
|             case STCH_DOUBLE_CLICK: | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										55
									
								
								03-software/ch/kb28/blinkerProject/middleware/clickHandler.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								03-software/ch/kb28/blinkerProject/middleware/clickHandler.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| /** | ||||
|  * @file clickHandler.h | ||||
|  * @author R<>mi Heredero (remi@heredero.ch) | ||||
|  * @version 0.1 | ||||
|  * @date 2023-06-13 | ||||
|  */ | ||||
|  | ||||
| #ifndef CLICKHANDLER_H | ||||
| #define	CLICKHANDLER_H | ||||
|  | ||||
| #include "../xf/xf.h" | ||||
| #include "../board/button/button.h" | ||||
|  | ||||
| #define CH_CLICK_TIMER 250 | ||||
|  | ||||
| typedef enum { | ||||
|     STCH_INIT, | ||||
|     STCH_WAIT, | ||||
|     STCH_LONG_CLICK, | ||||
|     STCH_SINGLE_CLICK, | ||||
|     STCH_DOUBLE_CLICK | ||||
| } CLICK_HANDLER_STATES; | ||||
|  | ||||
| typedef enum { | ||||
|     evCHinit = 150, | ||||
|     evCHtimer, | ||||
|     evCHpbPress, | ||||
|     evCHpbRelease | ||||
| } CLICK_HANDLER_EVENTS; | ||||
|  | ||||
| typedef void (*fClickHandlerCallBack)(void*); | ||||
| typedef struct { | ||||
|     fClickHandlerCallBack fCallBack; | ||||
|     void* param; | ||||
| } clickHandlerCallBack; | ||||
|  | ||||
| typedef struct { | ||||
|     BUTTON* button; | ||||
|     CLICK_HANDLER_STATES state; | ||||
|     clickHandlerCallBack longClick; | ||||
|     clickHandlerCallBack singleClick; | ||||
|     clickHandlerCallBack doubleClick; | ||||
| }CLICK_HANDLER; | ||||
|  | ||||
| void CLICK_HANDLER_init(CLICK_HANDLER* me, BUTTON* b); | ||||
| clickHandlerCallBack CLICK_HANDLER_defineCallBack(fClickHandlerCallBack f, void* param); | ||||
| void CLICK_HANDLER_startBehaviour(CLICK_HANDLER* me); | ||||
| void CLICK_HANDLER_setLongClickCallback(CLICK_HANDLER* me, clickHandlerCallBack callBack); | ||||
| void CLICK_HANDLER_setSingleClickCallback(CLICK_HANDLER* me, clickHandlerCallBack callBack); | ||||
| void CLICK_HANDLER_setDoubleClickCallback(CLICK_HANDLER* me, clickHandlerCallBack callBack); | ||||
| bool CLICK_HANDLER_processEvent(Event* ev); | ||||
|  | ||||
|  | ||||
| #endif	/* CLICKHANDLER_H */ | ||||
|  | ||||
		Reference in New Issue
	
	Block a user