/* * instance state machine event dispatching */ void stringtest_device_Dispatch( Escher_xtUMLEvent_t * event ) { Escher_iHandle_t instance = GetEventTargetInstance( event ); Escher_EventNumber_t event_number = GetOoaEventNumber( event ); Escher_StateNumber_t current_state; Escher_StateNumber_t next_state; if ( 0 != instance ) { current_state = instance->current_state; if ( current_state > 2 ) { /* instance validation failure (object deleted while event in flight) */ UserEventNoInstanceCallout( event_number ); } else { next_state = stringtest_device_StateEventMatrix[ current_state ][ event_number ]; if ( next_state <= 2 ) { STATE_TXN_START_TRACE( "device", current_state, state_name_strings[ current_state ] ); /* Execute the state action and update the current state. */ ( *stringtest_device_acts[ next_state ] )( instance, event ); STATE_TXN_END_TRACE( "device", next_state, state_name_strings[ next_state ] ); instance->current_state = next_state; } else if ( next_state == EVENT_CANT_HAPPEN ) { /* event cant happen */ UserEventCantHappenCallout( current_state, next_state, event_number ); STATE_TXN_CH_TRACE( "device", current_state ); } else { /* empty else */ } } } }
/* * class-based state machine event dispatching */ void Tracking_Display_CBDispatch( Escher_xtUMLEvent_t * event ) { static Escher_InstanceBase_t class_based_singleton = { Tracking_Display_CB_STATE_1 }; Escher_EventNumber_t event_number = GetOoaEventNumber( event ); Escher_StateNumber_t current_state = class_based_singleton.current_state; Escher_StateNumber_t next_state = Tracking_Display_CB_StateEventMatrix[ current_state ][ event_number ]; if ( next_state <= 5 ) { STATE_TXN_START_TRACE( "Display", current_state, state_name_strings_CB[ current_state ] ); /* Execute the state action and update the current state. */ ( *Tracking_Display_CB_acts[ next_state ] )( &class_based_singleton, event ); class_based_singleton.current_state = next_state; STATE_TXN_END_TRACE( "Display", next_state, state_name_strings_CB[ next_state ] ); } else { if ( EVENT_CANT_HAPPEN == next_state ) { /* Event cannot happen. */ UserEventCantHappenCallout( current_state, next_state, event_number ); STATE_TXN_CH_TRACE( "Display", current_state ); } else if ( EVENT_IS_IGNORED == next_state ) { /* Event ignored */ STATE_TXN_IG_TRACE( "Display", current_state ); } else { /* Translation/memory/stack error, etc - TBD */ } } }
/* * instance state machine event dispatching */ void MicrowaveOven_MO_TRN_Dispatch( Escher_xtUMLEvent_t * event ) { Escher_iHandle_t instance = GetEventTargetInstance( event ); Escher_EventNumber_t event_number = GetOoaEventNumber( event ); Escher_StateNumber_t current_state; Escher_StateNumber_t next_state; if ( 0 != instance ) { current_state = instance->current_state; if ( current_state > 2 ) { /* instance validation failure (object deleted while event in flight) */ UserEventNoInstanceCallout( event_number ); } else { next_state = MicrowaveOven_MO_TRN_StateEventMatrix[ current_state ][ event_number ]; if ( next_state <= 2 ) { STATE_TXN_START_TRACE( "MO_TRN", current_state, state_name_strings[ current_state ] ); /* Execute the state action and update the current state. */ ( *MicrowaveOven_MO_TRN_acts[ next_state ] )( instance, event ); STATE_TXN_END_TRACE( "MO_TRN", next_state, state_name_strings[ next_state ] ); instance->current_state = next_state; } else if ( next_state == EVENT_IS_IGNORED ) { /* event ignored */ STATE_TXN_IG_TRACE( "MO_TRN", current_state ); } else { /* empty else */ } } } }
/* * instance state machine event dispatching */ void infusion_infusion_Dispatch( Escher_xtUMLEvent_t * event ) { Escher_iHandle_t instance; Escher_EventNumber_t event_number = GetOoaEventNumber( event ); Escher_StateNumber_t current_state; Escher_StateNumber_t next_state; if ( 0 != GetIsCreationEvent( event ) ) { instance = Escher_CreateInstance( infusion_DOMAIN_ID, infusion_infusion_CLASS_NUMBER ); if ( 0 != instance ) { instance->current_state = UNINITIALIZED_STATE; SetEventTargetInstance( event, instance ); } else { /* Instance allocation failure - USER RECOVERY LOGIC IS TBD */ UserEventNoInstanceCallout( 0 ); } } else { instance = GetEventTargetInstance( event ); } if ( 0 != instance ) { current_state = instance->current_state; if ( current_state > 5 ) { /* instance validation failure (object deleted while event in flight) */ UserEventNoInstanceCallout( event_number ); } else { next_state = infusion_infusion_StateEventMatrix[ current_state ][ event_number ]; if ( next_state <= 5 ) { STATE_TXN_START_TRACE( "infusion", current_state, state_name_strings[ current_state ] ); /* Execute the state action and update the current state. */ ( *infusion_infusion_acts[ next_state ] )( instance, event ); STATE_TXN_END_TRACE( "infusion", next_state, state_name_strings[ next_state ] ); instance->current_state = next_state; } else if ( next_state == EVENT_CANT_HAPPEN ) { /* event cant happen */ UserEventCantHappenCallout( current_state, next_state, event_number ); STATE_TXN_CH_TRACE( "infusion", current_state ); } else { /* empty else */ } } } }