/*****************************************************************************
* File: sys_init.c
*
* Description:
* Main entrance and parameters of the wild thing...
*
* 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 <stdlib.h>
#include "sys_init.h"
#include "e_mechs.h"
#include "e_events.h"
#include "e_objset.h"
#include "sys_user_co.h"
#include "A_dom_init.h"
#include "EXP_dom_init.h"
/*****************************************************************************
* system-level domain dispatcher table
* This table contains pointers to dispatcher tables for each of
* the OOA domains generated for this system.
****************************************************************************/
static const DomainDispatcher_t DomainDispatcherTable[ 3 ] =
{
0,
(DomainDispatcher_t) A_DomainDispatcher,
(DomainDispatcher_t) EXP_DomainDispatcher
};
extern void RunApplicationInitSequence( void );
static bool run_flag = true;
/*****************************************************************************
* main process
****************************************************************************/
int
main ( int argc, char * argv[] )
{
OoaEvent_t * event;
/* Execute user supplied system initialization. */
UserInitializationCallout();
/* Execute generated system initialization phase. */
SystemLevelInitialization();
/* Execute OOA domain specific initialization phase(s). */
ApplicationLevelInitialization();
/* Execute application analysis initialization phase(s). */
UserPreOoaInitializationCallout(); /* User supplied pre-init. */
RunApplicationInitSequence(); /* OOA init object states. */
UserPostOoaInitializationCallout(); /* User supplied post-init. */
/* Start consuming events and dispatching background processes. */
while ( run_flag )
{
/* Dispatch an OOA self directed event. */
if ( ( event = DequeueOoaSelfEvent() ) != 0 )
{
( *DomainDispatcherTable[ GetEventDestDomainNumber( event ) ] )( event );
Escher_DeleteOoaEvent( event );
} /* end self */
else
/* Dispatch one OOA non-self directed event. */
if ( ( event = DequeueOoaNonSelfEvent() ) != 0 )
{
( *DomainDispatcherTable[ GetEventDestDomainNumber( event ) ] )( event );
if ( GetFsmReleasesEvent( event ) ) {
Escher_DeleteOoaEvent( event );
}
} /* end non-self */
/* Launch (interrupt) bridge actions that occurred during state. */
DispatchInterleaveBridge();
/* User supplied background processing callout. */
UserBackgroundProcessingCallout();
}
/* Shutdown phasing */
UserPreShutdownCallout();
ApplicationLevelShutdown();
SystemLevelShutdown();
UserPostShutdownCallout();
return 0;
}
/*****************************************************************************
* SystemLevelInitialization
****************************************************************************/
void
SystemLevelInitialization()
{
/* Initialize the container pool. */
Escher_SetFactoryInit();
/* Initialize OOA event pool and queues. */
InitializeOoaEventPool();
InitializeOoaNonSelfEventQueue();
InitializeOoaSelfEventQueue();
}
/*****************************************************************************
* ApplicationLevelInitialization
****************************************************************************/
void
ApplicationLevelInitialization()
{
/* Initialize all the domains */
IntializeDomain_A();
IntializeDomain_EXP();
}
/*****************************************************************************
* SystemLevelShutdown
****************************************************************************/
void
SystemLevelShutdown()
{}
/*****************************************************************************
* ApplicationLevelShutdown
****************************************************************************/
void
ApplicationLevelShutdown()
{
/* Shutdown all the domains */
ShutdownDomain_A();
ShutdownDomain_EXP();
}
typedef void ( * interleaved_bridge_t )( void );
static interleaved_bridge_t interleaved_bridges[ SYS_MAX_INTERLEAVED_BRIDGES ];
static unsigned char interleaved_bridges_tail = 0;
/*****************************************************************************
* InterleaveBridge
* Post a bridge routine for execution after any executing state
* action completes.
* Protect the data structures from being clobbered by another context
* by disabling interrupts around the data access.
****************************************************************************/
void
InterleaveBridge( void (vfp)(void) )
{
/* disable interrupts */
if ( interleaved_bridges_tail < SYS_MAX_INTERLEAVED_BRIDGES )
{
interleaved_bridges[ interleaved_bridges_tail++ ] = vfp;
}
/* enable interrupts */
}
/*****************************************************************************
* DispatchInterleaveBridge
* Sequentially execute each of the bridge routines that have been
* posted during the most recent executing state action.
* Protect the data structures from being clobbered by another context
* by disabling interrupts around the data access.
****************************************************************************/
void
DispatchInterleaveBridge()
{
unsigned char i = 0;
/* disable interrupts */
while ( i < interleaved_bridges_tail )
{
/* enable interrupts */
interleaved_bridges[ i++ ](); /* Bridge runs with interrupts enabled. */
/* disable interrupts */
}
interleaved_bridges_tail = 0;
/* enable interrupts */
}