Ejemplo n.º 1
0
static void s_cangateway_startup(EOMtask *p, uint32_t t)
{
    char str[96];
 

    // initialise the socket
    // up to 16 packets of 64 bytes ...    
    eupdater_sock_cangateway = eo_socketdtg_New (   16, eupdater_cangtw_udp_packet_maxsize, eom_mutex_New(), // input queue
                                                    16, eupdater_cangtw_udp_packet_maxsize, eom_mutex_New()  // output queue
                                                );
   

    snprintf(str, sizeof(str), "opening a txrx socket on port %d for can gateway\n\r", s_cangtw_port);
    hal_trace_puts(str);

    EOaction_strg action_strg;
    EOaction* act = (EOaction*)&action_strg;  
    // set the rx action on socket to be an event s_event_cangtw_sock_rec to this task object
    eo_action_SetEvent(act, event_cangtw_sock_rec, p);
    eo_socketdtg_Open(eupdater_sock_cangateway, s_cangtw_port, eo_sktdir_TXRX, eobool_false, NULL, act, NULL);
    
    // init and start the sm. also pass to it the task and teh socket 
    s_sm_cangtw = eo_sm_New(eo_cfg_sm_cangtw_Get());
    eo_sm_Start(s_sm_cangtw);
    eOsmDynamicDataCanGtw_t* smdata = (eOsmDynamicDataCanGtw_t*) eo_sm_GetDynamicData(s_sm_cangtw); 
    smdata->taskCANgtw = eupdater_task_cangateway;
    smdata->sockCANgtw = eupdater_sock_cangateway; 

    // ok, now the startup is over.
    osal_semaphore_increment(startup_done_semaphore, osal_callerTSK);
}
Ejemplo n.º 2
0
extern eOresult_t eo_sm_ProcessEvent(EOsm *p, eOsmEvent_t ev) 
{
    EOsmStateQuickInfo_t *quickinfoonstate = NULL;
    const eOsmState_t *currstate = NULL;
    const eOsmState_t *nextstate = NULL;
    const eOsmTransition_t *transition = NULL;
 
    
    if(NULL == p)
    {
        return(eores_NOK_nullpointer);
    }
    
    if(ev >= p->cfg->maxevts)
    {
        return(eores_NOK_generic);
    }

    if(0 == p->started)
    {
        eo_sm_Start(p);
    }
    
    quickinfoonstate = &(p->statequickinfo[p->activestate]);
    
   
    if(0 == (quickinfoonstate->evtmask & (0x00000001 << ev)))
    {
        // no event for this state.
        return(eores_NOK_nodata);
    }
    
    // set the latest event
    p->latestevent = ev;
    
    // there is a transition. 
    transition = &(p->cfg->transitions[quickinfoonstate->transindices[ev]]);

    // the current state is 
    currstate = &(p->cfg->states[p->activestate]);

    // the next state is
    nextstate = &(p->cfg->states[transition->next]);


    // execute on-exit
    if((currstate != nextstate) && (NULL != currstate->on_exit_fn))
    {
        currstate->on_exit_fn(p);
    }

    
    // execute the on-transition
    if(NULL != transition->on_transition_fn)
    {
        transition->on_transition_fn(p);
    }
    
    // move to next state
    p->activestate = transition->next;
   

    // execute on-entry
    if((currstate != nextstate) && (NULL != nextstate->on_entry_fn))
    {
        nextstate->on_entry_fn(p);
    }

   
    return(eores_OK);
}