/*..........................................................................*/ void SysTick_Handler(void) { static uint32_t btn_debounced = USR_SW1; static uint8_t debounce_state = 0U; uint32_t btn; QK_ISR_ENTRY(); /* inform QK about entering an ISR */ #ifdef Q_SPY { uint32_t dummy = SysTick->CTRL; /* clear SysTick_CTRL_COUNTFLAG */ QS_tickTime_ += QS_tickPeriod_; /* account for the clock rollover */ } #endif QF_TICK_X(0U, &l_SysTick_Handler); /* process time events for rate 0 */ /* debounce the SW1 button... */ btn = GPIOF->DATA_Bits[USR_SW1]; /* read the push btn */ switch (debounce_state) { case 0: if (btn != btn_debounced) { debounce_state = 1U; /* transition to the next state */ } break; case 1: if (btn != btn_debounced) { debounce_state = 2U; /* transition to the next state */ } else { debounce_state = 0U; /* transition back to state 0 */ } break; case 2: if (btn != btn_debounced) { debounce_state = 3U; /* transition to the next state */ } else { debounce_state = 0U; /* transition back to state 0 */ } break; case 3: if (btn != btn_debounced) { btn_debounced = btn; /* save the debounced button value */ if (btn == 0U) { /* is the button depressed? */ static QEvt const pauseEvt = { PAUSE_SIG, 0U, 0U}; QF_PUBLISH(&pauseEvt, &l_SysTick_Handler); } else { static QEvt const pauseEvt = { PAUSE_SIG, 0U, 0U}; QF_PUBLISH(&pauseEvt, &l_SysTick_Handler); } } debounce_state = 0U; /* transition back to state 0 */ break; } QK_ISR_EXIT(); /* inform QK about exiting an ISR */ }
/*..........................................................................*/ void QF_onClockTick(void) { QF_TICK_X(0U, (void *)0); /* perform the QF clock tick processing */ if (_kbhit()) { /* any key pressed? */ switch (_getch()) { case '\33': { /* ESC pressed? */ QF_stop(); break; } } } }
void TIMER0_A0_ISR (void) #else #error Compiler not supported! #endif { #ifdef NDEBUG __low_power_mode_off_on_exit(); /* see NOTE1 */ #endif QF_TICK_X(0U, (void *)0); /* process all time events at rate 0 */ }
void SysTick_Handler(void) { QK_ISR_ENTRY(); /* inform QK-nano about ISR entry */ #ifdef Q_SPY uint32_t dummy = SysTick->CTRL; /* clear NVIC_ST_CTRL_COUNT flag */ QS_tickTime_ += QS_tickPeriod_; /* account for the clock rollover */ #endif QF_TICK_X(0U, &l_SysTick_Handler); /* process time events for rate 0 */ QK_ISR_EXIT(); /* inform QK-nano about ISR exit */ }
/*..........................................................................*/ void QF_onClockTick(void) { QF_TICK_X(0U, &l_clock_tick); /* perform the QF clock tick processing */ if (_kbhit()) { /* any key pressed? */ int ch = _getch(); if (ch == '\33') { /* see if the ESC key pressed */ QF_PUBLISH(Q_NEW(QEvt, TERMINATE_SIG), &l_clock_tick); } else if (ch == 'p') { QF_PUBLISH(Q_NEW(QEvt, PAUSE_SIG), &l_clock_tick); } } }
/*..........................................................................*/ void QF_onClockTick(void) { struct timeval timeout = { 0, 0 }; /* timeout for select() */ fd_set con; /* FD set representing the console */ QF_TICK_X(0U, (void *)0); /* process all QF time events at rate 0 */ FD_ZERO(&con); FD_SET(0, &con); /* check if a console input is available, returns immediately */ if (0 != select(1, &con, 0, 0, &timeout)) { /* any descriptor set? */ char ch; read(0, &ch, 1); if (ch == '\33') { /* ESC pressed? */ QF_stop(); } } }
TIMER0_A0_ISR(void) #else #error MSP430 compiler not supported! #endif { /* state of the button debouncing, see below */ static struct ButtonsDebouncing { uint8_t depressed; uint8_t previous; } buttons = { (uint8_t)~0U, (uint8_t)~0U }; uint8_t current; uint8_t tmp; TACTL &= ~TAIFG; /* clear the interrupt pending flag */ #ifdef NDEBUG __low_power_mode_off_on_exit(); /* see NOTE1 */ #endif #ifdef Q_SPY QS_tickTime_ += (((BSP_SMCLK / 8) + BSP_TICKS_PER_SEC/2) / BSP_TICKS_PER_SEC) + 1; #endif QF_TICK_X(0U, (void *)0); /* process all time events at rate 0 */ /* Perform the debouncing of buttons. The algorithm for debouncing * adapted from the book "Embedded Systems Dictionary" by Jack Ganssle * and Michael Barr, page 71. */ current = ~P1IN; /* read P1 port with the state of BTN1 */ tmp = buttons.depressed; /* save the debounced depressed buttons */ buttons.depressed |= (buttons.previous & current); /* set depressed */ buttons.depressed &= (buttons.previous | current); /* clear released */ buttons.previous = current; /* update the history */ tmp ^= buttons.depressed; /* changed debounced depressed */ if ((tmp & BTN1) != 0U) { /* debounced BTN1 state changed? */ if ((buttons.depressed & BTN1) != 0U) { /* is BTN1 depressed? */ static QEvt const pauseEvt = { PAUSE_SIG, 0U, 0U}; QF_PUBLISH(&pauseEvt, &l_timerA_ISR); } else { /* the button is released */ static QEvt const serveEvt = { SERVE_SIG, 0U, 0U}; QF_PUBLISH(&serveEvt, &l_timerA_ISR); } } }
/* ISRs used in the application ==========================================*/ void SysTick_Handler(void) { /* system clock tick ISR */ /* state of the button debouncing, see below */ static struct ButtonsDebouncing { uint32_t depressed; uint32_t previous; } buttons = { ~0U, ~0U }; uint32_t current; uint32_t tmp; QK_ISR_ENTRY(); /* inform QK about entering an ISR */ #ifdef Q_SPY { tmp = SysTick->CTRL; /* clear CTRL_COUNTFLAG */ QS_tickTime_ += QS_tickPeriod_; /* account for the clock rollover */ } #endif QF_TICK_X(0U, &l_SysTick_Handler); /* process time events for rate 0 */ /* get state of the user button */ /* Perform the debouncing of buttons. The algorithm for debouncing * adapted from the book "Embedded Systems Dictionary" by Jack Ganssle * and Michael Barr, page 71. */ current = ~GPIOC->IDR; /* read Port C with the state of Button B1 */ tmp = buttons.depressed; /* save the debounced depressed buttons */ buttons.depressed |= (buttons.previous & current); /* set depressed */ buttons.depressed &= (buttons.previous | current); /* clear released */ buttons.previous = current; /* update the history */ tmp ^= buttons.depressed; /* changed debounced depressed */ if ((tmp & BTN_B1) != 0U) { /* debounced B1 state changed? */ if ((buttons.depressed & BTN_B1) != 0U) { /* is B1 depressed? */ static QEvt const pauseEvt = { PAUSE_SIG, 0U, 0U}; QF_PUBLISH(&pauseEvt, &l_SysTick_Handler); } else { /* the button is released */ static QEvt const serveEvt = { SERVE_SIG, 0U, 0U}; QF_PUBLISH(&serveEvt, &l_SysTick_Handler); } } QK_ISR_EXIT(); /* inform QK about exiting an ISR */ }
/*..........................................................................*/ void SysTick_Handler(void) { /* state of the button debouncing, see below */ static struct ButtonsDebouncing { uint32_t depressed; uint32_t previous; } buttons = { ~0U, ~0U }; uint32_t current; uint32_t volatile tmp; QK_ISR_ENTRY(); /* inform QK about ISR entry */ ++l_nTicks; /* count the number of clock ticks */ #ifdef Q_SPY tmp = SysTick->CTRL; /* clear SysTick_CTRL_COUNTFLAG */ QS_tickTime_ += QS_tickPeriod_; /* account for the clock rollover */ #endif QF_TICK_X(0U, &l_SysTick_Handler); /* process time events for rate 0 */ /* Perform the debouncing of buttons. The algorithm for debouncing * adapted from the book "Embedded Systems Dictionary" by Jack Ganssle * and Michael Barr, page 71. */ current = ~GPIOF->DATA_Bits[USER_BTN]; /* read USER_BTN */ tmp = buttons.depressed; /* save the debounced depressed buttons */ buttons.depressed |= (buttons.previous & current); /* set depressed */ buttons.depressed &= (buttons.previous | current); /* clear released */ buttons.previous = current; /* update the history */ tmp ^= buttons.depressed; /* changed debounced depressed */ if ((tmp & USER_BTN) != 0U) { /* debounced USER_BTN state changed? */ if ((buttons.depressed & USER_BTN) != 0U) { /* is BTN depressed? */ static QEvt const bd = { BTN_DOWN_SIG, 0U, 0U }; QF_PUBLISH(&bd, &l_SysTick_Handler); } else { /* the button is released */ static QEvt const bu = { BTN_UP_SIG, 0U, 0U }; QF_PUBLISH(&bu, &l_SysTick_Handler); } } QK_ISR_EXIT(); /* inform QK about ISR exit */ }
/* ISRs --------------------------------------------------------------------*/ __ramfunc static void ISR_tick(void) { /* state of the button debouncing, see below */ static struct ButtonsDebouncing { uint32_t depressed; uint32_t previous; } buttons = { ~0U, ~0U }; uint32_t current; uint32_t volatile tmp; /* clear the interrupt source */ tmp = AT91C_BASE_PITC->PITC_PIVR; QF_TICK_X(0U, &l_ISR_tick); /* process all time events at tick rate 0 */ /* Perform the debouncing of buttons. The algorithm for debouncing * adapted from the book "Embedded Systems Dictionary" by Jack Ganssle * and Michael Barr, page 71. */ current = ~AT91C_BASE_PIOA->PIO_PDSR;/* read PIOA with state of Buttons */ tmp = buttons.depressed; /* save the debounced depressed buttons */ buttons.depressed |= (buttons.previous & current); /* set depressed */ buttons.depressed &= (buttons.previous | current); /* clear released */ buttons.previous = current; /* update the history */ tmp ^= buttons.depressed; /* changed debounced depressed */ if ((tmp & l_btn[0]) != 0U) { /* debounced BTN_P1 state changed? */ if ((buttons.depressed & l_btn[0]) != 0U) { /* is BTN_P1 depressed? */ static QEvt const pauseEvt = { PAUSE_SIG, 0U, 0U}; QF_PUBLISH(&pauseEvt, &l_ISR_tick); } else { /* the button is released */ static QEvt const serveEvt = { SERVE_SIG, 0U, 0U}; QF_PUBLISH(&serveEvt, &l_ISR_tick); } } }
__interrupt void timer2_ISR(void) { /* state of the button debouncing, see below */ static struct ButtonsDebouncing { uint8_t depressed; uint8_t previous; } buttons = { 0xFFU, 0xFFU }; uint8_t current; uint8_t tmp; QF_TICK_X(0U, &l_ISR_TIMER2_COMPA); /* process time events at rate 0 */ #ifdef Q_SPY BSP_tickTime += (F_CPU / BSP_TICKS_PER_SEC / 1024U); #endif /* Perform the debouncing of buttons. The algorithm for debouncing * adapted from the book "Embedded Systems Dictionary" by Jack Ganssle * and Michael Barr, page 71. */ current = PIND; /* read PORTD with the state of BTN_EXT */ tmp = buttons.depressed; /* save the debounced depressed buttons */ buttons.depressed |= (buttons.previous & current); /* set depressed */ buttons.depressed &= (buttons.previous | current); /* clear released */ buttons.previous = current; /* update the history */ tmp ^= buttons.depressed; /* changed debounced depressed */ if ((tmp & BTN_EXT) != 0U) { /* debounced BTN_EXT state changed? */ if ((buttons.depressed & BTN_EXT) != 0U) { /* is BTN_EXT depressed? */ static QEvt const pauseEvt = { PAUSE_SIG, 0U, 0U}; QF_PUBLISH(&pauseEvt, &l_ISR_TIMER2_COMPA); } else { /* the button is released */ static QEvt const serveEvt = { SERVE_SIG, 0U, 0U}; QF_PUBLISH(&serveEvt, &l_ISR_TIMER2_COMPA); } } }
/*..........................................................................*/ void QF_onRtxTicker() { QF_TICK_X(0U, (void *)0); /* process all QF time events at tick rate 0 */ }
/*..........................................................................*/ void SysTick_Handler(void) { /* system clock tick ISR */ QF_TICK_X(0U, (void *)0); /* process all armed time events */ }
/*..........................................................................*/ void QF_onClockTick(void) { static QEvt const tickEvt = { TIME_TICK_SIG, 0U, 0U }; QF_TICK_X(0U, &l_clock_tick); /* process time events for rate 0 */ QF_PUBLISH(&tickEvt, &l_clock_tick); /* publish the tick event */ }