SWITCH-технология автоматный подход к созданию программного обеспечения «реактивных» систем
Приложение 2. Пример функции, реализующей автомат
#include "photon_stuff.h"
#include "dg.h"
#include "log.h"
#include "defines.h"
void A0( int e, dg_t *dg )
{
int y_old = dg->y0 ;
#ifdef A0_BEGIN_LOGGING
log_begin( dg, "A0", y_old, e ) ;
#endif
switch( dg->y0 )
{
case 0:
A8( e, dg ) ;
if( x220(dg) ) dg->y0 = 4 ;
else
if( dg->y7 == 2 ) dg->y0 = 7 ;
else
if( dg->y8 == 2 ) dg->y0 = 1 ;
break ;
case 1:
A4( e, dg ) ; A3( e, dg ) ; A1( e, dg ) ;
if( dg->y4 != 0 ) dg->y0 = 6 ;
else
if( dg->y7 == 2 || dg->y7 == 4 ) dg->y0 = 8 ;
else
if( dg->y3 != 0 ) dg->y0 = 5 ;
else
if( dg->y1 == 0 ) dg->y0 = 0 ;
else
if( dg->y1 == 3 ) dg->y0 = 7 ;
else
if( dg->y1 == 2 ) dg->y0 = 2 ;
break ;
case 2:
A4( e, dg ) ; A3( e, dg ) ; A9( e, dg ) ;
if( dg->y4 != 0 ) dg->y0 = 6 ;
else
if( dg->y7 == 2 || dg->y7 == 4 ) dg->y0 = 8 ;
else
if( dg->y3 != 0 ) dg->y0 = 5 ;
else
if( dg->y9 == 0 ) dg->y0 = 0 ;
else
if( e == 20 ) dg->y0 = 3 ;
break ;
case 3:
A4( e, dg ) ; A3( e, dg ) ; A2( e, dg ) ;
if( dg->y4 != 0 ) dg->y0 = 6 ;
else
if( dg->y7 == 2 || dg->y7 == 4 ) dg->y0 = 8 ;
else
if( dg->y3 != 0 ) dg->y0 = 5 ;
else
if( dg->y2 == 4 ) dg->y0 = 7 ;
else
if( dg->y2 == 3 ) dg->y0 = 4 ;
break ;
case 4:
A4( e, dg ) ; A3( e, dg ) ; A10( e, dg ) ;
if( dg->y4 != 0 ) dg->y0 = 6 ;
else
if( dg->y7 == 2 || dg->y7 == 4 ) dg->y0 = 8 ;
else
if( dg->y3 != 0 ) dg->y0 = 5 ;
else
if( dg->y10 == 5 ) dg->y0 = 8 ;
else
if( !x220(dg) ) dg->y0 = 0 ;
break ;
case 5:
A4( e, dg ) ; A3( e, dg ) ;
if( dg->y4 != 0 ) dg->y0 = 6 ;
else
if( dg->y3 == 0 ) dg->y0 = 0 ;
break ;
case 6:
A4( e, dg ) ;
if( dg->y4 == 0 ) dg->y0 = 7 ;
break ;
case 7:
A11( e, dg ) ;
if( dg->y11 == 2 ) dg->y0 = 0 ;
break ;
case 8:
A12( e, dg ) ;
if( dg->y12 == 0 ) dg->y0 = 7 ;
break ;
default:
#ifdef A0_ERRORS_LOGGING
log_write( LOG_GRAPH_ERROR, dg->number,
"Ошибка в автомате A0: неизвестный номер состояния!", 0 ) ;
#endif
} ;
if( y_old == dg->y0 ) goto A0_end ;
{
#ifdef A0_TRANS_LOGGING
log_trans( "A0", y_old, dg->y0 ) ;
#endif
#ifdef DEBUG_FRAME
update_debug() ;
#endif
} ;
switch( dg->y0 )
{
case 0:
A8( 0, dg ) ;
z290_0(dg) ;
break ;
case 1:
A4( 0, dg ) ; A3( 0, dg ) ; A1( 0, dg ) ;
z290_0(dg) ;
break ;
case 2:
A4( 0, dg ) ; A3( 0, dg ) ; A9( 0, dg ) ;
z290_0(dg) ;
break ;
case 3:
A4( 0, dg ) ; A3( 0, dg ) ; A2( 0, dg ) ;
z290_2(dg) ;
break ;
case 4:
A4( 0, dg ) ; A3( 0, dg ) ; A10( 0, dg ) ;
z290_1(dg) ;
break ;
case 5:
A4( 0, dg ) ; A3( 0, dg ) ;
z290_3(dg) ;
break ;
case 6:
A4( 0, dg ) ;
z290_3(dg) ;
break ;
case 7:
A11( 0, dg ) ;
z290_0(dg) ;
break ;
case 8:
A12( 0, dg ) ;
z290_3(dg) ;
break ;
} ;
A0_end: ;
#ifdef A0_END_LOGGING
log_end( dg, "A0", dg->y0, e ) ;
#endif
} ;