이벤트 수행

takeEvent() 오퍼레이션은 이벤트 큐에서 이벤트를 가져와서 해당 이벤트가 현재 상태 외부에서 오브젝트의 상태 전이를 트리거하기에 올바른지 평가합니다.

이 태스크 정보

takeEvent() 오퍼레이션 이름의 형식은 다음과 같습니다.

<object>_<state>_takeEvent(<object>* const <me>, 
<event ID>)

이벤트 ID는 패키지 스펙 파일의 맨 위에서 이벤트에 대해 생성된 ID 번호입니다.

예를 들어, HomeHeatingSystem의 systemControl 상태의 경우 다음 takeEvent() 오퍼레이션이 생성됩니다.

int HomeHeatingSystem_systemControl_takeEvent(
   HomeHeatingSystem* const me, short id);

이 오퍼레이션의 구현은 다음과 같습니다.

int HomeHeatingSystem_systemControl_takeEvent(
   HomeHeatingSystem* const me, short id) {
   int res = eventNotConsumed;
   if(id == Timeout_id)
    {
      if(RiCTimeout_getTimeoutId((RiCTimeout*) 
         me->ric_reactive.current_event) ==
         HomeHeatingSystem_Timeout_systemControl_id)
       {
         NOTIFY_TRANSITION_STARTED(me,
            HomeHeatingSystem, "1");            
         HomeHeatingSystem_systemControl_exit(me);
         {
            /*#[ transition 1 */
            if(IS_IN(&me->theFurnace,Furnace_starting))
               RiCGEN(&me->theFurnace,motorReady());
            /*#]*/
         }
         systemControl_entDef(me);
         NOTIFY_TRANSITION_TERMINATED(me,
         HomeHeatingSystem, "1");
         res = eventConsumed;
      }
   }
   return res;
}
참고: takeEvent() 오퍼레이션은 루트 상태에 대해 생성되지 않습니다.

피드백