137 lines
3.4 KiB
C
137 lines
3.4 KiB
C
/**
|
|
* @author Rémi Heredero (remi@heredero.ch)
|
|
* @version. 1.0.0
|
|
* @date 2023-06-15
|
|
*/
|
|
|
|
#include "button.h"
|
|
#include "../../mcc_generated_files/pin_manager.h"
|
|
#include "../../app/factory/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;
|
|
} |