XF upgrade
This commit is contained in:
parent
dc2dc5c58b
commit
0d07b98cfd
@ -29,13 +29,15 @@ XFEventStatus ButtonEventsLogger::processEvent() {
|
||||
int evid = ev->getId();
|
||||
|
||||
oldState_ = curentState_;
|
||||
changeState = false;
|
||||
changeXFState = false;
|
||||
|
||||
|
||||
|
||||
switch (curentState_) { //on state
|
||||
case state::initial:
|
||||
if(evType == XFEvent::Initial) {
|
||||
curentState_ = state::waitButtonPressed;
|
||||
changeState = true;
|
||||
changeXFState = true;
|
||||
eventStatus = XFEventStatus::Consumed;
|
||||
}
|
||||
break;
|
||||
@ -44,19 +46,19 @@ XFEventStatus ButtonEventsLogger::processEvent() {
|
||||
if(evid == event::evButtonShortPressed){
|
||||
Trace::out("ButtonEventLogger: Button %d short pressed", ev->getButtonId());
|
||||
curentState_ = state::waitButtonPressed;
|
||||
changeState = true;
|
||||
changeXFState = true;
|
||||
eventStatus = XFEventStatus::Consumed;
|
||||
}
|
||||
if(evid == event::evButtonLongPressed){
|
||||
Trace::out("ButtonEventLogger: Button %d long pressed", ev->getButtonId());
|
||||
curentState_ = state::waitButtonPressed;
|
||||
changeState = true;
|
||||
changeXFState = true;
|
||||
eventStatus = XFEventStatus::Consumed;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(changeState) {
|
||||
if(changeXFState) {
|
||||
switch (oldState_) { // onExit
|
||||
case state::initial:
|
||||
break;
|
||||
@ -73,7 +75,7 @@ XFEventStatus ButtonEventsLogger::processEvent() {
|
||||
break;
|
||||
|
||||
}
|
||||
changeState = false;
|
||||
changeXFState = false;
|
||||
}
|
||||
return eventStatus;
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
|
||||
#include "xf/behavior.h"
|
||||
#include "interface/buttoneventshandlerobserver.h"
|
||||
#include "xf/XFState.h"
|
||||
|
||||
class ButtonEventsLogger : public XFBehavior, public interface::ButtonEventsHandlerObserver {
|
||||
public:
|
||||
@ -23,7 +24,7 @@ protected:
|
||||
XFEventStatus processEvent() override;
|
||||
|
||||
typedef enum {
|
||||
evButtonShortPressed,
|
||||
evButtonShortPressed = 1,
|
||||
evButtonLongPressed
|
||||
} event;
|
||||
|
||||
@ -32,11 +33,8 @@ protected:
|
||||
waitButtonPressed
|
||||
} state;
|
||||
|
||||
// TODO changeState and put next variable on behavior
|
||||
|
||||
state curentState_;
|
||||
state oldState_;
|
||||
bool changeState = false;
|
||||
|
||||
};
|
||||
|
||||
|
@ -10,10 +10,22 @@
|
||||
#include "board/ButtonsController.h"
|
||||
|
||||
|
||||
ButtonEventsHandler::ButtonEventsHandler() {
|
||||
ButtonEventsHandler::ButtonEventsHandler()
|
||||
: stRun(this) {
|
||||
for(uint8_t i = 0; i< MAX_OBSERVER; i++) {
|
||||
observer_[i] = nullptr;
|
||||
}
|
||||
|
||||
stInitial.setNextState(&stRun);
|
||||
stRun.registerOnEntry((XFState::callback)&ButtonEventsHandler::startButtonSM);
|
||||
|
||||
}
|
||||
|
||||
void ButtonEventsHandler::startButtonSM(const XFEvent* ev) {
|
||||
buttonStateSm_[0].startBehavior();
|
||||
buttonStateSm_[1].startBehavior();
|
||||
buttonStateSm_[2].startBehavior();
|
||||
buttonStateSm_[3].startBehavior();
|
||||
}
|
||||
|
||||
ButtonEventsHandler* ButtonEventsHandler::getInstance() {
|
||||
@ -21,54 +33,6 @@ ButtonEventsHandler* ButtonEventsHandler::getInstance() {
|
||||
return &buttonEventsHandler_;
|
||||
}
|
||||
|
||||
XFEventStatus ButtonEventsHandler::processEvent() {
|
||||
eEventStatus eventStatus = XFEventStatus::Unknown;
|
||||
|
||||
const XFEvent* ev = getCurrentEvent();
|
||||
XFEvent::XFEventType evType = ev->getEventType();
|
||||
int evid = ev->getId();
|
||||
|
||||
oldState_ = currentState_;
|
||||
changeState_ = false;
|
||||
|
||||
switch (currentState_) {
|
||||
case state::initial:
|
||||
if(evType == XFEvent::Initial) {
|
||||
currentState_ = state::run;
|
||||
changeState_ = true;
|
||||
eventStatus = XFEventStatus::Consumed;
|
||||
}
|
||||
break;
|
||||
|
||||
case state::run:
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if(changeState_) {
|
||||
switch (oldState_) { // onExit
|
||||
case state::initial:
|
||||
break;
|
||||
|
||||
case state::run:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (currentState_) { // onEntry
|
||||
case state::initial:
|
||||
break;
|
||||
|
||||
case state::run:
|
||||
buttonStateSm_[0].startBehavior();
|
||||
buttonStateSm_[1].startBehavior();
|
||||
buttonStateSm_[2].startBehavior();
|
||||
buttonStateSm_[3].startBehavior();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return eventStatus;
|
||||
}
|
||||
|
||||
void ButtonEventsHandler::onButtonChangeState(uint16_t buttonIndex, bool pressed) {
|
||||
if(pressed) {
|
||||
buttonStateSm_[buttonIndex].genButtonPressed();
|
||||
|
@ -31,16 +31,9 @@ public:
|
||||
|
||||
protected:
|
||||
ButtonEventsHandler();
|
||||
XFEventStatus processEvent() override;
|
||||
void startButtonSM(const XFEvent* ev);
|
||||
|
||||
typedef enum {
|
||||
initial,
|
||||
run
|
||||
} state ;
|
||||
|
||||
state currentState_;
|
||||
state oldState_;
|
||||
bool changeState_;
|
||||
XFState stRun;
|
||||
|
||||
interface::ButtonEventsHandlerObserver* observer_[MAX_OBSERVER];
|
||||
ButtonStateSm buttonStateSm_[4];
|
||||
|
@ -18,7 +18,7 @@ public:
|
||||
void genButtonReleased();
|
||||
|
||||
protected:
|
||||
XFEventStatus processEvent() override;
|
||||
XFEventStatus processEvent();
|
||||
|
||||
typedef enum {
|
||||
evButtonPressed,
|
||||
|
@ -9,10 +9,18 @@
|
||||
#include "trace/trace.h"
|
||||
#include "main.h"
|
||||
|
||||
ButtonsController::ButtonsController() {
|
||||
curentState_ = state::initial;
|
||||
ButtonsController::ButtonsController()
|
||||
: stCheckButtons(this),
|
||||
stDebounce(this) {
|
||||
|
||||
cbProvider = nullptr;
|
||||
cbMethod = nullptr;
|
||||
|
||||
stInitial.setNextState(&stCheckButtons);
|
||||
stCheckButtons.setNextState(event::evButtonIrq, &stDebounce);
|
||||
stCheckButtons.registerOnEntry((XFState::callback)&ButtonsController::fctCheckButtons);
|
||||
|
||||
stDebounce.setTimeout(20, &stCheckButtons);
|
||||
};
|
||||
|
||||
ButtonsController* ButtonsController::getInstance() {
|
||||
@ -37,97 +45,35 @@ bool ButtonsController::registerCallback(
|
||||
return true;
|
||||
}
|
||||
|
||||
XFEventStatus ButtonsController::processEvent() {
|
||||
eEventStatus eventStatus = XFEventStatus::Unknown;
|
||||
void ButtonsController::fctCheckButtons(const XFEvent* ev) {
|
||||
if(cbProvider != nullptr) {
|
||||
|
||||
const XFEvent* ev = getCurrentEvent();
|
||||
XFEvent::XFEventType evType = ev->getEventType();
|
||||
int evid = ev->getId();
|
||||
newState[0] = HAL_GPIO_ReadPin(BUTTON0_GPIO_Port, BUTTON0_Pin);
|
||||
newState[1] = HAL_GPIO_ReadPin(BUTTON1_GPIO_Port, BUTTON1_Pin);
|
||||
newState[2] = HAL_GPIO_ReadPin(BUTTON2_GPIO_Port, BUTTON2_Pin);
|
||||
newState[3] = HAL_GPIO_ReadPin(BUTTON3_GPIO_Port, BUTTON3_Pin);
|
||||
|
||||
oldState_ = curentState_;
|
||||
changeState = false;
|
||||
|
||||
switch (curentState_) {
|
||||
case state::initial:
|
||||
if(evType == XFEvent::Initial) {
|
||||
curentState_ = state::checkButtons;
|
||||
changeState = true;
|
||||
eventStatus = XFEventStatus::Consumed;
|
||||
}
|
||||
break;
|
||||
|
||||
case state::checkButtons:
|
||||
if (evid == event::evButtonIrq) {
|
||||
curentState_ = state::debounce;
|
||||
changeState = true;
|
||||
eventStatus = XFEventStatus::Consumed;
|
||||
}
|
||||
break;
|
||||
|
||||
case state::debounce:
|
||||
if (evid == event::evTimeout) {
|
||||
curentState_ = state::checkButtons;
|
||||
changeState = true;
|
||||
eventStatus = XFEventStatus::Consumed;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(changeState) {
|
||||
switch (oldState_) { // onExit
|
||||
case state::initial:
|
||||
break;
|
||||
|
||||
case state::checkButtons:
|
||||
break;
|
||||
|
||||
case state::debounce:
|
||||
break;
|
||||
if(newState[0] != buttonState[0]) {
|
||||
buttonState[0] = newState[0];
|
||||
(cbProvider->*cbMethod)(0, !buttonState[0]);
|
||||
|
||||
}
|
||||
|
||||
switch (curentState_) { // onEntry
|
||||
case state::initial:
|
||||
break;
|
||||
|
||||
case state::checkButtons:
|
||||
|
||||
if(cbProvider != nullptr) {
|
||||
|
||||
newState[0] = HAL_GPIO_ReadPin(BUTTON0_GPIO_Port, BUTTON0_Pin);
|
||||
newState[1] = HAL_GPIO_ReadPin(BUTTON1_GPIO_Port, BUTTON1_Pin);
|
||||
newState[2] = HAL_GPIO_ReadPin(BUTTON2_GPIO_Port, BUTTON2_Pin);
|
||||
newState[3] = HAL_GPIO_ReadPin(BUTTON3_GPIO_Port, BUTTON3_Pin);
|
||||
|
||||
if(newState[0] != buttonState[0]) {
|
||||
buttonState[0] = newState[0];
|
||||
(cbProvider->*cbMethod)(0, !buttonState[0]);
|
||||
|
||||
}
|
||||
|
||||
if(newState[1] != buttonState[1]) {
|
||||
buttonState[1] = newState[1];
|
||||
(cbProvider->*cbMethod)(1, !buttonState[1]);
|
||||
}
|
||||
|
||||
if(newState[2] != buttonState[2]) {
|
||||
buttonState[2] = newState[2];
|
||||
(cbProvider->*cbMethod)(2, !buttonState[2]);
|
||||
}
|
||||
|
||||
if(newState[3] != buttonState[3]) {
|
||||
buttonState[3] = newState[3];
|
||||
(cbProvider->*cbMethod)(3, !buttonState[3]);
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case state::debounce:
|
||||
scheduleTimeout(event::evTimeout, 100);
|
||||
break;
|
||||
|
||||
if(newState[1] != buttonState[1]) {
|
||||
buttonState[1] = newState[1];
|
||||
(cbProvider->*cbMethod)(1, !buttonState[1]);
|
||||
}
|
||||
|
||||
if(newState[2] != buttonState[2]) {
|
||||
buttonState[2] = newState[2];
|
||||
(cbProvider->*cbMethod)(2, !buttonState[2]);
|
||||
}
|
||||
|
||||
if(newState[3] != buttonState[3]) {
|
||||
buttonState[3] = newState[3];
|
||||
(cbProvider->*cbMethod)(3, !buttonState[3]);
|
||||
}
|
||||
|
||||
}
|
||||
return eventStatus;
|
||||
}
|
||||
|
||||
|
@ -19,27 +19,23 @@ public:
|
||||
|
||||
protected:
|
||||
ButtonsController();
|
||||
XFEventStatus processEvent() override;
|
||||
|
||||
typedef enum {
|
||||
evButtonIrq = 1,
|
||||
evButtonIrq = 10,
|
||||
evTimeout
|
||||
} event;
|
||||
|
||||
typedef enum {
|
||||
initial,
|
||||
checkButtons,
|
||||
debounce
|
||||
} state;
|
||||
|
||||
state curentState_;
|
||||
state oldState_;
|
||||
bool changeState = false;
|
||||
interface::ButtonsControllerCallbackProvider* cbProvider;
|
||||
interface::ButtonsControllerCallbackProvider::CallbackMethod cbMethod;
|
||||
bool newState[4];
|
||||
bool buttonState[4];
|
||||
|
||||
void fctCheckButtons(const XFEvent* ev);
|
||||
void fctScheduleTimeout(const XFEvent* ev);
|
||||
|
||||
XFState stCheckButtons;
|
||||
XFState stDebounce;
|
||||
|
||||
public:
|
||||
virtual void onIrq() override;
|
||||
virtual bool registerCallback(
|
||||
|
78
src/xf/core/XFState.cpp
Normal file
78
src/xf/core/XFState.cpp
Normal file
@ -0,0 +1,78 @@
|
||||
/*
|
||||
* XFState.cpp
|
||||
*
|
||||
* Created on: 23 nov. 2023
|
||||
* Author: remi.heredero
|
||||
*/
|
||||
|
||||
#include "xf/XFState.h"
|
||||
#include "xf/include/xf/behavior.h"
|
||||
#include <cassert>
|
||||
#include "xf/event.h"
|
||||
#include "trace/trace.h"
|
||||
|
||||
XFState::XFState(XFBehavior* behavior)
|
||||
: pBehavior(behavior) {
|
||||
assert(behavior != nullptr);
|
||||
}
|
||||
|
||||
void XFState::setNextState(const int evid, const int time, XFEvent::XFEventType type, XFState* state) {
|
||||
assert(state != nullptr);
|
||||
transition t;
|
||||
t.evid = evid;
|
||||
t.time = time;
|
||||
t.evType = type;
|
||||
t.nextState = state;
|
||||
transitions_.push_back(t);
|
||||
}
|
||||
|
||||
XFEventStatus XFState::onState(const XFEvent* ev) {
|
||||
|
||||
assert(ev != nullptr);
|
||||
assert(pBehavior != nullptr);
|
||||
|
||||
for(transition t : transitions_) {
|
||||
assert(t.nextState != nullptr);
|
||||
|
||||
if(t.evType == XFEvent::XFEventType::Initial){
|
||||
pBehavior->curentXFState_ = t.nextState;
|
||||
pBehavior->changeXFState = true;
|
||||
return XFEventStatus::Consumed;
|
||||
}
|
||||
|
||||
if(t.evType == XFEvent::XFEventType::Timeout) {
|
||||
pBehavior->curentXFState_ = t.nextState;
|
||||
pBehavior->changeXFState = true;
|
||||
return XFEventStatus::Consumed;
|
||||
}
|
||||
|
||||
if(t.evid == ev->getId()) {
|
||||
pBehavior->curentXFState_ = t.nextState;
|
||||
pBehavior->changeXFState = true;
|
||||
return XFEventStatus::Consumed;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return XFEventStatus::NotConsumed;
|
||||
}
|
||||
|
||||
void XFState::onEntry(const XFEvent* ev) {
|
||||
if(cbEntry_ != nullptr) {
|
||||
(pBehavior->*cbEntry_)(ev);
|
||||
}
|
||||
|
||||
for(transition t : transitions_) {
|
||||
assert(t.nextState != nullptr);
|
||||
|
||||
if(t.evType == XFEvent::XFEventType::Timeout) {
|
||||
pBehavior->scheduleTimeout(XFEvent::Timeout, t.time);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
void XFState::onExit(const XFEvent* ev) {
|
||||
if(cbExit_ != nullptr) {
|
||||
(pBehavior->*cbExit_)(ev);
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@
|
||||
#include "xf/timeout.h"
|
||||
#include "xf/initialevent.h"
|
||||
#include "xf/behavior.h"
|
||||
#include "trace/trace.h"
|
||||
|
||||
using interface::XFResourceFactory;
|
||||
|
||||
@ -12,7 +13,8 @@ XFBehavior::XFBehavior(bool ownDispatcher /* = false */) :
|
||||
pDispatcher_(nullptr),
|
||||
hasOwnDispatcher_(ownDispatcher),
|
||||
deleteOnTerminate_(false),
|
||||
pCurrentEvent_(nullptr)
|
||||
pCurrentEvent_(nullptr),
|
||||
stInitial(this)
|
||||
{
|
||||
if (ownDispatcher)
|
||||
{
|
||||
@ -81,6 +83,22 @@ XFBehavior::TerminateBehavior XFBehavior::process(const XFEvent * pEvent)
|
||||
return (eventStatus == XFEventStatus::Terminate);
|
||||
}
|
||||
|
||||
XFEventStatus XFBehavior::processEvent(){
|
||||
XFEventStatus eventStatus = XFEventStatus::Unknown;
|
||||
const XFEvent * ev = getCurrentEvent();
|
||||
|
||||
oldXFState_ = curentXFState_;
|
||||
|
||||
eventStatus = curentXFState_->onState(ev);
|
||||
|
||||
if(changeXFState){
|
||||
oldXFState_->onExit(ev);
|
||||
curentXFState_->onEntry(ev);
|
||||
}
|
||||
|
||||
return eventStatus;
|
||||
}
|
||||
|
||||
interface::XFDispatcher * XFBehavior::getDispatcher()
|
||||
{
|
||||
return pDispatcher_;
|
||||
|
58
src/xf/include/xf/XFState.h
Normal file
58
src/xf/include/xf/XFState.h
Normal file
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* XFState.h
|
||||
*
|
||||
* Created on: 23 nov. 2023
|
||||
* Author: remi.heredero
|
||||
*/
|
||||
|
||||
#ifndef XFSTATE_H_
|
||||
#define XFSTATE_H_
|
||||
|
||||
#include "xf/interface/reactive.h"
|
||||
#include "xf/interface/dispatcher.h"
|
||||
#include "xf/eventstatus.h"
|
||||
#include "xf/initialevent.h"
|
||||
#include "xf/nulltransition.h"
|
||||
#include "xf/timeout.h"
|
||||
class XFBehavior;
|
||||
|
||||
#include <list>
|
||||
|
||||
class XFState {
|
||||
friend class XFBehavior;
|
||||
public:
|
||||
XFState(XFBehavior* behavior);
|
||||
~XFState() = default;
|
||||
|
||||
inline void setNextState(XFState* state) { setNextState(XFEvent::Initial, XFEvent::XFEventType::Initial, state); };
|
||||
inline void setNextState(const int evid, XFState* state) { setNextState(evid, XFEvent::XFEventType::Event, state); };
|
||||
|
||||
inline void setTimeout(int time, XFState* nextState) { setNextState(XFEvent::Timeout, time, XFEvent::XFEventType::Timeout, nextState); };
|
||||
typedef void (XFBehavior::*callback)(const XFEvent* ev);
|
||||
inline void registerOnEntry(callback cbEntry) { cbEntry_ = cbEntry; };
|
||||
inline void registerOnExit(callback cbExit) { cbExit_ = cbExit; };
|
||||
|
||||
protected:
|
||||
inline void setNextState(const int evid, XFEvent::XFEventType type, XFState* state) {setNextState(evid, 0, type, state); };
|
||||
void setNextState(const int evid, const int time, XFEvent::XFEventType type, XFState* state);
|
||||
|
||||
XFEventStatus onState(const XFEvent* ev);
|
||||
void onEntry(const XFEvent* ev);
|
||||
void onExit(const XFEvent* ev);
|
||||
|
||||
protected:
|
||||
XFBehavior* const pBehavior;
|
||||
typedef struct {
|
||||
int evid;
|
||||
int time;
|
||||
XFEvent::XFEventType evType;
|
||||
XFState* nextState;
|
||||
} transition;
|
||||
std::list<transition> transitions_;
|
||||
|
||||
callback cbEntry_;
|
||||
callback cbExit_;
|
||||
|
||||
};
|
||||
|
||||
#endif /* XFSTATE_H_ */
|
@ -8,6 +8,9 @@
|
||||
#include "xf/nulltransition.h"
|
||||
#include "xf/timeout.h"
|
||||
|
||||
#include "xf/include/xf/XFState.h"
|
||||
#include <list>
|
||||
|
||||
class XFTimeout;
|
||||
|
||||
/** @ingroup xf_core
|
||||
@ -25,8 +28,8 @@ class XFTimeout;
|
||||
* called every time an event or timeout arrives. The event (or timeout) can
|
||||
* be accessed via the getCurrentEvent() method.
|
||||
*/
|
||||
class XFBehavior : public interface::XFReactive
|
||||
{
|
||||
class XFBehavior : public interface::XFReactive {
|
||||
friend class XFState;
|
||||
public:
|
||||
#define GEN(event) pushEvent(new event)
|
||||
|
||||
@ -55,7 +58,7 @@ protected:
|
||||
* This method needs to be overridden to implement the
|
||||
* behavior (i.e. state machine) needed.
|
||||
*/
|
||||
virtual XFEventStatus processEvent() = 0;
|
||||
virtual XFEventStatus processEvent();
|
||||
|
||||
const XFEvent * getCurrentEvent() const; ///< Returns the current event to be processed in processEvent().
|
||||
interface::XFDispatcher * getDispatcher(); ///< Returns reference to #_pDispatcher.
|
||||
@ -95,6 +98,13 @@ protected:
|
||||
bool hasOwnDispatcher_; ///< True if behavior has its own dispatcher, False if the default dispatcher is used.
|
||||
bool deleteOnTerminate_; ///< Indicates if the behavior can be deleted after reception of a 'terminate event'.
|
||||
const XFEvent * pCurrentEvent_; ///< Reference to actually processed event.
|
||||
|
||||
protected:
|
||||
XFState stInitial;
|
||||
XFState* curentXFState_ = &stInitial;
|
||||
XFState* oldXFState_ = &stInitial;
|
||||
bool changeXFState = false;
|
||||
|
||||
};
|
||||
|
||||
/** @} */ // end of xf_core group
|
||||
|
Reference in New Issue
Block a user