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.
131 lines
4.0 KiB
C
131 lines
4.0 KiB
C
/* BlinkyButton/Button with uC/AO framework */
|
|
#include "uc_ao.h" /* uC/AO API */
|
|
#include "bsp.h" /* Board Support Package */
|
|
#include <stdbool.h>
|
|
|
|
Q_DEFINE_THIS_MODULE("main") /* this module name for Q_ASSERT() */
|
|
|
|
/* The BlinkyButton AO =======================================================*/
|
|
enum { INITIAL_BLINK_TIME = (OS_TICKS_PER_SEC / 4) };
|
|
|
|
typedef struct {
|
|
Active super; /* inherit Active base class */
|
|
/* add private data for the AO... */
|
|
enum {
|
|
OFF_STATE,
|
|
ON_STATE
|
|
} state; /* the "state variable" */
|
|
|
|
TimeEvent te;
|
|
uint32_t blink_time;
|
|
} BlinkyButton;
|
|
|
|
static void BlinkyButton_dispatch(BlinkyButton * const me, Event const * const e) {
|
|
if (e->sig == INIT_SIG) {
|
|
BSP_ledBlueOff();
|
|
TimeEvent_arm(&me->te, me->blink_time * 3U, 0U);
|
|
me->state = OFF_STATE;
|
|
}
|
|
|
|
switch (me->state) {
|
|
case OFF_STATE: {
|
|
switch (e->sig) {
|
|
case TIMEOUT_SIG: {
|
|
BSP_ledGreenOn();
|
|
TimeEvent_arm(&me->te, me->blink_time, 0U);
|
|
me->state = ON_STATE;
|
|
break;
|
|
}
|
|
case BUTTON_PRESSED_SIG: {
|
|
INT8U err; /* uC/OS-II error status */
|
|
|
|
BSP_ledBlueOn();
|
|
|
|
me->blink_time >>= 1; /* shorten the blink time by factor of 2 */
|
|
if (me->blink_time == 0U) {
|
|
me->blink_time = INITIAL_BLINK_TIME;
|
|
}
|
|
break;
|
|
}
|
|
case BUTTON_RELEASED_SIG: {
|
|
BSP_ledBlueOff();
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case ON_STATE: {
|
|
switch (e->sig) {
|
|
case TIMEOUT_SIG: {
|
|
BSP_ledGreenOff();
|
|
TimeEvent_arm(&me->te, me->blink_time * 3U, 0U);
|
|
me->state = OFF_STATE;
|
|
break;
|
|
}
|
|
case BUTTON_PRESSED_SIG: {
|
|
INT8U err; /* uC/OS-II error status */
|
|
|
|
BSP_ledBlueOn();
|
|
|
|
me->blink_time >>= 1; /* shorten the blink time by factor of 2 */
|
|
if (me->blink_time == 0U) {
|
|
me->blink_time = INITIAL_BLINK_TIME;
|
|
}
|
|
break;
|
|
}
|
|
case BUTTON_RELEASED_SIG: {
|
|
BSP_ledBlueOff();
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default: {
|
|
Q_ASSERT(0); /* invalid state! */
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void BlinkyButton_ctor(BlinkyButton * const me) {
|
|
Active_ctor(&me->super, (DispatchHandler)&BlinkyButton_dispatch);
|
|
TimeEvent_ctor(&me->te, TIMEOUT_SIG, &me->super);
|
|
me->blink_time = INITIAL_BLINK_TIME;
|
|
}
|
|
|
|
OS_STK stack_blinkyButton[100]; /* task stack */
|
|
static Event *blinkyButton_queue[10];
|
|
static BlinkyButton blinkyButton;
|
|
Active *AO_BlinkyButton = &blinkyButton.super;
|
|
|
|
/* the main function =========================================================*/
|
|
int main() {
|
|
INT8U err;
|
|
|
|
BSP_init(); /* initialize the BSP */
|
|
OSInit(); /* initialize uC/OS-II */
|
|
|
|
/* create AO and start it */
|
|
BlinkyButton_ctor(&blinkyButton);
|
|
Active_start(AO_BlinkyButton,
|
|
2U,
|
|
blinkyButton_queue,
|
|
sizeof(blinkyButton_queue)/sizeof(blinkyButton_queue[0]),
|
|
stack_blinkyButton,
|
|
sizeof(stack_blinkyButton),
|
|
0U);
|
|
|
|
BSP_start(); /* configure and start the interrupts */
|
|
|
|
OSStart(); /* start the uC/OS-II scheduler... */
|
|
return 0; /* NOTE: the scheduler does NOT return */
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* NOTE1:
|
|
* The call to uC/OS-II API OSTaskCreateExt() assumes that the pointer to the
|
|
* top-of-stack (ptos) is at the end of the provided stack memory. This is
|
|
* correct only for CPUs with downward-growing stack, but must be changed for
|
|
* CPUs with upward-growing stack.
|
|
*/
|