/***************************************************************************** * File: A_CAR_object.c * * Object: carousel (CAR) * Subsystem: autosampler * Domain: A * Repository: as2.ooa * * Notice: * (C) Copyright 1999, 2000 ROX Software, Inc. * All rights reserved. * * Model Compiler: MC3020 V1.3.0 * * Warnings: * !!! THIS IS AN AUTO-GENERATED FILE. PLEASE DO NOT EDIT. !!! ****************************************************************************/ #include "A_objects.h" #include "A_CAR_object.h" #include "A_CAR_events.h" #include "A_ROW_object.h" /***************************************************************************** * Statically allocate space for the instance population for this object. * Allocate space for the object and its attributes. * Depending on the collection scheme, allocate containoids (collection * nodes) for gathering instances into free and active extents. ****************************************************************************/ static A_CAR_s A_CAR_ObjectPool_s[ A_CAR_MAX_EXTENT_SIZE ]; static Escher_ObjectSet_s A_CAR_ActiveExtent_s; /* set container */ Escher_ObjectSet_s * pG_A_CAR_extent; static Escher_ObjectSet_s * p_A_CAR_inanimate; /***************************************************************************** * Initialize object factory services. ****************************************************************************/ void A_CAR_FactoryInit() { unsigned int i; Escher_ObjectSet_s s; Escher_InitSet( &s ); /* Initialize object instance storage free pool (inanimate list) * by linking the containoids into a linear, null-terminated, * singly linked list. */ for ( i = 0; i < A_CAR_MAX_EXTENT_SIZE; i++ ) { Escher_SetInsertElement( &s, &A_CAR_ObjectPool_s[ i ] ); } p_A_CAR_inanimate = s.next; /* free list head */ /* Initialize object class extent (animate list) to empty. */ Escher_InitSet( &A_CAR_ActiveExtent_s ); pG_A_CAR_extent = &A_CAR_ActiveExtent_s; } /***************************************************************************** * Object Creation Accessor ****************************************************************************/ A_CAR_s * A_CAR_Create() { Escher_ObjectSet_s * node; A_CAR_s * self; /* Check if object pool is empty. */ if ( !p_A_CAR_inanimate ) { UserObjectPoolEmptyCallout( "as2", "carousel" ); return (A_CAR_s *) 0; } /* Acquire instance storage from object free pool. */ node = p_A_CAR_inanimate; p_A_CAR_inanimate = p_A_CAR_inanimate->next; self = (A_CAR_s *) node->object; /* Initialize application analysis object attributes. */ self->m_carousel_ID = 0; self->m_destination = 0; self->m_current_position = 0; /* Initialize relationship storage */ self->mc_ROW_R1 = 0; self->mc_current_state = A_CAR_STATE_1; /* Insert instance into active extent (animate). */ node->next = pG_A_CAR_extent->next; pG_A_CAR_extent->next = node; return self; } /***************************************************************************** * State-Event Matrix (SEM) * Row Index is object's current (MC enumerated) current state. * Row zero is the unitialized state (e.g., for creation event transitions). * Column Index is (MC enumerated) state machine events. *****************************************************************************/ static const Escher_StateNumber_t A_CAR_StateEventMatrix[3][2] = { /* Row 0: 'Unitialized' */ { EVENT_CANT_HAPPEN, EVENT_CANT_HAPPEN }, /* Row 1: A_CAR_STATE_1 'resting' */ { A_CAR_STATE_2, EVENT_IS_IGNORED }, /* Row 2: A_CAR_STATE_2 'going' */ { EVENT_IS_IGNORED, A_CAR_STATE_1 } }; /***************************************************************************** * Array of pointers to the object's state action methods. * Index is the (MC enumerated) number of the state action method to execute. ****************************************************************************/ static const StateAction_t A_CAR_Actions[3] = { (StateAction_t) 0, (StateAction_t) A_CAR_Action_1, /* 'resting' */ (StateAction_t) A_CAR_Action_2 /* 'going' */ }; /***************************************************************************** * A_CAR_Dispatch - State model level event dispatching. ****************************************************************************/ void A_CAR_Dispatch( const OoaEvent_t * const event ) { A_CAR_s * instance = (A_CAR_s *)GetEventTargetInstance( event ); Escher_EventNumber_t event_number = GetOoaEventNumber( event ); Escher_StateNumber_t current_state; Escher_StateNumber_t next_state; if ( instance ) { current_state = instance->mc_current_state; if ( current_state > 2 ) { /* Instance validation failure (deleted while event in flight) - TBD */ } else { next_state = A_CAR_StateEventMatrix[ current_state ][ event_number ]; if ( next_state <= 2 ) { /* Execute the state action and update 'current state' */ ( *A_CAR_Actions[ next_state ] )( instance, event ); instance->mc_current_state = next_state; } else { if ( next_state == EVENT_CANT_HAPPEN ) { /* Event can't happen */ UserEventCantHappenCallout( current_state, next_state, event_number ); } else if ( next_state == EVENT_IS_IGNORED ) { /* Event ignored */ } else { /* Translation/memory/stack error, etc - TBD */ } } } } }