Ejemplo n.º 1
0
/**
 * \brief Send an ICMPv6 Echo Request to Neighbor
 * 
 * \param Destination Neighbor_AO
 */
void uip_icmp6_echo_request_output_to_neighbor(Neighbor_AO * neighbor)
{
	NewDataEvent *e;
	struct uip_icmpip_hdr * icmpip_hdr;
	static QEvent const ps_sig = { PACKET_SENT_SIG};
	e= Q_NEW(NewDataEvent, SEND_DATA_SIG);
	icmpip_hdr = ( struct uip_icmpip_hdr *) &e->buf[UIP_LLH_LEN];

	
	set_eth_src_addr_local(e);
	set_eth_dst_addr(e, &neighbor->lladdr);
	
	/* IP header fields */
  icmpip_hdr->vtc = 0x60;
  icmpip_hdr->tcf = 0;
  icmpip_hdr->flow = 0;
  icmpip_hdr->proto = UIP_PROTO_ICMP6;
  icmpip_hdr->ttl = UIP_ND6_HOP_LIMIT;
	
	memcpy(&icmpip_hdr->destipaddr, &neighbor->ipaddr, sizeof(uip_ipaddr_t));
	memcpy(&icmpip_hdr->srcipaddr, &uip_hostaddr, sizeof(uip_ipaddr_t));
	
	icmpip_hdr->len[0] = 0; /* length will not be more than 255 */
	icmpip_hdr->len[1] = UIP_ICMPH_LEN + UIP_ICMP_QUENCH_LEN+ 32;
	
	e->len = UIP_LLH_LEN + UIP_IPH_LEN + UIP_ICMPH_LEN + UIP_ICMP_QUENCH_LEN + 32;
	icmpip_hdr->type = ICMP6_ECHO_REQUEST;
  icmpip_hdr->icode = 0;
	//ICMP QUENCH
	icmpip_hdr->id = htons(0x0002);
	icmpip_hdr->seq = htons(neighbor->icmp_seq);
	neighbor->icmp_seq++;
	
  icmpip_hdr->icmpchksum = 0;
  icmpip_hdr->icmpchksum = ~upper_layer_chksum6((unsigned char *) &e->buf);

	QF_publish((QEvent *) e);
	QActive_postFIFO((QActive *)neighbor, &ps_sig);
}
Ejemplo n.º 2
0
//${AOs::Philo::SM::eating} ..................................................
Q_STATE_DEF(Philo, eating) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Philo::SM::eating}
        case Q_ENTRY_SIG: {
            m_timeEvt.armX(eat_time(), 0U);
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Philo::SM::eating}
        case Q_EXIT_SIG: {
            TableEvt *pe = Q_NEW(TableEvt, DONE_SIG);
            pe->philoNum = PHILO_ID(this);
            QP::QF::PUBLISH(pe, this);
            (void)m_timeEvt.disarm();
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Philo::SM::eating::TIMEOUT}
        case TIMEOUT_SIG: {
            status_ = tran(&thinking);
            break;
        }
        //${AOs::Philo::SM::eating::EAT, DONE}
        case EAT_SIG: // intentionally fall through
        case DONE_SIG: {
            // EAT or DONE must be for other Philos than this one
            Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this));
            status_ = Q_RET_HANDLED;
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
Ejemplo n.º 3
0
//${Comp::Philo::SM::hungry} .................................................
Q_STATE_DEF(Philo, hungry) {
    QP::QState status_;
    switch (e->sig) {
        //${Comp::Philo::SM::hungry}
        case Q_ENTRY_SIG: {
            TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG);
            pe->philo = this;
            AO_Table->postLIFO(pe);
            status_ = Q_RET_HANDLED;
            break;
        }
        //${Comp::Philo::SM::hungry::EAT}
        case EAT_SIG: {
            status_ = tran(&eating);
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
Ejemplo n.º 4
0
/*..........................................................................*/
QState Philo_hungry(Philo *me, QEvt const *e) {
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG);
            pe->philoNum = PHILO_ID(me);
            QACTIVE_POST(AO_Table, (QEvt *)pe, me);
            return Q_HANDLED();
        }
        case EAT_SIG: {
            if (((TableEvt const *)e)->philoNum == PHILO_ID(me)) {
                BSP_busyDelay();
                return Q_TRAN(&Philo_eating);
            }
            break;
        }
        case DONE_SIG: {
                             /* DONE must be for other Philos than this one */
            Q_ASSERT(((TableEvt const *)e)->philoNum != PHILO_ID(me));
            return Q_HANDLED();
        }
    }
    return Q_SUPER(&QHsm_top);
}
Ejemplo n.º 5
0
/* @(/2/0/9/1/2/12) ........................................................*/
QState CoffeeAO_coffeePotToggle(CoffeeAO * const me, QEvt const * const e) {
    QState status_;
    switch (e->sig) {
        /* @(/2/0/9/1/2/12) */
        case Q_ENTRY_SIG: {
            l_CoffeeAO.is_coffee_pot_in_machine = l_CoffeeAO.is_coffee_pot_in_machine == 0 ? 1 : 0;
            QActive_postFIFO((QActive *)&l_CoffeeAO, Q_NEW(QEvent, GO_BACK_SIG));
            status_ = Q_HANDLED();
            break;
        }
        /* @(/2/0/9/1/2/12) */
        case Q_EXIT_SIG: {
            printf("toggled coffee pot in machine to: %u\n", l_CoffeeAO.is_coffee_pot_in_machine);
            status_ = Q_HANDLED();
            break;
        }
        default: {
            status_ = Q_SUPER(&CoffeeAO_submenu);
            break;
        }
    }
    return status_;
}
Ejemplo n.º 6
0
//${AOs::Philo::SM::hungry} ..................................................
Q_STATE_DEF(Philo, hungry) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Philo::SM::hungry}
        case Q_ENTRY_SIG: {
            TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG);
            pe->philoNum = PHILO_ID(this);
            AO_Table->POST(pe, this);
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Philo::SM::hungry::EAT}
        case EAT_SIG: {
            //${AOs::Philo::SM::hungry::EAT::[Q_EVT_CAST(TableEvt)->philoNum=~}
            if (Q_EVT_CAST(TableEvt)->philoNum == PHILO_ID(this)) {
                status_ = tran(&eating);
            }
            else {
                status_ = Q_RET_UNHANDLED;
            }
            break;
        }
        //${AOs::Philo::SM::hungry::DONE}
        case DONE_SIG: {
            /* DONE must be for other Philos than this one */
            Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this));
            status_ = Q_RET_HANDLED;
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
Ejemplo n.º 7
0
//............................................................................
QState Philo::eating(Philo *me, QEvt const *e) {
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            me->m_timeEvt.postIn(me, EAT_TIME);
            return Q_HANDLED();
        }
        case Q_EXIT_SIG: {
            TableEvt *pe = Q_NEW(TableEvt, DONE_SIG);
            pe->philoNum = PHILO_ID(me);
            QF::PUBLISH(pe, me);
            return Q_HANDLED();
        }
        case TIMEOUT_SIG: {
            return Q_TRAN(&Philo::thinking);
        }
        case EAT_SIG:                            // intentionally fall-through
        case DONE_SIG: {
                         // EAT or DONE must be for other Philos than this one
            Q_ASSERT(((TableEvt const *)e)->philoNum != PHILO_ID(me));
            return Q_HANDLED();
        }
    }
    return Q_SUPER(&QHsm::top);
}
Ejemplo n.º 8
0
/*..........................................................................*/
static void Cache_read(Cache *me, QEvent const *e)
{
	CacheRWEvt *pe = (CacheRWEvt *)e;
	CacheRWRly *re;
	int reply = CACHE_READ_REPLY_SIG;
	
	re = Q_NEW(CacheRWRly, reply);

	QS_BEGIN(QS_CACHE_RW, QS_apObj_);
	QS_U32_HEX(8, pe->sector);
	QS_U32_HEX(8, pe->track);
	QS_U32_HEX(4, pe->offset);
	QS_U32_HEX(4, pe->len);
	QS_U32_HEX(2, pe->flags);
	QS_END();
	
	Track_dispatch(pe->conf, e);

	/* doing a fake bio finish */
	re->conf  = pe->conf;
	re->errno = 0;
	re->buf.bio.bi = pe->buf.bio.bi;
	QACTIVE_POST(pe->ao, (QEvent *)re, AO_cache);
}
Ejemplo n.º 9
0
/*..........................................................................*/
QState Philo_eating(Philo *me, QEvent const *e) {
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            QTimeEvt_postIn(&me->timeEvt, (QActive *)me, EAT_TIME);
            return Q_HANDLED();
        }
        case Q_EXIT_SIG: {
            TableEvt *pe = Q_NEW(TableEvt, DONE_SIG);
            pe->philoNum = PHILO_ID(me);
            QF_PUBLISH((QEvent *)pe, me);
            return Q_HANDLED();
        }
        case TIMEOUT_SIG: {
            return Q_TRAN(&Philo_thinking);
        }
        case EAT_SIG:                         /* intentionally fall-through */
        case DONE_SIG: {
                      /* EAT or DONE must be for other Philos than this one */
            Q_ASSERT(((TableEvt const *)e)->philoNum != PHILO_ID(me));
            return Q_HANDLED();
        }
    }
    return Q_SUPER(&QHsm_top);
}
Ejemplo n.º 10
0
// @(/3/0/2/3) ...............................................................
QP::QState Philo::eating(Philo * const me, QP::QEvt const * const e) {
    QP::QState status_;
    switch (e->sig) {
        // @(/3/0/2/3)
        case Q_ENTRY_SIG: {
            me->m_timeEvt.armX(think_time());
            status_ = Q_HANDLED();
            break;
        }
        // @(/3/0/2/3)
        case Q_EXIT_SIG: {
            QP::QF::PUBLISH(Q_NEW(TableEvt, DONE_SIG, PHILO_ID(me)), me);
            (void)me->m_timeEvt.disarm();
            status_ = Q_HANDLED();
            break;
        }
        // @(/3/0/2/3/0)
        case TIMEOUT_SIG: {
            status_ = Q_TRAN(&Philo::thinking);
            break;
        }
        // @(/3/0/2/3/1)
        case EAT_SIG: // intentionally fall through
        case DONE_SIG: {
            /* EAT or DONE must be for other Philos than this one */
            Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(me));
            status_ = Q_HANDLED();
            break;
        }
        default: {
            status_ = Q_SUPER(&QHsm::top);
            break;
        }
    }
    return status_;
}
Ejemplo n.º 11
0
QP::QState Missile::exploding(Missile * const me, QP::QEvt const * const e) {
    QP::QState status_;
    switch (e->sig) {
    // @(/3/2/4/3/0)
    case TIME_TICK_SIG: {
        // @(/3/2/4/3/0/0)
        if ((me->m_x >= GAME_SPEED_X) && (me->m_exp_ctr < 15U)) {
            ++me->m_exp_ctr;           // advance the explosion counter
            me->m_x -= GAME_SPEED_X;   // move the explosion by one step

            // tell the Tunnel to render the current stage of Explosion
            ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG);
            oie->x   = me->m_x + 3U;   // x-pos of explosion
            oie->y   = (int8_t)((int)me->m_y - 4U); // y-pos
            oie->bmp = EXPLOSION0_BMP + (me->m_exp_ctr >> 2);
            AO_Tunnel->POST(oie, me);
            status_ = QM_HANDLED();
        }
        // @(/3/2/4/3/0/1)
        else {
            status_ = QM_TRAN(&armed_s, QP::QMsm::s_emptyAction_);
        }
        break;
    }
Ejemplo n.º 12
0
/*..........................................................................*/
QState Mine2_planted(Mine2 *me, QEvt const *e) {
    uint8_t x;
    uint8_t y;
    uint8_t bmp;

    switch (e->sig) {
        case TIME_TICK_SIG: {
            if (me->x >= GAME_SPEED_X) {
                ObjectImageEvt *oie;

                me->x -= GAME_SPEED_X;              /* move the mine 1 step */

                /* tell the Tunnel to draw the Mine */
                oie = Q_NEW(ObjectImageEvt, MINE_IMG_SIG);
                oie->x   = me->x;
                oie->y   = me->y;
                oie->bmp = MINE2_BMP;
                QACTIVE_POST(AO_Tunnel, (QEvt *)oie, me);
            }
            else {
                return Q_TRAN(&Mine2_unused);
            }
            return Q_HANDLED();
        }
        case SHIP_IMG_SIG: {
            x   = (uint8_t)((ObjectImageEvt const *)e)->x;
            y   = (uint8_t)((ObjectImageEvt const *)e)->y;
            bmp = (uint8_t)((ObjectImageEvt const *)e)->bmp;

            /* test for incoming Ship hitting this mine */
            if (do_bitmaps_overlap(MINE2_BMP, me->x, me->y, bmp, x, y)) {
                static MineEvt const mine2_hit = {
                    { HIT_MINE_SIG, 0, 0 },     /* the QEvt base instance */
                    2               /* type of the mine (2 for type-2 mine) */
                };
                QACTIVE_POST(AO_Ship, (QEvt *)&mine2_hit, me);

                /* go straight to 'disabled' and let the Ship do
                * the exploding
                */
                return Q_TRAN(&Mine2_unused);
            }
            return Q_HANDLED();
        }
        case MISSILE_IMG_SIG: {
            x   = (uint8_t)((ObjectImageEvt const *)e)->x;
            y   = (uint8_t)((ObjectImageEvt const *)e)->y;
            bmp = (uint8_t)((ObjectImageEvt const *)e)->bmp;

            /* test for incoming Missile hitting this mine */
            /* NOTE: Mine type-2 is nastier than Mine type-1.
            * The type-2 mine can hit the Ship with any of its
            * "tentacles". However, it can be destroyed by the
            * Missile only by hitting its center, defined as
            * a smaller bitmap MINE2_MISSILE_BMP.
            */
            if (do_bitmaps_overlap(MINE2_MISSILE_BMP,
                                   me->x, me->y, bmp, x, y))
            {
               static ScoreEvt const mine2_destroyed = {
                    { DESTROYED_MINE_SIG, 0, 0 },/*the QEvt base instance */
                    45                  /* score for destroying Mine type-2 */
                };
                QACTIVE_POST(AO_Missile, (QEvt *)&mine2_destroyed, me);
                return Q_TRAN(&Mine2_exploding);
            }
            return Q_HANDLED();
        }
    }
    return Q_SUPER(&Mine2_used);
}
void PIOINT0_IRQHandler(void) {
                                                             /* for testing */
    QACTIVE_POST(AO_Table, Q_NEW(QEvt, MAX_PUB_SIG), &l_PIOINT0_IRQHandler);
}
Ejemplo n.º 14
0
void My_UI_KeyboardImpl_sendPoint (My_UI_KeyboardImpl* mepl) {
    KeyEvent* ke = Q_NEW(KeyEvent, MY_CALC_POINT_SIG);
    ke->keyId = '.';
    QF_publish((QEvent*)ke);
}
Ejemplo n.º 15
0
void My_UI_KeyboardImpl_sendOperator (My_UI_KeyboardImpl* mepl, char arg1) {
    KeyEvent* ke = Q_NEW(KeyEvent, MY_CALC_OPER_SIG);
    ke->keyId = arg1;
    QF_publish((QEvent*)ke);
}
Ejemplo n.º 16
0
/* ${AOs::Philo::SM::hungry} */
static QState Philo_hungry_e(Philo * const me) {
    TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG);
    pe->philoNum = PHILO_ID(me);
    QACTIVE_POST(AO_Table, &pe->super, me);
    return QM_ENTRY(&Philo_hungry_s);
}
Ejemplo n.º 17
0
static QState Ship_flying(Ship * const me, QEvt const * const e) {
    QState status_;
    switch (e->sig) {
        /* @(/2/1/4/1/3/0) */
        case TIME_TICK_SIG: {
            /* tell the Tunnel to draw the Ship and test for hits */
            ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, SHIP_IMG_SIG);
            oie->x   = me->x;
            oie->y   = me->y;
            oie->bmp = SHIP_BMP;
            QACTIVE_POST(AO_Tunnel, (QEvt *)oie, me);

            ++me->score; /* increment the score for surviving another tick */

            if ((me->score % 10U) == 0U) { /* is the score "round"? */
                ScoreEvt *sev = Q_NEW(ScoreEvt, SCORE_SIG);
                sev->score = me->score;
                QACTIVE_POST(AO_Tunnel, (QEvt *)sev, me);
            }
            status_ = QM_HANDLED();
            break;
        }
        /* @(/2/1/4/1/3/1) */
        case PLAYER_TRIGGER_SIG: {
            ObjectPosEvt *ope = Q_NEW(ObjectPosEvt, MISSILE_FIRE_SIG);
            ope->x = me->x;
            ope->y = me->y + SHIP_HEIGHT - 1U;
            QACTIVE_POST(AO_Missile, (QEvt *)ope, me);
            status_ = QM_HANDLED();
            break;
        }
        /* @(/2/1/4/1/3/2) */
        case DESTROYED_MINE_SIG: {
            me->score += Q_EVT_CAST(ScoreEvt)->score;
            /* the score will be sent to the Tunnel by the next TIME_TICK */
            status_ = QM_HANDLED();
            break;
        }
        /* @(/2/1/4/1/3/3) */
        case HIT_WALL_SIG: {
            static QActionHandler const act_[] = {
                Q_ACTION_CAST(&Ship_exploding_e),
                Q_ACTION_CAST(0)
            };
            status_ = QM_TRAN(&Ship_exploding_s, &act_[0]);
            break;
        }
        /* @(/2/1/4/1/3/4) */
        case HIT_MINE_SIG: {
            static QActionHandler const act_[] = {
                Q_ACTION_CAST(&Ship_exploding_e),
                Q_ACTION_CAST(0)
            };
            status_ = QM_TRAN(&Ship_exploding_s, &act_[0]);
            break;
        }
        default: {
            status_ = QM_SUPER();
            break;
        }
    }
    return status_;
}
Ejemplo n.º 18
0
const DC3Error_t DB_write(
      const DC3DBElem_t elem,
      const DC3AccessType_t accessType,
      const size_t bufSize,
      const uint8_t* const pBuffer
)
{
   DC3Error_t status = ERR_NONE; /* keep track of success/failure of operations. */

   /* 1. Find where the element lives */
   DB_ElemLoc_t loc = settingsDB[elem].loc;

   /* 2. Call the location dependent functions to write the data to DB */
   switch( loc ) {
      case DB_EEPROM:
         if ( _DC3_ACCESS_BARE == accessType ) {
            uint16_t bytesWritten = 0;
            status = I2C_writeDevMem(
                  accessType,                         // const DC3AccessType_t accessType,
                  DB_I2C_devices[loc],                // const DC3I2CDevice_t iDev,
                  settingsDB[elem].offset,            // const uint16_t offset,
                  settingsDB[elem].size,              // const uint16_t bytesToWrite,
                  bufSize,                            // const uint16_t  bufSize
                  pBuffer,                            // const uint8_t* const pBuffer
                  &bytesWritten                       // uint16_t* pBytesWritten
            );

            if ( ERR_NONE == status ) {      /* Only check length if no error */
               if ( bytesWritten != settingsDB[elem].size ) {
                  status = ERR_DB_ELEM_LENGTH_WRITE_MISMATCH;
                  goto DB_write_ERR_HANDLE; /* Stop and jump to error handling */
               }
            }

         } else {
            /* Create the event and directly post it to the right AO. */
            I2CWriteReqEvt *i2cWriteReqEvt = Q_NEW(I2CWriteReqEvt, I2C1_DEV_RAW_MEM_WRITE_SIG);
            i2cWriteReqEvt->i2cDev         = DB_getI2CDev(loc);
            i2cWriteReqEvt->start          = settingsDB[elem].offset;
            i2cWriteReqEvt->bytes          = settingsDB[elem].size;
            i2cWriteReqEvt->accessType     = accessType;
            MEMCPY(i2cWriteReqEvt->dataBuf, pBuffer, i2cWriteReqEvt->bytes);
            QACTIVE_POST(AO_I2C1DevMgr, (QEvt *)(i2cWriteReqEvt), SysMgr_AO);
         }
         break;
      case DB_SN_ROM:                           /* Fall through intentionally */
      case DB_UI_ROM:                           /* Fall through intentionally */
      case DB_GPIO:                             /* Fall through intentionally */
      case DB_FLASH:                            /* Fall through intentionally */
         status = ERR_DB_ELEM_IS_READ_ONLY;
         goto DB_write_ERR_HANDLE;
         break;
         /* Add more locations here. Anything that fails will go to the default
          * case and get logged as an error. */
      default:
         status = ERR_DB_ELEM_NOT_FOUND;
         goto DB_write_ERR_HANDLE;
         break;
   }

DB_write_ERR_HANDLE:              /* Handle any error that may have occurred. */
   ERR_COND_OUTPUT( status, accessType,
         "DB write of element %s (%d) to DB: Error 0x%08x\n",
         CON_dbElemToStr( elem ), elem, status );
   return( status );
}
Ejemplo n.º 19
0
const DC3Error_t DB_initToDefault( const DC3AccessType_t accessType )
{
   DC3Error_t status = ERR_NONE;            /* keep track of success/failure */

   switch( accessType ) {
      case _DC3_ACCESS_BARE:
         status = DB_write(
               _DC3_DB_MAGIC_WORD,
               accessType,
               sizeof(DB_defaultEepromSettings.dbMagicWord),
               (uint8_t *)&DB_defaultEepromSettings.dbMagicWord
         );
         if ( ERR_NONE != status ) {
            goto DB_initToDefault_ERR_HANDLE;
         }

         status = DB_write(
               _DC3_DB_VERSION,
               accessType,
               sizeof(DB_defaultEepromSettings.dbVersion),
               (uint8_t *)&DB_defaultEepromSettings.dbVersion
         );
         if ( ERR_NONE != status ) {
            goto DB_initToDefault_ERR_HANDLE;
         }

         status = DB_write(
               _DC3_DB_IP_ADDR,
               accessType,
               sizeof(DB_defaultEepromSettings.ipAddr),
               (uint8_t *)&DB_defaultEepromSettings.ipAddr
         );
         if ( ERR_NONE != status ) {
            goto DB_initToDefault_ERR_HANDLE;
         }

         break;                               /* end of case _DC3_ACCESS_BARE */

      case _DC3_ACCESS_QPC:{;
         /* Create the event and directly post it to the right AO. */
         I2CWriteReqEvt *i2cWriteReqEvt  = Q_NEW(I2CWriteReqEvt, I2C1_DEV_RAW_MEM_WRITE_SIG);
         i2cWriteReqEvt->i2cDev          = DB_getI2CDev(_DC3_DB_MAGIC_WORD);
         i2cWriteReqEvt->start           = DB_getElemOffset(_DC3_DB_MAGIC_WORD);
         i2cWriteReqEvt->bytes           = sizeof(DB_defaultEepromSettings);
         i2cWriteReqEvt->accessType      = accessType;
         MEMCPY(i2cWriteReqEvt->dataBuf, &DB_defaultEepromSettings, sizeof(DB_defaultEepromSettings));
         QACTIVE_POST(AO_I2C1DevMgr, (QEvt *)(i2cWriteReqEvt), SysMgr_AO);
         goto DB_initToDefault_ERR_HANDLE; /* Stop and jump to error handling */
      }
      break;                                        /* end of case ACCESS_QPC */
      case  _DC3_ACCESS_FRT:
         status = ERR_UNIMPLEMENTED;
         goto DB_initToDefault_ERR_HANDLE; /* Stop and jump to error handling */
         break;                                /* end of case ACCESS_FREERTOS */

      default:
         status = ERR_UNIMPLEMENTED;
         goto DB_initToDefault_ERR_HANDLE; /* Stop and jump to error handling */
         break;                                        /* end of default case */

   }                                               /* End of switch statement */

DB_initToDefault_ERR_HANDLE:      /* Handle any error that may have occurred. */
   ERR_COND_OUTPUT( status, accessType,
         "Initializing DB to default: Error 0x%08x\n",
         status );
   return( status );
}
Ejemplo n.º 20
0
//............................................................................
QState Table::serving(Table *me, QEvt const *e) {
    uint8_t n, m;
    TableEvt *pe;

    switch (e->sig) {
        case Q_ENTRY_SIG: {
            displyTableStat("serving");
            for (n = 0; n < N_PHILO; ++n) {      // give permissions to eat...
                if (me->m_isHungry[n]
                    && (me->m_fork[LEFT(n)] == FREE)
                        && (me->m_fork[n] == FREE))
                {
                    me->m_fork[LEFT(n)] = me->m_fork[n] = USED;
                    pe = Q_NEW(TableEvt, EAT_SIG);
                    pe->philoNum = n;
                    QF::PUBLISH(pe, me);
                    me->m_isHungry[n] = 0;
                    displyPhilStat(n, "eating  ");
                }
            }
            return Q_HANDLED();
        }
        case HUNGRY_SIG: {
            n = ((TableEvt *)e)->philoNum;
            Q_ASSERT(n < N_PHILO && !me->m_isHungry[n]);
            displyPhilStat(n, "hungry  ");
            m = LEFT(n);
            if (me->m_fork[m] == FREE && me->m_fork[n] == FREE) {
                me->m_fork[m] = me->m_fork[n] = USED;
                pe = Q_NEW(TableEvt, EAT_SIG);
                pe->philoNum = n;
                QF::PUBLISH(pe, me);
                displyPhilStat(n, "eating  ");
            }
            else {
                me->m_isHungry[n] = 1;
            }
            return Q_HANDLED();
        }
        case DONE_SIG: {
            n = ((TableEvt *)e)->philoNum;
            Q_ASSERT(n < N_PHILO);
            displyPhilStat(n, "thinking");
            me->m_fork[LEFT(n)] = me->m_fork[n] = FREE;
            m = RIGHT(n);                          // check the right neighbor
            if (me->m_isHungry[m] && me->m_fork[m] == FREE) {
                me->m_fork[n] = me->m_fork[m] = USED;
                me->m_isHungry[m] = 0;
                pe = Q_NEW(TableEvt, EAT_SIG);
                pe->philoNum = m;
                QF::PUBLISH(pe, me);
                displyPhilStat(m, "eating  ");
            }
            m = LEFT(n);                            // check the left neighbor
            n = LEFT(m);
            if (me->m_isHungry[m] && me->m_fork[n] == FREE) {
                me->m_fork[m] = me->m_fork[n] = USED;
                me->m_isHungry[m] = 0;
                pe = Q_NEW(TableEvt, EAT_SIG);
                pe->philoNum = m;
                QF::PUBLISH(pe, me);
                displyPhilStat(m, "eating  ");
            }
            return Q_HANDLED();
        }
        case PAUSE_SIG:                             // "Toggle" button pressed
        case KEY_CENTER_PRESS_SIG: {                 // hardkey CENTER pressed
            return Q_TRAN(&Table::paused);
        }
    }
    return Q_SUPER(&Table::ready);
}
Ejemplo n.º 21
0
/* ${AOs::Philo::SM::eating} */
static QState Philo_eating_x(Philo * const me) {
    TableEvt *pe = Q_NEW(TableEvt, DONE_SIG);
    pe->philoNum = PHILO_ID(me);
    QF_PUBLISH(&pe->super, me);
    return QM_EXIT(&Philo_eating_s);
}
Ejemplo n.º 22
0
/* @(/2/0/9/1/1) ...........................................................*/
QState CoffeeAO_menu(CoffeeAO * const me, QEvt const * const e) {
    QState status_;
    switch (e->sig) {
        /* @(/2/0/9/1/1/0) */
        case ADWHEEL_SIG: {
            // calculate current menu entry
            char menu_text[20];
            struct Entry* menu_entry = &menu_entries[me->current_menu_index];
            me->current_menu_index = ((AdEvt*)e)->val * me->max_menu_index / 1024;
            lcd_clear();
            set_cursor(0, 0);
            switch (menu_entry->interpolate_with) {
            case NOTHING:
                strcpy(menu_text, menu_entry->menu_label);
                break;
            case BREW_STRENGTH:
                sprintf(menu_text, menu_entry->menu_label, l_CoffeeAO.current_brew_strength + 1);
                break;
            case IS_COFFEE_POT_IN_MACHINE:
                sprintf(menu_text, menu_entry->menu_label, l_CoffeeAO.is_coffee_pot_in_machine);
                break;
            case IS_AUTOMATIC_BREW_ACTIVE:
                sprintf(menu_text, menu_entry->menu_label, l_CoffeeAO.is_automatic_brew_active);
                break;
            }
            lcd_print(menu_text);

            set_cursor(4, 1);
            sprintf(menu_text, "%02u:%02u:%02u", l_CoffeeAO.alarm.real_current_time.hours, l_CoffeeAO.alarm.real_current_time.minutes, l_CoffeeAO.alarm.real_current_time.seconds);
            lcd_print(menu_text);
            status_ = Q_HANDLED();
            break;
        }
        /* @(/2/0/9/1/1/1) */
        case INT_SIG: {
            QEvent *menuEvt = Q_NEW(QEvent, menu_entries[me->current_menu_index].signal);
            //QEvent *menuEvt = Q_NEW(QEvent, GO_COFFEE_POT_TOGGLE_SIG);
            QF_INT_ENABLE();
            QActive_postFIFO((QActive *)&l_CoffeeAO, menuEvt);
            QF_INT_DISABLE();

            status_ = Q_HANDLED();
            break;
        }
        /* @(/2/0/9/1/1/2) */
        case GO_COFFEE_POT_TOGGLE_SIG: {
            status_ = Q_TRAN(&CoffeeAO_coffeePotToggle);
            break;
        }
        /* @(/2/0/9/1/1/3) */
        case GO_TIME_BREW_TOGGLE_SIG: {
            status_ = Q_TRAN(&CoffeeAO_timeBrewActivatedToggle);
            break;
        }
        /* @(/2/0/9/1/1/4) */
        case GO_SET_BREW_TIME_CLOCK_SIG: {
            status_ = Q_TRAN(&CoffeeAO_set_brew_h1);
            break;
        }
        /* @(/2/0/9/1/1/5) */
        case GO_SET_TIME_OF_DAY_SIG: {
            status_ = Q_TRAN(&CoffeeAO_set_clock_h1);
            break;
        }
        /* @(/2/0/9/1/1/6) */
        case GO_START_BREWING_SIG: {
            status_ = Q_TRAN(&CoffeeAO_startBrewingNow);
            break;
        }
        /* @(/2/0/9/1/1/7) */
        case GO_SET_BREW_STRENGTH_SIG: {
            status_ = Q_TRAN(&CoffeeAO_setBrewStrength);
            break;
        }
        default: {
            status_ = Q_SUPER(&CoffeeAO_coffeemachine);
            break;
        }
    }
    return status_;
}
Ejemplo n.º 23
0
/* @(/2/4/3/2/1) ...........................................................*/
static QState Mine2_planted(Mine2 * const me, QEvt const * const e) {
    QState status_;
    switch (e->sig) {
        /* @(/2/4/3/2/1/0) */
        case TIME_TICK_SIG: {
            /* @(/2/4/3/2/1/0/0) */
            if (me->x >= GAME_SPEED_X) {
                ObjectImageEvt *oie;
                 me->x -= GAME_SPEED_X; /* move the mine 1 step */
                /* tell the Tunnel to draw the Mine */
                oie = Q_NEW(ObjectImageEvt, MINE_IMG_SIG);
                oie->x   = me->x;
                oie->y   = me->y;
                oie->bmp = MINE2_BMP;
                QACTIVE_POST(AO_Tunnel, (QEvt *)oie, me);
                status_ = QM_HANDLED();
            }
            /* @(/2/4/3/2/1/0/1) */
            else {
                static QActionHandler const act_[] = {
                    Q_ACTION_CAST(&Mine2_used_x),
                    Q_ACTION_CAST(0)
                };
                status_ = QM_TRAN(&Mine2_unused_s, &act_[0]);
            }
            break;
        }
        /* @(/2/4/3/2/1/1) */
        case SHIP_IMG_SIG: {
            uint8_t x   = Q_EVT_CAST(ObjectImageEvt)->x;
            uint8_t y   = Q_EVT_CAST(ObjectImageEvt)->y;
            uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp;
            /* @(/2/4/3/2/1/1/0) */
            if (do_bitmaps_overlap(MINE2_BMP, me->x, me->y, bmp, x, y)) {
                static QActionHandler const act_[] = {
                    Q_ACTION_CAST(&Mine2_used_x),
                    Q_ACTION_CAST(0)
                };
                static MineEvt const mine1_hit = {
                    { HIT_MINE_SIG, 0U, 0U }, /* the QEvt base instance */
                    2U  /* type of the mine (2 for Mine type-2) */
                };
                 QACTIVE_POST(AO_Ship, (QEvt *)&mine1_hit, me);
                 /* go straight to 'disabled' and let the Ship do
                 * the exploding */
                status_ = QM_TRAN(&Mine2_unused_s, &act_[0]);
            }
            else {
                status_ = QM_UNHANDLED();
            }
            break;
        }
        /* @(/2/4/3/2/1/2) */
        case MISSILE_IMG_SIG: {
            uint8_t x   = Q_EVT_CAST(ObjectImageEvt)->x;
            uint8_t y   = Q_EVT_CAST(ObjectImageEvt)->y;
            uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp;
            /* @(/2/4/3/2/1/2/0) */
            if (do_bitmaps_overlap(MINE2_MISSILE_BMP, me->x, me->y, bmp, x, y)) {
                static QActionHandler const act_[] = {
                    Q_ACTION_CAST(&Mine2_exploding_e),
                    Q_ACTION_CAST(0)
                };
                /* NOTE: Mine type-2 is nastier than Mine type-1.
                * The type-2 mine can hit the Ship with any of its
                * "tentacles". However, it can be destroyed by the
                * Missile only by hitting its center, defined as
                * a smaller bitmap MINE2_MISSILE_BMP.
                */
                static ScoreEvt const mine2_destroyed = {
                    { DESTROYED_MINE_SIG, 0U, 0U },  /* the QEvt base instance */
                    45U  /* score for destroying Mine type-2 */
                };
                QACTIVE_POST(AO_Missile, (QEvt *)&mine2_destroyed, me);
                status_ = QM_TRAN(&Mine2_exploding_s, &act_[0]);
            }
            else {
                status_ = QM_UNHANDLED();
            }
            break;
        }
        default: {
            status_ = QM_SUPER();
            break;
        }
    }
    return status_;
}
Ejemplo n.º 24
0
//${AOs::Table::SM::active::serving} .........................................
QP::QState Table::serving(Table * const me, QP::QEvt const * const e) {
    QP::QState status_;
    switch (e->sig) {
        // ${AOs::Table::SM::active::serving}
        case Q_ENTRY_SIG: {
            for (uint8_t n = 0U; n < N_PHILO; ++n) { // give permissions to eat...
                if (me->m_isHungry[n]
                    && (me->m_fork[LEFT(n)] == FREE)
                    && (me->m_fork[n] == FREE))
                {
                    me->m_fork[LEFT(n)] = USED;
                    me->m_fork[n] = USED;
                    TableEvt *te = Q_NEW(TableEvt, EAT_SIG);
                    te->philoNum = n;
                    AO_Philo[n]->POST(te, me);
                    me->m_isHungry[n] = false;
                    BSP::displayPhilStat(n, EATING);
                }
            }
            status_ = Q_HANDLED();
            break;
        }
        // ${AOs::Table::SM::active::serving::HUNGRY}
        case HUNGRY_SIG: {
            uint8_t n = Q_EVT_CAST(TableEvt)->philoNum;
            // phil ID must be in range and he must be not hungry
            Q_ASSERT((n < N_PHILO) && (!me->m_isHungry[n]));

            BSP::displayPhilStat(n, HUNGRY);
            uint8_t m = LEFT(n);
            // ${AOs::Table::SM::active::serving::HUNGRY::[bothfree]}
            if ((me->m_fork[m] == FREE) && (me->m_fork[n] == FREE)) {
                me->m_fork[m] = USED;
                me->m_fork[n] = USED;
                TableEvt *pe = Q_NEW(TableEvt, EAT_SIG);
                pe->philoNum = n;
                QP::QF::PUBLISH(pe, me);
                BSP::displayPhilStat(n, EATING);
                status_ = Q_HANDLED();
            }
            // ${AOs::Table::SM::active::serving::HUNGRY::[else]}
            else {
                me->m_isHungry[n] = true;
                status_ = Q_HANDLED();
            }
            break;
        }
        // ${AOs::Table::SM::active::serving::DONE}
        case DONE_SIG: {
            uint8_t n = Q_EVT_CAST(TableEvt)->philoNum;
            // phil ID must be in range and he must be not hungry
            Q_ASSERT((n < N_PHILO) && (!me->m_isHungry[n]));

            BSP::displayPhilStat(n, THINKING);
            uint8_t m = LEFT(n);
            // both forks of Phil[n] must be used
            Q_ASSERT((me->m_fork[n] == USED) && (me->m_fork[m] == USED));

            me->m_fork[m] = FREE;
            me->m_fork[n] = FREE;
            m = RIGHT(n); // check the right neighbor

            if (me->m_isHungry[m] && (me->m_fork[m] == FREE)) {
                me->m_fork[n] = USED;
                me->m_fork[m] = USED;
                me->m_isHungry[m] = false;
                TableEvt *pe = Q_NEW(TableEvt, EAT_SIG);
                pe->philoNum = m;
                QP::QF::PUBLISH(pe, me);
                BSP::displayPhilStat(m, EATING);
            }
            m = LEFT(n); // check the left neighbor
            n = LEFT(m); // left fork of the left neighbor
            if (me->m_isHungry[m] && (me->m_fork[n] == FREE)) {
                me->m_fork[m] = USED;
                me->m_fork[n] = USED;
                me->m_isHungry[m] = false;
                TableEvt *pe = Q_NEW(TableEvt, EAT_SIG);
                pe->philoNum = m;
                QP::QF::PUBLISH(pe, me);
                BSP::displayPhilStat(m, EATING);
            }
            status_ = Q_HANDLED();
            break;
        }
        // ${AOs::Table::SM::active::serving::EAT}
        case EAT_SIG: {
            Q_ERROR();
            status_ = Q_HANDLED();
            break;
        }
        // ${AOs::Table::SM::active::serving::PAUSE}
        case PAUSE_SIG: {
            status_ = Q_TRAN(&paused);
            break;
        }
        default: {
            status_ = Q_SUPER(&active);
            break;
        }
    }
    return status_;
}
Ejemplo n.º 25
0
const DC3Error_t DB_read(
      const DC3DBElem_t elem,
      const DC3AccessType_t accessType,
      const size_t bufSize,
      uint8_t* pBuffer
)
{
   DC3Error_t status = ERR_NONE;            /* keep track of success/failure */

   /* 1. Find where the element lives */
   DB_ElemLoc_t loc = settingsDB[elem].loc;

   /* 2. Call the location dependent functions to retrieve the data from DB */
   switch( loc ) {
      case DB_EEPROM:                           /* Intentionally fall through */
      case DB_SN_ROM:                           /* Intentionally fall through */
      case DB_UI_ROM:
         if ( _DC3_ACCESS_BARE == accessType ) {
            uint16_t bytesRead = 0;
            status = I2C_readDevMem(
                  accessType,                   // const DC3AccessType_t accType,
                  DB_I2C_devices[loc],          // const DC3I2CDevice_t iDev,
                  settingsDB[elem].offset,      // const uint16_t offset,
                  settingsDB[elem].size,        // const uint16_t bytesToRead,
                  bufSize,                      // const uint8_t  bufSize
                  pBuffer,                      // uint8_t* const pBuffer,
                  &bytesRead                    // uint16_t* pBytesRead
            );

            if ( ERR_NONE == status ) {      /* Only check length if no error */
               if ( bytesRead != settingsDB[elem].size ) {
                  status = ERR_DB_ELEM_LENGTH_READ_MISMATCH;
                  goto DB_read_ERR_HANDLE; /* Stop and jump to error handling */
               }
            }

         } else {
            /* Create the event and directly post it to the right AO. */
            I2CReadReqEvt *i2cReadReqEvt  = Q_NEW(I2CReadReqEvt, I2C1_DEV_RAW_MEM_READ_SIG);
            i2cReadReqEvt->i2cDev         = DB_getI2CDev(loc);
            i2cReadReqEvt->start          = settingsDB[elem].offset;
            i2cReadReqEvt->bytes          = settingsDB[elem].size;
            i2cReadReqEvt->accessType     = accessType;
            QACTIVE_POST(AO_I2C1DevMgr, (QEvt *)(i2cReadReqEvt), SysMgr_AO);
         }
         break;
      case DB_GPIO:
         status = ERR_UNIMPLEMENTED;
         goto DB_read_ERR_HANDLE;          /* Stop and jump to error handling */
         break;
      case DB_FLASH:
         ; // need this or we get "a label can only be part of a statement and
           // a declaration is not a statement" compile error
         uint16_t resultLen = 0;
         status = DB_readFlash(
               elem,
               accessType,
               bufSize,
               pBuffer,
               &resultLen
         );
         break;
         /* Add more locations here. Anything that fails will go to the default
          * case and get logged as an error. */
      default:
         status = ERR_DB_ELEM_NOT_FOUND;
         goto DB_read_ERR_HANDLE;          /* Stop and jump to error handling */
         break;
   }

DB_read_ERR_HANDLE:               /* Handle any error that may have occurred. */
   ERR_COND_OUTPUT( status, accessType,
         "DB read of element %s (%d) from DB: Error 0x%08x\n",
         CON_dbElemToStr( elem ), elem, status );
   return( status );
}
Ejemplo n.º 26
0
void My_UI_KeyboardImpl_clearEntry (My_UI_KeyboardImpl* mepl) {
    QF_publish((QEvent*)Q_NEW(KeyEvent, MY_CALC_CLEARENTRY_SIG));
}
Ejemplo n.º 27
0
const DC3Error_t DB_readFlash(
      const DC3DBElem_t elem,
      const DC3AccessType_t accessType,
      const size_t bufSize,
      uint8_t* pBuffer,
      uint16_t* pResultLen
)
{

   DC3Error_t status = ERR_NONE;

   /* Make sure the element is in flash */
   if( !DB_IS_ELEM_IN_FLASH(elem) ) {
      status = ERR_DB_ELEM_IS_NOT_IN_FLASH;
      goto DB_readFlash_ERR_HANDLE;        /* Stop and jump to error handling */
   }

   switch ( accessType ) {
      case _DC3_ACCESS_QPC:               /* Intentionally fall through */
      case _DC3_ACCESS_FRT: {
         DBReadDoneEvt *evt = Q_NEW(DBReadDoneEvt, DB_FLASH_READ_DONE_SIG);
         evt->dbElem = elem;
         evt->status = ERR_NONE;

         /* Both evt->status and status should be assigned here */
         evt->status = status = FLASH_readBufferUint8(
               settingsDB[elem].offset,
               settingsDB[elem].size,
               MAX_DB_ELEM_SIZE,
               evt->dataBuf,
               (uint16_t *)&(evt->dataLen)
         );
         QACTIVE_POST(AO_SysMgr, (QEvt *)evt, AO_SysMgr);

         break;
      }
      case _DC3_ACCESS_BARE:
         if ( bufSize < settingsDB[elem].size ) {
            status = ERR_MEM_BUFFER_LEN;
            goto DB_readFlash_ERR_HANDLE;  /* Stop and jump to error handling */
         }

         if ( NULL == pBuffer ) {
            status = ERR_MEM_NULL_VALUE;
            goto DB_readFlash_ERR_HANDLE;  /* Stop and jump to error handling */
         }

         status = FLASH_readBufferUint8(
               settingsDB[elem].offset,
               settingsDB[elem].size,
               bufSize,
               pBuffer,
               pResultLen
         );

         break;
      default:
         status = ERR_INVALID_ACCESS_TYPE;
         goto DB_readFlash_ERR_HANDLE;     /* Stop and jump to error handling */
         break;
   }

DB_readFlash_ERR_HANDLE:           /* Handle any error that may have occurred */
   ERR_COND_OUTPUT( status, accessType,
         "Reading from Flash DB element %s (%d): Error 0x%08x \n",
         CON_dbElemToStr( elem ), elem, status );

   return( status );
}
Ejemplo n.º 28
0
void My_UI_KeyboardImpl_powerOff (My_UI_KeyboardImpl* mepl) {
    QF_publish((QEvent*)Q_NEW(KeyEvent, MY_CALC_POWEROFF_SIG));
}
Ejemplo n.º 29
0
// @(/2/1/5/1/3) .............................................................
QP::QState Ship::flying(Ship * const me, QP::QEvt const * const e) {
    QP::QState status;
    switch (e->sig) {
        // @(/2/1/5/1/3)
        case Q_ENTRY_SIG: {
            me->m_score = 0U; /* reset the score */
            ScoreEvt *sev = Q_NEW(ScoreEvt, SCORE_SIG);
            sev->score = me->m_score;
            AO_Tunnel->POST(sev, me);
            status = Q_HANDLED();
            break;
        }
        // @(/2/1/5/1/3/0)
        case TIME_TICK_SIG: {
            // tell the Tunnel to draw the Ship and test for hits
            ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, SHIP_IMG_SIG);
            oie->x   = me->m_x;
            oie->y   = me->m_y;
            oie->bmp = SHIP_BMP;
            AO_Tunnel->POST(oie, me);

            ++me->m_score; // increment the score for surviving another tick

            if ((me->m_score % 10U) == 0U) { // is the score "round"?
                ScoreEvt *sev = Q_NEW(ScoreEvt, SCORE_SIG);
                sev->score = me->m_score;
                AO_Tunnel->POST(sev, me);
            }
            status = Q_HANDLED();
            break;
        }
        // @(/2/1/5/1/3/1)
        case PLAYER_TRIGGER_SIG: {
            ObjectPosEvt *ope = Q_NEW(ObjectPosEvt, MISSILE_FIRE_SIG);
            ope->x = me->m_x;
            ope->y = me->m_y + SHIP_HEIGHT - 1U;
            AO_Missile->POST(ope, me);
            status = Q_HANDLED();
            break;
        }
        // @(/2/1/5/1/3/2)
        case DESTROYED_MINE_SIG: {
            me->m_score += Q_EVT_CAST(ScoreEvt)->score;
            // the score will be sent to the Tunnel by the next TIME_TICK
            status = Q_HANDLED();
            break;
        }
        // @(/2/1/5/1/3/3)
        case HIT_WALL_SIG: {
            status = Q_TRAN(&Ship::exploding);
            break;
        }
        // @(/2/1/5/1/3/4)
        case HIT_MINE_SIG: {
            status = Q_TRAN(&Ship::exploding);
            break;
        }
        default: {
            status = Q_SUPER(&Ship::active);
            break;
        }
    }
    return status;
}
Ejemplo n.º 30
0
void My_UI_KeyboardImpl_sendEquals (My_UI_KeyboardImpl* mepl) {
    KeyEvent* ke = Q_NEW(KeyEvent, MY_CALC_EQUALS_SIG);
    ke->keyId = '=';
    QF_publish((QEvent*)ke);
}