Tyler Weaver
/
qp_hangman
Hangman game using qp a 16x2 LCD and joystick.
Diff: player.cpp
- Revision:
- 1:4efaebc256d3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/player.cpp Thu Feb 09 03:57:44 2012 +0000 @@ -0,0 +1,100 @@ +#include "qp_port.h" +#include "dpp.h" +#include "bsp.h" + +Q_DEFINE_THIS_FILE + +class Player : public QActive { +private: + QTimeEvt m_timeEvt; // to timeout update joystick pos + uint8_t wins; + uint8_t losses; + +public: + Player(); + +private: + static QState initial (Player *me, QEvent const *e); + static QState thinking(Player *me, QEvent const *e); + static QState playing (Player *me, QEvent const *e); +}; + +static Player l_player; + +#define JOY_TIME (BSP_TICKS_PER_SEC/5) // update joystick position every 5 ticks + +enum InternalSignals { // internal signals + TIMEOUT_SIG = MAX_SIG +}; + +QActive * const AO_Player = l_player; + +//............................................................................ +Player::Player() + : QActive((QStateHandler)&Player::initial), + m_timeEvt(TIMEOUT_SIG) +{} +//............................................................................ +QState Player::initial(Player *me, QEvent const *) { + static uint8_t registered; // starts off with 0, per C-standard + if (!registered) { + QS_OBJ_DICTIONARY(&l_player); + QS_OBJ_DICTIONARY(&l_player.m_timeEvt); + + QS_FUN_DICTIONARY(&Player::initial); + QS_FUN_DICTIONARY(&Player::thinking); + QS_FUN_DICTIONARY(&Player::playing); + + registered = (uint8_t)1; + } + + QS_SIG_DICTIONARY(PLAY_SIG, me); // signal for each Players + QS_SIG_DICTIONARY(FINISHED_SIG, me); // signal for each Players + + // init wins and losses ctr + wins = losses = 0; + + return Q_TRAN(&Player::thinking); // go to thinking +} +//............................................................................ +QState Player::thinking(Player *me, QEvent const *) { + switch (e->sig) { + case Q_ENTRY_SIG: { + // TODO : INITIALIZE BTN + } + case BUTTON_SIG: { + return Q_TRAN(&Player::playing); // go to playing state + } + } + return Q_SUPER(&QHsm::top); +} +//............................................................................ +QState Player::playing(Player *me, QEvent const *) { + switch (e->sig) { + case Q_ENTRY_SIG: { + me->m_timeEvt.postIn(me, JOY_TIME); // init joystick update (TIMEOUT_SIG) + // TODO : INITIALIZE BTN + return Q_HANDLED(); + } + case TIMEOUT_SIG: { + int pos = BSP_joyUpdate(); + HostEvt *pe = Q_NEW(HostEvt, SCROLL_SIG); + pe->scroll_pos = pos; + QF::PUBLISH(pe, me); + } + case BUTTON_SIG: { + HostEvt *pe = Q_NEW(HostEvt, SELECT_SIG); + pe->scroll_pos = 0; // no change + QF::PUBLISH(pe, me); + } + case FINISHED_SIG: { + if(((HostEvt *)e)->scroll_pos == 1) // win + wins++; + else + losses++; + + return Q_TRAN(&Player::thinking); // go to thinking state + } + } + return Q_SUPER(&QHsm::top); +} \ No newline at end of file