Example #1
0
/* @(/1/9/3/0) */
static QState QACCDetector_initial(QACCDetector * const me, QEvt const * const e) {
    u8 curState;
    static const QEvt acc_on_evt = {ACC_ON_SIG, 0};
    static const QEvt acc_off_evt = {ACC_OFF_SIG, 0};

    QS_SIG_DICTIONARY(ACC_ON_SIG, (void*)0);
    QS_SIG_DICTIONARY(ACC_OFF_SIG, (void*)0);

    QS_SIG_DICTIONARY(Q_TIMEOUT_SIG, me);
    QS_SIG_DICTIONARY(ACC_ONCHANGE_SIG, me);

     //初始化时,先广播一次ACC状态
    curState = (u8)GET_ACC_STATE();
    if(0 == curState)
    {
        TRACE_(QS_USER, NULL, "[ACC] state = ACC_ON");
         QF_publish(&acc_on_evt, me);
    }
    else
    {
        TRACE_(QS_USER, NULL, "[ACC] state = ACC_OFF");
         QF_publish(&acc_off_evt, me);
    }
    return Q_TRAN(&QACCDetector_idle);
}
Example #2
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);
        return Q_HANDLED();
    }
    case TIMEOUT_SIG: {
        BSP_busyDelay();
        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);
}
Example #3
0
/**
 * \brief handle incoming echo request
 *
 * \param the incoming NewDataEvent
 */
