Compare commits
	
		
			2 Commits
		
	
	
		
			ab2c1cf05a
			...
			2dd13a3621
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 2dd13a3621 | |||
| 7dee82956d | 
| @@ -1,137 +0,0 @@ | |||||||
| /** |  | ||||||
|  * @author R<>mi Heredero (remi@heredero.ch) |  | ||||||
|  * @version. 1.0.0 |  | ||||||
|  * @date 2023-06-15 |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include "button.h" |  | ||||||
| #include "../src/mcc_generated_files/pin_manager.h" |  | ||||||
| #include "../src/app/factory.h" |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @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) { |  | ||||||
|     me->id = id; |  | ||||||
|     me->state = ST_PBINIT; |  | ||||||
|     me->press.fCallBack = NULL; |  | ||||||
|     me->release.fCallBack = NULL; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @brief Initialize the hardware of the button |  | ||||||
|  *  |  | ||||||
|  * @param me The object to initialize |  | ||||||
|  */ |  | ||||||
| void BUTTON_initHW(BUTTON* me) { |  | ||||||
|     switch (me->id) { |  | ||||||
|         case 1: |  | ||||||
|             INPUT1_SetDigitalInput(); |  | ||||||
|             break; |  | ||||||
|         case 2: |  | ||||||
|             INPUT2_SetDigitalInput(); |  | ||||||
|             break; |  | ||||||
|         case 3: |  | ||||||
|             INPUT3_SetDigitalInput(); |  | ||||||
|             break; |  | ||||||
|         default: |  | ||||||
|             break; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @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 |  | ||||||
|  */ |  | ||||||
| bool BUTTON_isPressed(BUTTON* me) { |  | ||||||
|     switch (me->id) { |  | ||||||
|         case 1: |  | ||||||
|             return INPUT1_GetValue(); |  | ||||||
|             break; |  | ||||||
|         case 2: |  | ||||||
|             return INPUT2_GetValue(); |  | ||||||
|             break; |  | ||||||
|         case 3: |  | ||||||
|             return INPUT3_GetValue(); |  | ||||||
|             break; |  | ||||||
|         default: |  | ||||||
|             return false; |  | ||||||
|             break; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void BUTTON_startBehaviour(BUTTON* me) { |  | ||||||
|     POST(me, &BUTTON_processEvent, evPBInit, 0, 0); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool BUTTON_processEvent(Event * ev) { |  | ||||||
|     bool processed = false; |  | ||||||
|     BUTTON* me = (BUTTON*)Event_getTarget(ev); |  | ||||||
|     BUTTON_STATES oldState = me->state; |  | ||||||
|     evIDT evid = Event_getId(ev); |  | ||||||
|      |  | ||||||
|     switch(me->state){ |  | ||||||
|         case ST_PBINIT: |  | ||||||
|             if (evid == evPBInit) { |  | ||||||
|                 POST(me, &BUTTON_processEvent, evPBPoll, 0, 0); |  | ||||||
|                 if(BUTTON_isPressed(me)) { |  | ||||||
|                     me->state = ST_PBPRESSED; |  | ||||||
|                 } else { |  | ||||||
|                     me->state = ST_PBRELEASED; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             break; |  | ||||||
|         case ST_PBRELEASED: |  | ||||||
|             if(evid == evPBPoll) { |  | ||||||
|                 POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0); |  | ||||||
|                 if(BUTTON_isPressed(me)) { |  | ||||||
|                     me->state = ST_PBPRESSED; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|              |  | ||||||
|             break; |  | ||||||
|         case ST_PBPRESSED: |  | ||||||
|             if(evid == evPBPoll) { |  | ||||||
|                 POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);                 |  | ||||||
|                 if(!BUTTON_isPressed(me)){ |  | ||||||
|                     me->state = ST_PBRELEASED; |  | ||||||
|                 } |  | ||||||
|                      |  | ||||||
|             } |  | ||||||
|             break; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     if(oldState != me->state) { |  | ||||||
|         switch(me->state){ |  | ||||||
|             case ST_PBINIT: |  | ||||||
|                 break; |  | ||||||
|             case ST_PBRELEASED: |  | ||||||
|                 if(me->release.fCallBack != NULL) me->release.fCallBack(me->release.param); |  | ||||||
|                 break; |  | ||||||
|             case ST_PBPRESSED: |  | ||||||
|                 if(me->press.fCallBack != NULL) me->press.fCallBack(me->press.param); |  | ||||||
|                 break; |  | ||||||
|         } |  | ||||||
|         processed = true; |  | ||||||
|     } |  | ||||||
|     return processed; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void BUTTON_setEventFunctions(BUTTON* me, buttonCallBack fPress, buttonCallBack fRelease) { |  | ||||||
|     me->press = fPress; |  | ||||||
|     me->release = fRelease; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| buttonCallBack BUTTON_defineCallBack(fButtonCallback f, void* param){ |  | ||||||
|     buttonCallBack c; |  | ||||||
|     c.fCallBack = f; |  | ||||||
|     c.param = param; |  | ||||||
|     return c; |  | ||||||
| } |  | ||||||
| @@ -1,97 +0,0 @@ | |||||||
| /** |  | ||||||
|  * @author R<>mi Heredero (remi@heredero.ch) |  | ||||||
|  * @version. 1.0.0 |  | ||||||
|  * @date 2023-06-15 |  | ||||||
|  */ |  | ||||||
| #ifndef BUTTON_H |  | ||||||
| #define BUTTON_H |  | ||||||
|  |  | ||||||
| #include <stdint.h> |  | ||||||
| #include <stdbool.h> |  | ||||||
| #include "../src/xf/xf.h" |  | ||||||
|  |  | ||||||
| #define PB_POLL_TIME 20 // Poll time for BUTTON |  | ||||||
|  |  | ||||||
| typedef enum { |  | ||||||
|     ST_PBINIT, |  | ||||||
|     ST_PBRELEASED, |  | ||||||
|     ST_PBPRESSED |  | ||||||
| }  BUTTON_STATES; |  | ||||||
|  |  | ||||||
| typedef enum { |  | ||||||
|     evPBInit=50, |  | ||||||
|     evPBPoll |  | ||||||
| } BUTTON_EVENTS; |  | ||||||
|  |  | ||||||
| // Calback function |  | ||||||
| typedef void (*fButtonCallback)(void*);  |  | ||||||
| typedef struct { |  | ||||||
|     fButtonCallback fCallBack; |  | ||||||
|     void* param; |  | ||||||
| } buttonCallBack; |  | ||||||
|  |  | ||||||
| typedef struct { |  | ||||||
|     uint8_t id; // Id of the button |  | ||||||
|     BUTTON_STATES state; // Actual state  |  | ||||||
|     buttonCallBack press; // Callback for the rising edge of the button |  | ||||||
|     buttonCallBack release;  // Callback for the falling edge of the button |  | ||||||
| } BUTTON; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @brief Initialize the button |  | ||||||
|  *  |  | ||||||
|  * @param me button itself |  | ||||||
|  * @param id The id of the button |  | ||||||
|  */ |  | ||||||
| void BUTTON_init(BUTTON* me, uint8_t id); |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @brief Initialize the hardware of the button |  | ||||||
|  *  |  | ||||||
|  * @param me button itself |  | ||||||
|  */ |  | ||||||
| void BUTTON_initHW(BUTTON* me); |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @brief Set both callback event functions |  | ||||||
|  *  |  | ||||||
|  * @param me button itself |  | ||||||
|  * @param fPress callback function when the button have a rising edge |  | ||||||
|  * @param release callback function whent the  have a falling edge |  | ||||||
|  */ |  | ||||||
| void BUTTON_setEventFunctions(BUTTON* me, buttonCallBack fPress, buttonCallBack release); |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @brief Check if the button is pressed |  | ||||||
|  * The function returns true if the button is pressed, false otherwise |  | ||||||
|  *  |  | ||||||
|  * @param me button itself |  | ||||||
|  * @return true if the button is pressed |  | ||||||
|  * @return false if the button is not pressed |  | ||||||
|  */ |  | ||||||
| bool BUTTON_isPressed(BUTTON* me); |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @biref Start state machine of the BUTTON |  | ||||||
|  *  |  | ||||||
|  * @param me the button itself |  | ||||||
|  */ |  | ||||||
| void BUTTON_startBehaviour(BUTTON* me); |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @brief State machine of the BUTTON |  | ||||||
|  *  |  | ||||||
|  * @param ev event to process on the state machine |  | ||||||
|  */ |  | ||||||
| bool BUTTON_processEvent(Event* ev); |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @brief Define a callback for BUTTON |  | ||||||
|  *  |  | ||||||
|  * @param f callback function |  | ||||||
|  * @param param callback parameter for the function |  | ||||||
|  * @return the callback struct |  | ||||||
|  */ |  | ||||||
| buttonCallBack BUTTON_defineCallBack(fButtonCallback f, void* param); |  | ||||||
|  |  | ||||||
| #endif	/* BUTTON_H */ |  | ||||||
							
								
								
									
										1
									
								
								generator
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								generator
									
									
									
									
									
										Submodule
									
								
							 Submodule generator added at a808b1a1fb
									
								
							| @@ -6,6 +6,7 @@ | |||||||
|                    projectFiles="true"> |                    projectFiles="true"> | ||||||
|       <logicalFolder name="app" displayName="app" projectFiles="true"> |       <logicalFolder name="app" displayName="app" projectFiles="true"> | ||||||
|         <itemPath>src/app/factory.h</itemPath> |         <itemPath>src/app/factory.h</itemPath> | ||||||
|  |         <itemPath>src/app/app.h</itemPath> | ||||||
|       </logicalFolder> |       </logicalFolder> | ||||||
|       <logicalFolder name="board" displayName="board" projectFiles="true"> |       <logicalFolder name="board" displayName="board" projectFiles="true"> | ||||||
|         <itemPath>src/board/led.h</itemPath> |         <itemPath>src/board/led.h</itemPath> | ||||||
| @@ -40,6 +41,7 @@ | |||||||
|       <logicalFolder name="app" displayName="app" projectFiles="true"> |       <logicalFolder name="app" displayName="app" projectFiles="true"> | ||||||
|         <itemPath>src/app/factory.c</itemPath> |         <itemPath>src/app/factory.c</itemPath> | ||||||
|         <itemPath>src/app/main.c</itemPath> |         <itemPath>src/app/main.c</itemPath> | ||||||
|  |         <itemPath>src/app/app.c</itemPath> | ||||||
|       </logicalFolder> |       </logicalFolder> | ||||||
|       <logicalFolder name="board" displayName="board" projectFiles="true"> |       <logicalFolder name="board" displayName="board" projectFiles="true"> | ||||||
|         <itemPath>src/board/led.c</itemPath> |         <itemPath>src/board/led.c</itemPath> | ||||||
| @@ -195,6 +197,9 @@ | |||||||
|         <property key="program-the-device-with-default-config-words" value="true"/> |         <property key="program-the-device-with-default-config-words" value="true"/> | ||||||
|         <property key="remove-unused-sections" value="true"/> |         <property key="remove-unused-sections" value="true"/> | ||||||
|       </HI-TECH-LINK> |       </HI-TECH-LINK> | ||||||
|  |       <PICkit3PlatformTool> | ||||||
|  |         <property key="firmware.download.all" value="false"/> | ||||||
|  |       </PICkit3PlatformTool> | ||||||
|       <XC8-CO> |       <XC8-CO> | ||||||
|         <property key="coverage-enable" value=""/> |         <property key="coverage-enable" value=""/> | ||||||
|         <property key="stack-guidance" value="false"/> |         <property key="stack-guidance" value="false"/> | ||||||
|   | |||||||
							
								
								
									
										216
									
								
								src/app/app.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								src/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.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
									
								
								src/app/app.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/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_; |     return &theFactory.blB_; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | APP* app() { | ||||||
|  |     return &theFactory.app_; | ||||||
|  | } | ||||||
|  |  | ||||||
| //initialize all objects | //initialize all objects | ||||||
| void Factory_init() { | void Factory_init() { | ||||||
|     LED_init(l1(), 1); |     LED_init(l1(), 1); | ||||||
| @@ -113,6 +117,7 @@ void Factory_init() { | |||||||
|     BLINKER_init(blR()); |     BLINKER_init(blR()); | ||||||
|     BLINKER_init(blB()); |     BLINKER_init(blB()); | ||||||
|  |  | ||||||
|  |     APP_init(app()); | ||||||
|      |      | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -152,4 +157,5 @@ void Factory_start() { | |||||||
|     BLINKER_starBehaviour(blL()); |     BLINKER_starBehaviour(blL()); | ||||||
|     BLINKER_starBehaviour(blR()); |     BLINKER_starBehaviour(blR()); | ||||||
|     BLINKER_starBehaviour(blB()); |     BLINKER_starBehaviour(blB()); | ||||||
|  |     APP_startBehaviour(app()); | ||||||
| } | } | ||||||
| @@ -14,6 +14,7 @@ | |||||||
| #include "../board/button.h" | #include "../board/button.h" | ||||||
| #include "../middleware/clickHandler.h" | #include "../middleware/clickHandler.h" | ||||||
| #include "../middleware/blinker.h" | #include "../middleware/blinker.h" | ||||||
|  | #include "app.h" | ||||||
|  |  | ||||||
| typedef struct { | typedef struct { | ||||||
|     LED l1_; |     LED l1_; | ||||||
| @@ -35,6 +36,7 @@ typedef struct { | |||||||
|     BLINKER blL_; |     BLINKER blL_; | ||||||
|     BLINKER blR_; |     BLINKER blR_; | ||||||
|     BLINKER blB_; |     BLINKER blB_; | ||||||
|  |     APP app_; | ||||||
| } Factory; | } Factory; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -66,5 +68,6 @@ BLINKER* blL(); | |||||||
| BLINKER* blR(); | BLINKER* blR(); | ||||||
| BLINKER* blB(); | BLINKER* blB(); | ||||||
|  |  | ||||||
|  | APP* app(); | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
| @@ -6,16 +6,13 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "button.h" | #include "button.h" | ||||||
| #include "../mcc_generated_files/pin_manager.h" |  | ||||||
| #include "../app/factory.h" |  | ||||||
| #include "led.h" |  | ||||||
|  |  | ||||||
| void BUTTON_init(BUTTON* me, uint8_t id) { | void BUTTON_init(BUTTON* me, uint8_t id){ | ||||||
|     me->id = id; |     me->id = id; | ||||||
|     me->state = STPB_INIT; |     me->state = STPB_INIT; | ||||||
|     me->poll_time = 20; |     me->pollTime = 20; | ||||||
|     me->press.f = NULL; |     me->released.f = NULL; | ||||||
|     me->release.f = NULL; |     me->pressed.f = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| void BUTTON_initHW(BUTTON* me) { | void BUTTON_initHW(BUTTON* me) { | ||||||
| @@ -64,8 +61,8 @@ bool BUTTON_processEvent(Event* ev) { | |||||||
|     switch (me->state) {        // onState |     switch (me->state) {        // onState | ||||||
|         case STPB_INIT: |         case STPB_INIT: | ||||||
|             if (ev->id == evPBinit) { |             if (ev->id == evPBinit) { | ||||||
|                 POST(me, &BUTTON_processEvent, evPBpoll, me->poll_time, 0); |                 BUTTON_emitPoll(me, me->pollTime); | ||||||
|                 if(BUTTON_isPressed(me)){ |                 if (BUTTON_isPressed(me)) { | ||||||
|                     me->state = STPB_PRESSED; |                     me->state = STPB_PRESSED; | ||||||
|                 } else { |                 } else { | ||||||
|                     me->state = STPB_RELEASED; |                     me->state = STPB_RELEASED; | ||||||
| @@ -75,8 +72,8 @@ bool BUTTON_processEvent(Event* ev) { | |||||||
|          |          | ||||||
|         case STPB_RELEASED: |         case STPB_RELEASED: | ||||||
|             if (ev->id == evPBpoll) { |             if (ev->id == evPBpoll) { | ||||||
|                 POST(me, &BUTTON_processEvent, evPBpoll, me->poll_time, 0); |                 BUTTON_emitPoll(me, me->pollTime); | ||||||
|                 if(BUTTON_isPressed(me)){ |                 if (BUTTON_isPressed(me)) { | ||||||
|                     me->state = STPB_PRESSED; |                     me->state = STPB_PRESSED; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -84,8 +81,8 @@ bool BUTTON_processEvent(Event* ev) { | |||||||
|          |          | ||||||
|         case STPB_PRESSED: |         case STPB_PRESSED: | ||||||
|             if (ev->id == evPBpoll) { |             if (ev->id == evPBpoll) { | ||||||
|                 POST(me, &BUTTON_processEvent, evPBpoll, me->poll_time, 0); |                 BUTTON_emitPoll(me, me->pollTime); | ||||||
|                 if(!BUTTON_isPressed(me)){ |                 if (!BUTTON_isPressed(me)) { | ||||||
|                     me->state = STPB_RELEASED; |                     me->state = STPB_RELEASED; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -109,14 +106,14 @@ bool BUTTON_processEvent(Event* ev) { | |||||||
|                 break; |                 break; | ||||||
|              |              | ||||||
|             case STPB_RELEASED: |             case STPB_RELEASED: | ||||||
|                 if (me->release.f != NULL) { |                 if (me->released.f != NULL) { | ||||||
|                     me->release.f(me->release.p); |                     me->released.f(me->released.p); | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|              |              | ||||||
|             case STPB_PRESSED: |             case STPB_PRESSED: | ||||||
|                 if (me->press.f != NULL) { |                 if (me->pressed.f != NULL) { | ||||||
|                     me->press.f(me->press.p); |                     me->pressed.f(me->pressed.p); | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
| @@ -130,14 +127,14 @@ bool BUTTON_processEvent(Event* ev) { | |||||||
|  * Callbacks * |  * Callbacks * | ||||||
|  *************/ |  *************/ | ||||||
|  |  | ||||||
| void BUTTON_onPress(BUTTON* me, BUTTON_CALLBACK_FUNCTION f, void* p){ | void BUTTON_onReleased(BUTTON* me, BUTTON_CALLBACK_FUNCTION f, void* p) { | ||||||
|     me->press.f = f; |     me->released.f = f; | ||||||
|     me->press.p = p; |     me->released.p = p; | ||||||
| } | } | ||||||
|  |  | ||||||
| void BUTTON_onRelease(BUTTON* me, BUTTON_CALLBACK_FUNCTION f, void* p){ | void BUTTON_onPressed(BUTTON* me, BUTTON_CALLBACK_FUNCTION f, void* p) { | ||||||
|     me->release.f = f; |     me->pressed.f = f; | ||||||
|     me->release.p = p; |     me->pressed.p = p; | ||||||
| } | } | ||||||
|  |  | ||||||
| /************ | /************ | ||||||
| @@ -156,6 +153,6 @@ void BUTTON_setId(BUTTON* me, uint8_t v) { | |||||||
|     me->id = v; |     me->id = v; | ||||||
| } | } | ||||||
|  |  | ||||||
| void BUTTON_setPoll_time(BUTTON* me, uint16_t v) { | void BUTTON_setPollTime(BUTTON* me, uint8_t v) { | ||||||
|     me->poll_time = v; |     me->pollTime = v; | ||||||
| } | } | ||||||
| @@ -29,14 +29,15 @@ typedef struct { | |||||||
| typedef struct { | typedef struct { | ||||||
|     BUTTON_STATES state; |     BUTTON_STATES state; | ||||||
|     uint8_t id; |     uint8_t id; | ||||||
|     uint16_t poll_time; |     uint8_t pollTime; | ||||||
|     BUTTON_CALLBACK press; |     BUTTON_CALLBACK released; | ||||||
|     BUTTON_CALLBACK release; |     BUTTON_CALLBACK pressed; | ||||||
| } BUTTON; | } BUTTON; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Initialize the BUTTON |  * Initialize the BUTTON | ||||||
|  * @param me the BUTTON itself |  * @param me the BUTTON itself | ||||||
|  |  * @param id the id of the BUTTON | ||||||
|  */ |  */ | ||||||
| void BUTTON_init(BUTTON* me, uint8_t id); | void BUTTON_init(BUTTON* me, uint8_t id); | ||||||
|  |  | ||||||
| @@ -74,20 +75,20 @@ bool BUTTON_processEvent(Event* ev); | |||||||
|  *************/ |  *************/ | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Set the callback function to call when the BUTTON is pressed |  * Set the callback function to call when the BUTTON is entering state released | ||||||
|  * @param me the BUTTON itself |  * @param me the BUTTON itself | ||||||
|  * @param f the function to call |  * @param f the function to call | ||||||
|  * @param p the param(s) to pass to the function |  * @param p the param(s) to pass to the function | ||||||
|  */ |  */ | ||||||
| void BUTTON_onPress(BUTTON* me, BUTTON_CALLBACK_FUNCTION f, void* p); | void BUTTON_onReleased(BUTTON* me, BUTTON_CALLBACK_FUNCTION f, void* p); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Set the callback function to call when the BUTTON is released |  * Set the callback function to call when the BUTTON is entering state pressed | ||||||
|  * @param me the BUTTON itself |  * @param me the BUTTON itself | ||||||
|  * @param f the function to call |  * @param f the function to call | ||||||
|  * @param p the param(s) to pass to the function |  * @param p the param(s) to pass to the function | ||||||
|  */ |  */ | ||||||
| void BUTTON_onRelease(BUTTON* me, BUTTON_CALLBACK_FUNCTION f, void* p); | void BUTTON_onPressed(BUTTON* me, BUTTON_CALLBACK_FUNCTION f, void* p); | ||||||
|  |  | ||||||
| /************ | /************ | ||||||
|  * EMITTERS * |  * EMITTERS * | ||||||
| @@ -115,6 +116,6 @@ void BUTTON_setId(BUTTON* me, uint8_t v); | |||||||
|  * @param me the BUTTON itself |  * @param me the BUTTON itself | ||||||
|  * @param v the poll time to set |  * @param v the poll time to set | ||||||
|  */ |  */ | ||||||
| void BUTTON_setPoll_time(BUTTON* me, uint16_t v); | void BUTTON_setPollTime(BUTTON* me, uint8_t v); | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -28,8 +28,8 @@ void CLICK_HANDLER_init(CLICK_HANDLER* me, BUTTON* b){ | |||||||
|     me->singleClick.fCallBack = NULL; |     me->singleClick.fCallBack = NULL; | ||||||
|     me->doubleClick.fCallBack = NULL; |     me->doubleClick.fCallBack = NULL; | ||||||
|      |      | ||||||
|     BUTTON_onPress(b, CLICK_HANDLER_BUTTON_PRESS, me); |     BUTTON_onPressed(b, CLICK_HANDLER_BUTTON_PRESS, me); | ||||||
|     BUTTON_onRelease(b, CLICK_HANDLER_BUTTON_RELEASE, me); |     BUTTON_onReleased(b, CLICK_HANDLER_BUTTON_RELEASE, me); | ||||||
| } | } | ||||||
|  |  | ||||||
| void CLICK_HANDLER_startBehaviour(CLICK_HANDLER* me){ | void CLICK_HANDLER_startBehaviour(CLICK_HANDLER* me){ | ||||||
| @@ -71,12 +71,8 @@ bool CLICK_HANDLER_processEvent(Event* ev) { | |||||||
|         case STCH_WAIT: |         case STCH_WAIT: | ||||||
|              |              | ||||||
|             if(evid == evCHpbPress) { |             if(evid == evCHpbPress) { | ||||||
|                 LED_on(l2()); |                 me->state = STCH_LONG_CLICK; | ||||||
|                 //me->state = STCH_LONG_CLICK; |                 POST(me, &CLICK_HANDLER_processEvent, evCHtimer, CH_CLICK_TIMER, 0); | ||||||
|                 //POST(me, &CLICK_HANDLER_processEvent, evCHtimer, CH_CLICK_TIMER, 0); |  | ||||||
|             } |  | ||||||
|             if(evid==evCHpbRelease) { |  | ||||||
|                 LED_off(l2()); |  | ||||||
|             } |             } | ||||||
|              |              | ||||||
|             break; |             break; | ||||||
| @@ -90,9 +86,7 @@ bool CLICK_HANDLER_processEvent(Event* ev) { | |||||||
|              |              | ||||||
|             if(evid == evCHtimer) { |             if(evid == evCHtimer) { | ||||||
|                 me->state = STCH_WAIT; |                 me->state = STCH_WAIT; | ||||||
|                 LED_on(l4()); |  | ||||||
|                 if(me->longClick.fCallBack != NULL) { |                 if(me->longClick.fCallBack != NULL) { | ||||||
|                     LED_on(l5()); |  | ||||||
|                     me->longClick.fCallBack(me->longClick.param); |                     me->longClick.fCallBack(me->longClick.param); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -103,12 +97,10 @@ bool CLICK_HANDLER_processEvent(Event* ev) { | |||||||
|         case STCH_SINGLE_CLICK: |         case STCH_SINGLE_CLICK: | ||||||
|              |              | ||||||
|             if(evid == evCHpbPress) { |             if(evid == evCHpbPress) { | ||||||
|                 LED_on(l2()); |  | ||||||
|                 me->state = STCH_DOUBLE_CLICK; |                 me->state = STCH_DOUBLE_CLICK; | ||||||
|             } |             } | ||||||
|              |              | ||||||
|             if(evid == evCHtimer) { |             if(evid == evCHtimer) { | ||||||
|                 LED_on(l3()); |  | ||||||
|                 me->state = STCH_WAIT; |                 me->state = STCH_WAIT; | ||||||
|                 if(me->singleClick.fCallBack != NULL) { |                 if(me->singleClick.fCallBack != NULL) { | ||||||
|                     me->singleClick.fCallBack(me->singleClick.param); |                     me->singleClick.fCallBack(me->singleClick.param); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user