add buttons callbacks
This commit is contained in:
parent
29a6be78b3
commit
ab2c1cf05a
161
src/board/button.c
Normal file
161
src/board/button.c
Normal file
@ -0,0 +1,161 @@
|
||||
/**
|
||||
* @author Rémi Heredero
|
||||
* @version 1.0.0
|
||||
* @date July 2023
|
||||
* @file button.c
|
||||
*/
|
||||
|
||||
#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) {
|
||||
me->id = id;
|
||||
me->state = STPB_INIT;
|
||||
me->poll_time = 20;
|
||||
me->press.f = NULL;
|
||||
me->release.f = NULL;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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) { // onState
|
||||
case STPB_INIT:
|
||||
if (ev->id == evPBinit) {
|
||||
POST(me, &BUTTON_processEvent, evPBpoll, me->poll_time, 0);
|
||||
if(BUTTON_isPressed(me)){
|
||||
me->state = STPB_PRESSED;
|
||||
} else {
|
||||
me->state = STPB_RELEASED;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case STPB_RELEASED:
|
||||
if (ev->id == evPBpoll) {
|
||||
POST(me, &BUTTON_processEvent, evPBpoll, me->poll_time, 0);
|
||||
if(BUTTON_isPressed(me)){
|
||||
me->state = STPB_PRESSED;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case STPB_PRESSED:
|
||||
if (ev->id == evPBpoll) {
|
||||
POST(me, &BUTTON_processEvent, evPBpoll, me->poll_time, 0);
|
||||
if(!BUTTON_isPressed(me)){
|
||||
me->state = STPB_RELEASED;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(oldState != me->state){
|
||||
switch (oldState) { // onExit
|
||||
case STPB_INIT:
|
||||
break;
|
||||
|
||||
case STPB_RELEASED:
|
||||
break;
|
||||
|
||||
case STPB_PRESSED:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (me->state) { // onEntry
|
||||
case STPB_INIT:
|
||||
break;
|
||||
|
||||
case STPB_RELEASED:
|
||||
if (me->release.f != NULL) {
|
||||
me->release.f(me->release.p);
|
||||
}
|
||||
break;
|
||||
|
||||
case STPB_PRESSED:
|
||||
if (me->press.f != NULL) {
|
||||
me->press.f(me->press.p);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
processed = true;
|
||||
}
|
||||
return processed;
|
||||
}
|
||||
|
||||
/*************
|
||||
* Callbacks *
|
||||
*************/
|
||||
|
||||
void BUTTON_onPress(BUTTON* me, BUTTON_CALLBACK_FUNCTION f, void* p){
|
||||
me->press.f = f;
|
||||
me->press.p = p;
|
||||
}
|
||||
|
||||
void BUTTON_onRelease(BUTTON* me, BUTTON_CALLBACK_FUNCTION f, void* p){
|
||||
me->release.f = f;
|
||||
me->release.p = p;
|
||||
}
|
||||
|
||||
/************
|
||||
* EMITTERS *
|
||||
************/
|
||||
|
||||
void BUTTON_emitPoll(BUTTON* me, uint16_t t) {
|
||||
POST(me, &BUTTON_processEvent, evPBpoll, t, 0);
|
||||
}
|
||||
|
||||
/***********
|
||||
* SETTERS *
|
||||
***********/
|
||||
|
||||
void BUTTON_setId(BUTTON* me, uint8_t v) {
|
||||
me->id = v;
|
||||
}
|
||||
|
||||
void BUTTON_setPoll_time(BUTTON* me, uint16_t v) {
|
||||
me->poll_time = v;
|
||||
}
|
120
src/board/button.h
Normal file
120
src/board/button.h
Normal file
@ -0,0 +1,120 @@
|
||||
/**
|
||||
* @author Rémi Heredero
|
||||
* @version 1.0.0
|
||||
* @date July 2023
|
||||
* @file button.h
|
||||
*/
|
||||
#ifndef BUTTON_H
|
||||
#define BUTTON_H
|
||||
|
||||
#include "../xf/xf.h"
|
||||
|
||||
typedef enum {
|
||||
STPB_INIT,
|
||||
STPB_RELEASED,
|
||||
STPB_PRESSED
|
||||
} BUTTON_STATES;
|
||||
|
||||
typedef enum {
|
||||
evPBinit = 50,
|
||||
evPBpoll
|
||||
} BUTTON_EVENTS;
|
||||
|
||||
typedef void (*BUTTON_CALLBACK_FUNCTION)(void*);
|
||||
typedef struct {
|
||||
BUTTON_CALLBACK_FUNCTION f; // function
|
||||
void* p; // param(s)
|
||||
} BUTTON_CALLBACK;
|
||||
|
||||
typedef struct {
|
||||
BUTTON_STATES state;
|
||||
uint8_t id;
|
||||
uint16_t poll_time;
|
||||
BUTTON_CALLBACK press;
|
||||
BUTTON_CALLBACK release;
|
||||
} BUTTON;
|
||||
|
||||
/**
|
||||
* Initialize the BUTTON
|
||||
* @param me the BUTTON itself
|
||||
*/
|
||||
void BUTTON_init(BUTTON* me, uint8_t id);
|
||||
|
||||
/**
|
||||
* Initialize the hardware of the BUTTON
|
||||
* @param me the BUTTON itself
|
||||
*/
|
||||
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 button itself
|
||||
* @return true if the button is pressed
|
||||
* @return false if the button is not pressed
|
||||
*/
|
||||
bool BUTTON_isPressed(BUTTON* me);
|
||||
|
||||
/**
|
||||
* Start the BUTTON state machine
|
||||
* @param me the BUTTON itself
|
||||
*/
|
||||
void BUTTON_startBehaviour(BUTTON* me);
|
||||
|
||||
/**
|
||||
* Process the event
|
||||
* @param ev the event to process
|
||||
* @return true if the event is processed
|
||||
*/
|
||||
bool BUTTON_processEvent(Event* ev);
|
||||
|
||||
/*************
|
||||
* Callbacks *
|
||||
*************/
|
||||
|
||||
/**
|
||||
* Set the callback function to call when the BUTTON is pressed
|
||||
* @param me the BUTTON itself
|
||||
* @param f the function to call
|
||||
* @param p the param(s) to pass to the function
|
||||
*/
|
||||
void BUTTON_onPress(BUTTON* me, BUTTON_CALLBACK_FUNCTION f, void* p);
|
||||
|
||||
/**
|
||||
* Set the callback function to call when the BUTTON is released
|
||||
* @param me the BUTTON itself
|
||||
* @param f the function to call
|
||||
* @param p the param(s) to pass to the function
|
||||
*/
|
||||
void BUTTON_onRelease(BUTTON* me, BUTTON_CALLBACK_FUNCTION f, void* p);
|
||||
|
||||
/************
|
||||
* EMITTERS *
|
||||
************/
|
||||
|
||||
/**
|
||||
* Emit the poll event
|
||||
* @param me the BUTTON itself
|
||||
* @param t time to wait in ms before triggering event
|
||||
*/void BUTTON_emitPoll(BUTTON* me, uint16_t t);
|
||||
|
||||
/***********
|
||||
* SETTERS *
|
||||
***********/
|
||||
|
||||
/**
|
||||
* Set the id of the BUTTON
|
||||
* @param me the BUTTON itself
|
||||
* @param v the id to set
|
||||
*/
|
||||
void BUTTON_setId(BUTTON* me, uint8_t v);
|
||||
|
||||
/**
|
||||
* Set the poll time of the BUTTON
|
||||
* @param me the BUTTON itself
|
||||
* @param v the poll time to set
|
||||
*/
|
||||
void BUTTON_setPoll_time(BUTTON* me, uint16_t v);
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user