사용자 코드는 상태 차트에서 상태 전이의 조치 파트입니다. 예를 들어, 3 값을 사용하는 경우 3행 이하의 코드로 구성된 조치가 있는 모든 상태 전이는 호출 함수에서 자동으로 인라인 지정됩니다.
인라인 지정은 생성된 코드의 함수 호출을 함수의 본문을 구성하는 실제 코드 명령문으로 바꾸는 것입니다. 이 방법은 코드 크기를 약간 늘려서 코드 실행을 최적화합니다. 예를 들어, 인라인 지정할 수 있는 행의 수를 3에서 5로 늘리면 최대 10%의 코드 실행 시간이 단축됩니다.
예를 들어, HomeHeatingSystem 오브젝트의 상태 차트에서 systemControl 상태는 제한시간 초과 시 다음 조치 파트가 있는 출력 상태 전이를 가집니다.
if(IS_IN(&me->theFurnace,Furnace_starting)) RiCGEN(&me->theFurnace,motorReady());

이 조치는 Furnace가 시작 상태인 경우 motorReady() 이벤트를 HomeHeatingSystem에서 Furnace로 보냅니다.
ComplexityForInlining 특성이 0(기본값)으로 설정된 경우, 상태 전이 코드는 다음과 같이 HomeHeatingSystem 오브젝트 systemControl 상태의 takeEvent() 오퍼레이션에 생성됩니다.
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;
}
HomeHeatingSystem 오브젝트 rootState의 dispatchEvent() 오퍼레이션은 다음과 같이 takeEvent() 오퍼레이션을 호출합니다.
static int rootState_dispatchEvent(
void * const void_me, short id) {
HomeHeatingSystem * const me =
(HomeHeatingSystem *)void_me;
int res = eventNotConsumed;
switch (me->rootState_active) {
case HomeHeatingSystem_systemControl:
{
res =
HomeHeatingSystem_systemControl_takeEvent(
me, id);
break;
};
default:
break;
};
return res;
}
그러나 ComplexityForInlining이 3으로 설정된 경우(예를 들어, 조치 코드가 3행 미만이므로), 다음과 같이 rootState의 dispatchEvent() 오퍼레이션에 직접 생성되어 takeEvent() 호출을 대체합니다.
static int rootState_dispatchEvent(void * const void_me,
short id) {
HomeHeatingSystem * const me = (HomeHeatingSystem *)
void_me;
int res = eventNotConsumed;
switch (me->rootState_active) {
case HomeHeatingSystem_systemControl:
{
if(id == Timeout_id)
{
if(RiCTimeout_getTimeoutId(
(RiCTimeout*) me
->ric_reactive.current_event) ==
HomeHeatingSystem_Timeout_systemControl_id)
{
NOTIFY_TRANSITION_STARTED(me,HomeHeatingSystem,
"1");
RiCTask_unschedTm(me->ric_reactive.myTask,
HomeHeatingSystem_Timeout_systemControl_id,
&me->ric_reactive);
NOTIFY_STATE_EXITED(me, HomeHeatingSystem,
"ROOT.systemControl");
{
/*#[ transition 1 */
if(IS_IN(&me->theFurnace,Furnace_starting))
RiCGEN(&me->theFurnace,motorReady());
/*#]*/
}
}
/* rest of dispatchEvent() */
}