/*****************************************************************************
* File: EXP_T_object.c
*
* Object: technique (T)
* Subsystem: experiment
* Domain: EXP
* Repository: exp.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 "EXP_objects.h"
#include "EXP_T_object.h"
#include "EXP_T_events.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.
****************************************************************************/
/* 4000 */
static EXP_T_s EXP_T_ObjectPool_s[ EXP_T_MAX_EXTENT_SIZE ];
/* 4000 */
static Escher_ObjectSet_s EXP_T_ActiveExtent_s; /* set container */
Escher_ObjectSet_s * pG_EXP_T_extent;
static Escher_ObjectSet_s * p_EXP_T_inanimate;
/*****************************************************************************
* Initialize object factory services.
****************************************************************************/
void
EXP_T_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 < EXP_T_MAX_EXTENT_SIZE; i++ )
{
Escher_SetInsertElement( &s, &EXP_T_ObjectPool_s[ i ] );
}
p_EXP_T_inanimate = s.next; /* free list head */
/* Initialize object class extent (animate list) to empty. */
Escher_InitSet( &EXP_T_ActiveExtent_s );
pG_EXP_T_extent = &EXP_T_ActiveExtent_s;
}
/*****************************************************************************
* Object Creation Accessor
****************************************************************************/
EXP_T_s *
EXP_T_Create()
{
Escher_ObjectSet_s * node;
EXP_T_s * self;
/* Check if object pool is empty. */
if ( !p_EXP_T_inanimate ) {
UserObjectPoolEmptyCallout( "exp", "technique" );
return (EXP_T_s *) 0;
}
/* Acquire instance storage from object free pool. */
node = p_EXP_T_inanimate;
p_EXP_T_inanimate = p_EXP_T_inanimate->next;
self = (EXP_T_s *) node->object;
/* Initialize application analysis object attributes. */
self->m_T_ID = (Escher_UniqueID_t) self;
self->m_start = 0;
self->m_end = 0;
self->m_number_of_batches = 0;
self->m_current_batch = 0;
self->mc_current_state = EXP_T_STATE_1;
/* Insert instance into active extent (animate). */
node->next = pG_EXP_T_extent->next;
pG_EXP_T_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
EXP_T_StateEventMatrix[3][3] =
{
/* Row 0: 'Unitialized' */
{ EVENT_CANT_HAPPEN, EVENT_CANT_HAPPEN, EVENT_CANT_HAPPEN },
/* Row 1: EXP_T_STATE_1 'idle' */
{ EXP_T_STATE_2, EVENT_IS_IGNORED, EVENT_IS_IGNORED },
/* Row 2: EXP_T_STATE_2 'running' */
{ EVENT_IS_IGNORED, EXP_T_STATE_2, EXP_T_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
EXP_T_Actions[3] =
{
(StateAction_t) 0,
(StateAction_t) EXP_T_Action_1, /* 'idle' */
(StateAction_t) EXP_T_Action_2 /* 'running' */
};
/*****************************************************************************
* EXP_T_Dispatch - State model level event dispatching.
****************************************************************************/
void
EXP_T_Dispatch( const OoaEvent_t * const event )
{
EXP_T_s * instance = (EXP_T_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 = EXP_T_StateEventMatrix[ current_state ][ event_number ];
if ( next_state <= 2 )
{
/* Execute the state action and update 'current state' */
( *EXP_T_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 */
}
}
}
}
}