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); }
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); }