You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
268 lines
6.8 KiB
C
268 lines
6.8 KiB
C
/*
|
|
* ex: set ro:
|
|
* DO NOT EDIT.
|
|
* generated by smc (http://smc.sourceforge.net/)
|
|
* from file : timebomb.sm
|
|
*/
|
|
|
|
|
|
|
|
#include "uc_ao.h" /* uC/AO API */
|
|
#include "bsp.h"
|
|
#include "timebomb.h"
|
|
|
|
void TimeBomb_ctor(TimeBomb * const me) {
|
|
Active_ctor(&me->super, (DispatchHandler)&TimeBomb_dispatch);
|
|
timebombContext_Init(&me->_fsm, me);
|
|
TimeEvent_ctor(&me->te, TIMEOUT_SIG, &me->super);
|
|
}
|
|
|
|
void TimeBomb_dispatch(TimeBomb * const me, Event const * const e) {
|
|
/* temporary 'fsm' needed to fix the bug in SMC macro ENTRY_STATE() */
|
|
struct timebombContext *fsm = &me->_fsm;
|
|
switch (e->sig) {
|
|
case INIT_SIG:
|
|
timebombContext_EnterStartState(fsm);
|
|
break;
|
|
case BUTTON_PRESSED_SIG:
|
|
timebombContext_BUTTON(fsm, e);
|
|
break;
|
|
case TIMEOUT_SIG:
|
|
timebombContext_TIMEOUT(fsm, e);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* action functions... */
|
|
static inline void TimeBomb_ledRedOn(TimeBomb * const me) {
|
|
BSP_ledRedOn();
|
|
}
|
|
static inline void TimeBomb_ledRedOff(TimeBomb * const me) {
|
|
BSP_ledRedOff();
|
|
}
|
|
static inline void TimeBomb_ledBlueOn(TimeBomb * const me) {
|
|
BSP_ledBlueOn();
|
|
}
|
|
static inline void TimeBomb_ledBlueOff(TimeBomb * const me) {
|
|
BSP_ledBlueOff();
|
|
}
|
|
static inline void TimeBomb_ledGreenOn(TimeBomb * const me) {
|
|
BSP_ledGreenOn();
|
|
}
|
|
static inline void TimeBomb_ledGreenOff(TimeBomb * const me) {
|
|
BSP_ledGreenOff();
|
|
}
|
|
static inline void TimeBomb_setBlinkCtr(TimeBomb * const me,
|
|
uint32_t blink_ctr)
|
|
{
|
|
me->blink_ctr = blink_ctr;
|
|
}
|
|
static inline void TimeBomb_decBlinkCtr(TimeBomb * const me) {
|
|
--me->blink_ctr;
|
|
}
|
|
static inline void TimeBomb_armTE(TimeBomb * const me,
|
|
uint32_t timeout, uint32_t interval)
|
|
{
|
|
TimeEvent_arm(&me->te, timeout, interval);
|
|
}
|
|
|
|
|
|
|
|
#include "timebomb_sm.h"
|
|
|
|
#define getOwner(fsm) (fsm)->_owner
|
|
|
|
static void TimeBombState_BUTTON(struct timebombContext *const fsm, Event const *const e)
|
|
{
|
|
getState(fsm)->Default(fsm);
|
|
}
|
|
|
|
static void TimeBombState_TIMEOUT(struct timebombContext *const fsm, Event const *const e)
|
|
{
|
|
getState(fsm)->Default(fsm);
|
|
}
|
|
|
|
static void TimeBombState_Default(struct timebombContext *const fsm)
|
|
{
|
|
State_Default(fsm);
|
|
}
|
|
|
|
#define TimeBombMap_wait4button_BUTTON TimeBombState_BUTTON
|
|
#define TimeBombMap_wait4button_TIMEOUT TimeBombState_TIMEOUT
|
|
#define TimeBombMap_wait4button_Default TimeBombState_Default
|
|
#define TimeBombMap_blink_BUTTON TimeBombState_BUTTON
|
|
#define TimeBombMap_blink_TIMEOUT TimeBombState_TIMEOUT
|
|
#define TimeBombMap_blink_Default TimeBombState_Default
|
|
#define TimeBombMap_pause_BUTTON TimeBombState_BUTTON
|
|
#define TimeBombMap_pause_TIMEOUT TimeBombState_TIMEOUT
|
|
#define TimeBombMap_pause_Default TimeBombState_Default
|
|
#define TimeBombMap_boom_BUTTON TimeBombState_BUTTON
|
|
#define TimeBombMap_boom_TIMEOUT TimeBombState_TIMEOUT
|
|
#define TimeBombMap_boom_Default TimeBombState_Default
|
|
#define TimeBombMap_DefaultState_BUTTON TimeBombState_BUTTON
|
|
#define TimeBombMap_DefaultState_TIMEOUT TimeBombState_TIMEOUT
|
|
|
|
void TimeBombMap_wait4button_Entry(struct timebombContext *const fsm)
|
|
{
|
|
struct TimeBomb *ctxt = getOwner(fsm);
|
|
|
|
TimeBomb_ledGreenOn(ctxt);
|
|
}
|
|
|
|
void TimeBombMap_wait4button_Exit(struct timebombContext *const fsm)
|
|
{
|
|
struct TimeBomb *ctxt = getOwner(fsm);
|
|
|
|
TimeBomb_ledGreenOff(ctxt);
|
|
}
|
|
|
|
#undef TimeBombMap_wait4button_BUTTON
|
|
static void TimeBombMap_wait4button_BUTTON(struct timebombContext *const fsm, Event const *const e)
|
|
{
|
|
struct TimeBomb *ctxt = getOwner(fsm);
|
|
|
|
EXIT_STATE(getState(fsm));
|
|
clearState(fsm);
|
|
TimeBomb_setBlinkCtr(ctxt, 5U);
|
|
setState(fsm, &TimeBombMap_blink);
|
|
ENTRY_STATE(getState(fsm));
|
|
|
|
}
|
|
|
|
const struct TimeBombState TimeBombMap_wait4button = {
|
|
TimeBombMap_wait4button_Entry,
|
|
TimeBombMap_wait4button_Exit,
|
|
TimeBombMap_wait4button_BUTTON,
|
|
TimeBombMap_wait4button_TIMEOUT,
|
|
TimeBombMap_wait4button_Default,
|
|
0
|
|
};
|
|
|
|
void TimeBombMap_blink_Entry(struct timebombContext *const fsm)
|
|
{
|
|
struct TimeBomb *ctxt = getOwner(fsm);
|
|
|
|
TimeBomb_ledRedOn(ctxt);
|
|
TimeBomb_armTE(ctxt, OS_TICKS_PER_SEC/2, 0U);
|
|
}
|
|
|
|
void TimeBombMap_blink_Exit(struct timebombContext *const fsm)
|
|
{
|
|
struct TimeBomb *ctxt = getOwner(fsm);
|
|
|
|
TimeBomb_ledRedOff(ctxt);
|
|
}
|
|
|
|
#undef TimeBombMap_blink_TIMEOUT
|
|
static void TimeBombMap_blink_TIMEOUT(struct timebombContext *const fsm, Event const *const e)
|
|
{
|
|
struct TimeBomb *ctxt = getOwner(fsm);
|
|
|
|
EXIT_STATE(getState(fsm));
|
|
clearState(fsm);
|
|
TimeBomb_decBlinkCtr(ctxt);
|
|
setState(fsm, &TimeBombMap_pause);
|
|
ENTRY_STATE(getState(fsm));
|
|
|
|
}
|
|
|
|
const struct TimeBombState TimeBombMap_blink = {
|
|
TimeBombMap_blink_Entry,
|
|
TimeBombMap_blink_Exit,
|
|
TimeBombMap_blink_BUTTON,
|
|
TimeBombMap_blink_TIMEOUT,
|
|
TimeBombMap_blink_Default,
|
|
1
|
|
};
|
|
|
|
void TimeBombMap_pause_Entry(struct timebombContext *const fsm)
|
|
{
|
|
struct TimeBomb *ctxt = getOwner(fsm);
|
|
|
|
TimeBomb_armTE(ctxt, OS_TICKS_PER_SEC/2, 0U);
|
|
}
|
|
|
|
#undef TimeBombMap_pause_TIMEOUT
|
|
static void TimeBombMap_pause_TIMEOUT(struct timebombContext *const fsm, Event const *const e)
|
|
{
|
|
struct TimeBomb *ctxt = getOwner(fsm);
|
|
|
|
if (ctxt->blink_ctr > 0U) {
|
|
EXIT_STATE(getState(fsm));
|
|
/* No actions. */
|
|
setState(fsm, &TimeBombMap_blink);
|
|
ENTRY_STATE(getState(fsm));
|
|
}
|
|
else {
|
|
EXIT_STATE(getState(fsm));
|
|
setState(fsm, &TimeBombMap_boom);
|
|
ENTRY_STATE(getState(fsm));
|
|
}
|
|
}
|
|
|
|
const struct TimeBombState TimeBombMap_pause = {
|
|
TimeBombMap_pause_Entry,
|
|
NULL, /* Exit */
|
|
TimeBombMap_pause_BUTTON,
|
|
TimeBombMap_pause_TIMEOUT,
|
|
TimeBombMap_pause_Default,
|
|
2
|
|
};
|
|
|
|
void TimeBombMap_boom_Entry(struct timebombContext *const fsm)
|
|
{
|
|
struct TimeBomb *ctxt = getOwner(fsm);
|
|
|
|
TimeBomb_ledRedOn(ctxt);
|
|
TimeBomb_ledGreenOn(ctxt);
|
|
TimeBomb_ledBlueOn(ctxt);
|
|
}
|
|
|
|
const struct TimeBombState TimeBombMap_boom = {
|
|
TimeBombMap_boom_Entry,
|
|
NULL, /* Exit */
|
|
TimeBombMap_boom_BUTTON,
|
|
TimeBombMap_boom_TIMEOUT,
|
|
TimeBombMap_boom_Default,
|
|
3
|
|
};
|
|
|
|
#ifdef NO_TIMEBOMB_SM_MACRO
|
|
void timebombContext_Init(struct timebombContext *const fsm, struct TimeBomb *const owner)
|
|
{
|
|
FSM_INIT(fsm, &TimeBombMap_wait4button);
|
|
fsm->_owner = owner;
|
|
}
|
|
|
|
void timebombContext_EnterStartState(struct timebombContext *const fsm)
|
|
{
|
|
ENTRY_STATE(getState(fsm));
|
|
}
|
|
|
|
void timebombContext_BUTTON(struct timebombContext *const fsm, Event const *const e)
|
|
{
|
|
const struct TimeBombState* state = getState(fsm);
|
|
|
|
assert(state != NULL);
|
|
setTransition(fsm, "BUTTON");
|
|
state->BUTTON(fsm, e);
|
|
setTransition(fsm, NULL);
|
|
}
|
|
|
|
void timebombContext_TIMEOUT(struct timebombContext *const fsm, Event const *const e)
|
|
{
|
|
const struct TimeBombState* state = getState(fsm);
|
|
|
|
assert(state != NULL);
|
|
setTransition(fsm, "TIMEOUT");
|
|
state->TIMEOUT(fsm, e);
|
|
setTransition(fsm, NULL);
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* Local variables:
|
|
* buffer-read-only: t
|
|
* End:
|
|
*/
|