154 lines
4.1 KiB
C
154 lines
4.1 KiB
C
/**
|
|
* @author Rémi Heredero (remi@heredero.ch)
|
|
* @version. 1.0.0
|
|
* @date 2023-06-15
|
|
*/
|
|
|
|
#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;
|
|
}
|
|
processed = true;
|
|
}
|
|
return processed;
|
|
}
|