void uip_icmp6_echo_request_input(NewDataEvent * e)
{
	struct uip_icmp_hdr * icmp_hdr;
	struct uip_tcpip_hdr * tcpip_hdr;
	Neighbor_AO * neighbor;
	static QEvent const pr_sig = { PACKET_RECEIVED_SIG};
	static QEvent const ps_sig = { PACKET_SENT_SIG};
	tcpip_hdr = ( struct uip_tcpip_hdr *) &e->buf[UIP_LLH_LEN];
	icmp_hdr = (struct uip_icmp_hdr *)&e->buf[uip_l2_l3_hdr_len];
	
	neighbor = uip_nd6_nbrcache_lookup(&tcpip_hdr->srcipaddr);
	if (NULL != neighbor)
		QActive_postFIFO((QActive *)neighbor, &pr_sig);
	
	switch_eth_addr(e);
	
	memcpy(&tcpip_hdr->destipaddr, &tcpip_hdr->srcipaddr, sizeof(uip_ipaddr_t));
	memcpy(&tcpip_hdr->srcipaddr, &uip_hostaddr, sizeof(uip_ipaddr_t));
	icmp_hdr->type = ICMP6_ECHO_REPLY;
  icmp_hdr->icode = 0;
  icmp_hdr->icmpchksum = 0;
  icmp_hdr->icmpchksum = ~upper_layer_chksum6((unsigned char *) &e->buf);
	e->super.sig = SEND_DATA_SIG;
	QF_publish((QEvent *) e);
	QActive_postFIFO((QActive *)neighbor, &ps_sig);
}
Example #4
0
//void process_data_from_event(NewDataEvent *e)
int  resolve_protocol_type(NewDataEvent *e)
{
	struct uip_tcpip_hdr * tcpip_hdr;
	struct uip_icmp_hdr * icmp_hdr;
	int rtc;
	tcpip_hdr = ( struct uip_tcpip_hdr *) &e->buf[UIP_LLH_LEN];
	
	//only process IPV6 Packets
	if (IP_VERSION_V6 != tcpip_hdr->vtc)
		return ( IP_VERSION_NOT_SUPPORTED);
	
	
	if ( !uip_is_multicast(tcpip_hdr->destipaddr) &&
			 !uip_is_hostaddr(&tcpip_hdr->destipaddr) ) {
		e->super.sig = SEND_DATA_SIG;
		QF_publish((QEvent *) e);
		return ( IP_MULI_CAST_CHECK );
	}
	
	
	//if not multicast and not for my interfaces
		//find target interface through prefix
	//send to

	if (tcpip_hdr->proto == UIP_PROTO_ICMP6) {
		icmp_hdr = (struct uip_icmp_hdr *)&e->buf[uip_l2_l3_hdr_len];
		switch(icmp_hdr->type) {
			case ICMP6_NS:
				uip_nd6_io_ns_input((NewDataEvent *)e);
				break;
			case ICMP6_NA:
				uip_nd6_io_na_input((NewDataEvent *) e);
				break;
			case ICMP6_RA:
				//uip_nd6_io_ra_input();
				break;
			case ICMP6_RS:
				//uip_nd6_io_rs_input();
				break;
			case ICMP6_ECHO_REQUEST:
				uip_icmp6_echo_request_input((NewDataEvent *)e);
				break;
			case ICMP6_ECHO_REPLY:
				/** \note We don't implement any application callback for now */
			  uip_icmp6_echo_reply_input((NewDataEvent *)e);
				printf("Received an icmp6 echo reply\n");
				break;
			default:
				printf("Unknown icmp6 message type %d\n", icmp_hdr->type);
				break;
		}
		rtc=UIP_PROTO_ICMP6;
	}
	if (tcpip_hdr->proto == UIP_PROTO_UDP)
			rtc=UIP_PROTO_UDP;
	
	return (rtc);
}
Example #5
0
/* @(/1/7/6/1/3/2) .........................................................*/
static QState QCAN_ACC_Off(QCAN * const me, QEvt const * const e) {
    QState status_;
    switch (e->sig) {
        /* @(/1/7/6/1/3/2/0) */
        case ACC_ON_SIG: {
            status_ = Q_TRAN(&QCAN_ACC_On);
            break;
        }
        /* @(/1/7/6/1/3/2/1) */
        case PER_SECOND_SIG: {
            if(1 == me->m_bRecvFrame)
            {
                if(me->m_ledFlashCnt++ % 3 == 0)  //控制等闪烁,3s
                {
                    CAN_FLASH_LED();
                }
                me->m_bRecvFrame = 0;
                me->m_canfreeTicks = 0;
            }
            else
            {
                me->m_canfreeTicks ++;

            //    if(me->m_canfreeTicks > TIMEOUT_CAN_FREE_SECONDS)
            //    {
                    //请求CAN模块休眠
            //        static const QEvent sleep_Evt = {CAN_RXIDLE_TIMEOUT_SIG, 0};
            //        QACTIVE_POST(AO_Can, (QEvt*)&sleep_Evt, (void*)0);
                    CAN_LED_OFF();
            //    }
            }


            /* @(/1/7/6/1/3/2/1/0) */
            if (me->m_canfreeTicks > TIMEOUT_CAN_FREE_SECONDS) {
                //系统休眠条件:ACC OFF,CAN总线无数据时长超过指定时长
                static const QEvent sleep_Evt = {SLEEP_REQ_SIG, 0};
                QF_publish(&sleep_Evt, me); //广播睡眠请求消息,通知各个模块进入休眠态

                TRACE_(QS_USER, NULL, "[CAN] ----- PowerMgr: SLEEP -----");
                status_ = Q_TRAN(&QCAN_Sleep_Mode);
            }
            /* @(/1/7/6/1/3/2/1/1) */
            else {
                status_ = Q_HANDLED();
            }
            break;
        }
        default: {
            status_ = Q_SUPER(&QCAN_non_conflicting);
            break;
        }
    }
    return status_;
}
Example #6
0
void My_UI_KeyboardImpl_sendKey (My_UI_KeyboardImpl* mepl, char arg1) {
    KeyEvent* ke;
    if (arg1 == '0') {
        ke = Q_NEW(KeyEvent, MY_CALC_DIGIT_0_SIG);
    } else {
        ke = Q_NEW(KeyEvent, MY_CALC_DIGIT_1_9_SIG);
    }
    ke->keyId = arg1;
    QF_publish((QEvent*)ke);

}
Example #7
0
bool CalculatorImpl_onError (CalculatorImpl* mepl) {
    if (AttributeMapper_get(mepl, "TESTING")) {  // for unit-testing
        bool rv = AttributeMapper_get(mepl, "onError");
        printf("%s.onError() == %s\n", mepl->machineName, AttributeMapper_booltostr(rv));
        return rv;
    } else {
        bool rv = (strlen(mepl->errStat) > 0);
        if (rv) {
            printf("%s.onError() == %s\n", mepl->machineName, mepl->errStat);
            ResultEvent* re = Q_NEW(ResultEvent, REPORTRESULT_SIG);
            strcpy(re->result, mepl->errStat);
            QF_publish((QEvent*)re);
        }
        return rv;
    }
}
Example #8
0
void UserEventTestImpl_userEventOnTrans (UserEventTestImpl* mepl, QEvent const* e, const char* arg2, double arg3) {
    printf("%s.userEventOnTrans() received event signal '%hd', var value '%s', and literal '%lf'\n",
            mepl->machineName, e->sig, arg2, arg3);

    if (AttributeMapper_get(mepl, "FUNCTIONALITY")) {
        // transfer e data to var, and save literal as new e data
        DataEvent const* de = (DataEvent const*)e;
        strncpy(mepl->var, de->data, MAX_DATA_SIZE);
        // publish new data in e as test Ack event
        DataEvent* newDE = Q_NEW(DataEvent, TEST_ACK_EV1_SIG);
        sprintf(newDE->data, "%lf", arg3);
        QF_publish((QEvent*)newDE);
    } else {
        // set var to literal
        sprintf(mepl->var, "%lf", arg3);
    }
}
Example #9
0
//-----------------------------------------------------------------------------
/// Read for EMAC device
//-----------------------------------------------------------------------------
void
phy_dev_read(void)
{
	unsigned int len;
	unsigned char buf[UIP_CONF_BUFFER_SIZE+2];
	NewDataEvent *e;

    if( EMAC_RX_OK != EMAC_Poll( (unsigned char*)&buf,
                                  UIP_CONF_BUFFER_SIZE,
                                  &len) ) {

        return;
    }

		e= Q_NEW(NewDataEvent, NEW_DATA_SIG);
		e->len = len;
		memcpy(e->buf, buf, sizeof(buf));			
		QF_publish((QEvent *) e);
}
Example #10
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);
}
Example #11
0
void CalculatorImpl_reportResult (CalculatorImpl* mepl) {
    ResultEvent* re = Q_NEW(ResultEvent, REPORTRESULT_SIG);
    sprintf(re->result, "%lf", mepl->result);
    QF_publish((QEvent*)re);
}
Example #12
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);
}
Example #13
0
int main(int argc, char* argv[])
{
    char cmdBuf[SOCK_BUFF_SIZE];

    printf("Quantum Test\nQEP %s\nQF  %s, QF/Linux port %s\n",
           QEP_getVersion(),
           QF_getVersion(), QF_getPortVersion());

    QF_init();
	QF_psInit(subscrSto, Q_DIM(subscrSto));
	QF_poolInit(poolArray, sizeof(poolArray), sizeof(GenEvt));
	
    applicationStart(QSIZE);

    for (;;)
    {
      // Get the incoming string command from the dmsTerminal or the GUI
      receiveCmd(cmdBuf);


	  // Attempt to parse the command string for IMPL or ACTIVE calls
	   char tmpBuf[USER_ENTRY_SIZE];
	   char smName[USER_ENTRY_SIZE];
	   char attrName[USER_ENTRY_SIZE];
	   char valStr[USER_ENTRY_SIZE];
	   // scan for IMPL['SM'].set("attr", True/False), allowing blanks
	   // IMPL['trans'].set('guard', False)
	   int cnt = sscanf(strcpy(tmpBuf, cmdBuf),
			   "IMPL[%*['\"]%[^'\"]%*['\"]].set(%*['\"]%[^'\"]%*['\"],%[^)])",
			   smName, attrName, valStr);
	   if (cnt > 0) {  // found an IMPL attribute setter!
		   setGuardAttribute(smName, attrName, valStr);
		   continue;
	   }

      char *word;
      word = strtok(cmdBuf, " ");

      // We assume the first word contains the signal that is to be published,
      // and the remaining words are data to be used to populate the event.
      GenEvt *event;
      int signal = strtoul(word, NULL, 10);
      if (signal == DURING)
      {
        QF_tick();
        QF_publish( Q_NEW(QEvent, DURING) );
      }
      else
      {
        event = Q_NEW(GenEvt, signal);
        // Loop through the remaining words and populate the event
        int i = 0;
        do
        {
           word = strtok('\0', " ");
           if (word)
           {
             Q_ASSERT(i<EVENT_SIZE);
             event->data[i] = strtoul(word, NULL, 16);
           }
           i = i + 1;
        } while (word);
        QF_publish((QEvent *)event);
      }
      QF_run();
    }
}
Example #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);
}
Example #15
0
void My_UI_KeyboardImpl_powerOff (My_UI_KeyboardImpl* mepl) {
    QF_publish((QEvent*)Q_NEW(KeyEvent, MY_CALC_POWEROFF_SIG));
}
Example #16
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);
}
Example #17
0
void My_UI_KeyboardImpl_clearEntry (My_UI_KeyboardImpl* mepl) {
    QF_publish((QEvent*)Q_NEW(KeyEvent, MY_CALC_CLEARENTRY_SIG));
}
Example #18
0
void OperandXImpl_fraction (OperandXImpl* mepl) {
    KeyEvent* ke = Q_NEW(KeyEvent, OPERANDCHANGED_SIG);
    ke->keyId = '.';
    QF_publish((QEvent*)ke);
}
Example #19
0
void My_Calc_OperandXImpl_fraction (My_Calc_OperandXImpl* mepl) {
    KeyEvent* ke = Q_NEW(KeyEvent, MY_CALC_OPERANDCHANGED_SIG);
    ke->keyId = '.';
    QF_publish((QEvent*)ke);
}
Example #20
0
/* @(/1/9/3/2) .............................................................*/
static QState QACCDetector_busy(QACCDetector * const me, QEvt const * const e) {
    QState status_;
    switch (e->sig) {
        /* @(/1/9/3/2) */
        case Q_ENTRY_SIG: {
            me->m_detectTimes = 0;

            //保持1S
            QTimeEvt_postEvery(&me->m_Timer, &me->super, TIMEOUT_DETECTING);
            status_ = Q_HANDLED();
            break;
        }
        /* @(/1/9/3/2) */
        case Q_EXIT_SIG: {
            QTimeEvt_disarm(&me->m_Timer);
            status_ = Q_HANDLED();
            break;
        }
        /* @(/1/9/3/2/0) */
        case Q_TIMEOUT_SIG: {
            u8 curState = (u8)GET_ACC_STATE();
            me->m_detectTimes++;
            /* @(/1/9/3/2/0/0) */
            if (curState != me->m_state) {
                //状态发生变化,重新开始检测
                status_ = Q_TRAN(&QACCDetector_busy);
            }
            /* @(/1/9/3/2/0/1) */
            else {
                me->m_state = curState;
                /* @(/1/9/3/2/0/1/0) */
                if (me->m_detectTimes >= DETECTING_KEPT_AMOUNT) {
                    static const QEvent acc_on_Evt = {ACC_ON_SIG, 0};
                    static const QEvent acc_off_Evt = {ACC_OFF_SIG, 0};
                    TaskEvt *pe;

                    if(me->m_state == 0)
                    {
                        TRACE_(QS_USER, NULL, "[ACC] state = ACC ON");
                        SetACCState(ACC_ON);
                        //广播ACC开电消息
                        QF_publish(&acc_on_Evt, me);
                    }
                    else
                    {
                        TRACE_(QS_USER, NULL, "[ACC] state = ACC OFF");
                        SetACCState(ACC_OFF);
                        //广播ACC关电消息
                        QF_publish(&acc_off_Evt, me);
                    }

                    /*
                    //上报服务器车辆状态
                    //1.  00为停车,FE为充电启动;FF为钥匙启动;
                    pe = Q_NEW(TaskEvt, NEW_TASKSENDREQ_SIG);
                    pe->cmd = EVS15_CMD_START_STOP_RPT; //命令字
                    pe->sequence = GeneratePacketSequenceNumber();
                    pe->ret = (me->m_state == 0) ? STATE_ACCON : STATE_STOP;
                    QACTIVE_POST(AO_Gprs, (QEvt*)pe, (void*)0);
                    */
                    status_ = Q_TRAN(&QACCDetector_idle);
                }
                /* @(/1/9/3/2/0/1/1) */
                else {
                    status_ = Q_HANDLED();
                }
            }
            break;
        }
        /* @(/1/9/3/2/1) */
        case ACC_ONCHANGE_SIG: {
            //检测过程中收到ACC变化,重新检测
            me->m_state = (u8)GET_ACC_STATE();
            status_ = Q_TRAN(&QACCDetector_busy);
            break;
        }
        default: {
            status_ = Q_SUPER(&QHsm_top);
            break;
        }
    }
    return status_;
}
Example #21
0
void My_Calc_OperandXImpl_insert (My_Calc_OperandXImpl* mepl, QEvent const* e) {
    KeyEvent* ke = Q_NEW(KeyEvent, MY_CALC_OPERANDCHANGED_SIG);
    ke->keyId = ((KeyEvent const*)e)->keyId;
    QF_publish((QEvent*)ke);
}