#ifdef MODULE
#include <linux/string.h>
#else
#include <stdio.h>
#include <string.h>
#endif
#include "classicladder.h"
#include "global.h"
#include "vars_access.h"
#include "calc_sequential.h"
void InitSequential( void )
{
int NumStep;
int NumTrans;
int NumSwitch;
int NumSeqComment;
for( NumStep=0; NumStep<NBR_STEPS; NumStep++ )
{
Sequential->Step[ NumStep ].InitStep = FALSE;
Sequential->Step[ NumStep ].StepNumber = 0;
Sequential->Step[ NumStep ].NumPage = -1;
Sequential->Step[ NumStep ].PosiX = 0;
Sequential->Step[ NumStep ].PosiY = 0;
Sequential->Step[ NumStep ].Activated = FALSE;
Sequential->Step[ NumStep ].TimeActivated = 0;
Sequential->Step[ NumStep ].OffDrawCrossStep = 0;
}
for( NumTrans=0; NumTrans<NBR_TRANSITIONS; NumTrans++ )
{
Sequential->Transition[ NumTrans ].VarTypeCondi = 0;
Sequential->Transition[ NumTrans ].VarNumCondi = 0;
for( NumSwitch=0; NumSwitch<NBR_SWITCHS_MAX; NumSwitch++ )
{
Sequential->Transition[ NumTrans ].NumStepToActiv[ NumSwitch ] = -1;
Sequential->Transition[ NumTrans ].NumStepToDesactiv[ NumSwitch ] = -1;
Sequential->Transition[ NumTrans ].NumTransLinkedForStart[ NumSwitch ] = -1;
Sequential->Transition[ NumTrans ].NumTransLinkedForEnd[ NumSwitch ] = -1;
}
Sequential->Transition[ NumTrans ].NumPage = -1;
Sequential->Transition[ NumTrans ].PosiX = 0;
Sequential->Transition[ NumTrans ].PosiY = 0;
Sequential->Transition[ NumTrans ].Activated = FALSE;
}
for( NumSeqComment=0; NumSeqComment<NBR_SEQ_COMMENTS; NumSeqComment++ )
{
Sequential->SeqComment[ NumSeqComment ].NumPage = -1;
Sequential->SeqComment[ NumSeqComment ].PosiX = 0;
Sequential->SeqComment[ NumSeqComment ].PosiY = 0;
Sequential->SeqComment[ NumSeqComment ].Comment[ 0 ] = '\0';
}
}
void PrepareSequential( void )
{
int NumStep,NumTrans;
for( NumStep=0; NumStep<NBR_STEPS; NumStep++ )
{
Sequential->Step[ NumStep ].Activated = FALSE;
Sequential->Step[ NumStep ].TimeActivated = 0;
if ( Sequential->Step[ NumStep ].InitStep )
Sequential->Step[ NumStep ].Activated = TRUE;
}
for( NumTrans=0; NumTrans<NBR_TRANSITIONS; NumTrans++ )
Sequential->Transition[ NumTrans ].Activated = FALSE;
}
int RefreshTransi( StrTransition * pTransi )
{
int HasChanged = FALSE;
pTransi->Activated = ReadVar( pTransi->VarTypeCondi, pTransi->VarNumCondi );
if ( pTransi->Activated )
{
int AllStepsOn = TRUE;
int ScanStep = 0;
while( ScanStep<NBR_SWITCHS_MAX && pTransi->NumStepToDesactiv[ ScanStep ]!=-1 && AllStepsOn )
{
if ( !Sequential->Step[ pTransi->NumStepToDesactiv[ ScanStep ] ].Activated )
AllStepsOn = FALSE;
ScanStep++;
}
if ( AllStepsOn )
{
HasChanged = TRUE;
ScanStep = 0;
while( ScanStep<NBR_SWITCHS_MAX && pTransi->NumStepToDesactiv[ ScanStep ]!=-1 )
{
Sequential->Step[ pTransi->NumStepToDesactiv[ ScanStep ] ].Activated = FALSE;
ScanStep++;
}
ScanStep = 0;
while( ScanStep<NBR_SWITCHS_MAX && pTransi->NumStepToActiv[ ScanStep ]!=-1 )
{
Sequential->Step[ pTransi->NumStepToActiv[ ScanStep ] ].Activated = TRUE;
ScanStep++;
}
}
}
return HasChanged;
}
void RefreshStepsVars( void )
{
int NumStep;
for( NumStep=0; NumStep<NBR_STEPS; NumStep++ )
{
if ( Sequential->Step[ NumStep ].Activated )
Sequential->Step[ NumStep ].TimeActivated += InfosGene->GeneralParams.PeriodicRefreshMilliSecs;
else
Sequential->Step[ NumStep ].TimeActivated = 0;
WriteVar( VAR_STEP_ACTIVITY, Sequential->Step[ NumStep ].StepNumber, Sequential->Step[ NumStep ].Activated );
WriteVar( VAR_STEP_TIME, Sequential->Step[ NumStep ].StepNumber, Sequential->Step[ NumStep ].TimeActivated/1000 );
}
}
void RefreshSequentialPage( int PageNbr )
{
int ScanTransi;
StrTransition * pTransi;
int StateChanged;
int LoopSecurity = 0;
do
{
StateChanged = FALSE;
for( ScanTransi=0; ScanTransi<NBR_TRANSITIONS; ScanTransi++ )
{
pTransi = &Sequential->Transition[ ScanTransi ];
if( pTransi->NumPage==PageNbr )
{
if ( RefreshTransi( pTransi ) )
StateChanged = TRUE;
}
}
LoopSecurity++;
}
while( StateChanged && LoopSecurity<50 );
RefreshStepsVars( );
}