2017-10-16 14:55:10 +00:00
///
2018-10-10 12:03:48 +00:00
/// Copyright (c) 2018 Sensus Slovensko a.s.
2017-10-16 14:55:10 +00:00
///
using System ;
using System.Collections.Generic ;
using System.Text ;
using log4net ;
using TBF.BenchControl ;
using TBF.Resources ;
using TBF.UiBridge ;
namespace TBF.BenchControl.TestMethods.SensitivityTest
{
public class SensitivityTestSeq : Sequences . SequenceBase
{
private static readonly ILog log = LogManager . GetLogger ( typeof ( SensitivityTestSeq ) ) ;
const int DetectionBufferSize = 9 ;
const int DetectionKernelSize = 5 ;
2018-02-26 11:18:04 +00:00
/// <summary>
/// Executes the specified test.
/// </summary>
/// <param name="test">The test.</param>
/// <param name="repetitionNr">The repetition nr.</param>
2018-10-10 12:03:48 +00:00
/// <param name="isLastRepetition">true when this is the last repetition</param>
2018-02-26 11:18:04 +00:00
/// <param name="testParams">The test parameters.</param>
/// <param name="debugLevel">The debug level.</param>
/// <returns></returns>
2018-10-10 12:03:48 +00:00
public IList < Event > Execute ( Config . Entities . Test test , int repetitionNr , bool isLastRepetition ,
TestParams testParams ,
2017-10-16 14:55:10 +00:00
Config . Entities . DebugMode debugLevel )
{
if ( debugLevel = = Config . Entities . DebugMode . Simulate )
{
2018-10-10 12:03:48 +00:00
/// TODO: Test method simulation
2017-10-16 14:55:10 +00:00
IList < Event > retListSim = new List < Event > ( 1 ) ;
2018-10-10 12:03:48 +00:00
retListSim . Add ( Event . Done ) ;
return retListSim ;
2017-10-16 14:55:10 +00:00
}
2018-10-10 12:03:48 +00:00
IList < Event > e = new List < Event > ( ) ; /// Events from currently running operations
checkUiOp = new Operations . CheckUIOp ( true ) ; /// Runs in more then one state
float switchTimeStart = 0.001f ; /// in seconds, original vale is 1 ms
float switchTimeEnd = 0.001f ; /// in seconds, original vale is 1 ms
2017-10-16 14:55:10 +00:00
Elde . ControlBoardDev cBrd = StateMachine . ControlBoard ;
/// Specific for combined meters
2018-10-10 12:03:48 +00:00
int [ ] lastWMPulses = new int [ Config . Data . WMsCount ] ;
2017-10-16 14:55:10 +00:00
//--------------------------------
State . Create ( string . Format ( "{0}({1}) : stopTest diverter gate etc" , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
. AddOperation ( cBrd . StopPreviousOp ( ) )
. EnterState ( ) ;
do
{
e = StateMachine . WaitRunDevsRunOps ( ) ;
if ( TestAndLogUiCmdStop ( test , e ) ) goto stopTest ;
}
while ( ! e . Contains ( Event . PreviousStopped ) ) ;
LtrPerRefPulse = outPath . FlowMeter . LtrPerPulse ; /// [ltr/pulse], nominal flow in [m3/h]
/// Notes:
/// float timeHr = volumeLtr / (1000.0f * targetFlow);
/// float timeSec = 3600.0f * timeHr;
/// int refPulses = (int)(timeSec * (2000.0f * targetFlow / pOut.FlowMeter.NominalFlow));
int totalPulses = ( int ) ( test . Volume / LtrPerRefPulse + 0.5f ) ;
processDataLoggingOp = new TBF . BenchControl . Operations . ProcessDataLoggingOp ( processDataLogger , this , false ) ;
/// Meters path is required for the following:
readRegistersOp = new Operations . ReadMoreRegistersOp ( sensPath . RegisterReaders ) ;
//====================================
loop :
/// Start the test, initialize test results
Bridge . OnTestSelected ( this , new TestSelectedEventArgs ( test , repetitionNr , inPath , benchPath , outPath , sensPath , ( int ) totalPulses ) ) ;
string testName = Results . Utils . GetTestName ( test . Name , test . Repeats , repetitionNr ) ;
TestStartTime = DateTime . Now ;
Qrise = 0 ;
///
/// Prepare cameras, ROI-s and measurementOperations
///
/// Find ROI-s
2018-08-23 09:39:11 +00:00
int [ ] filters = new int [ ] { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
IList < GenericDevices . IRoi > rois = new List < GenericDevices . IRoi > ( ) ;
2017-10-16 14:55:10 +00:00
foreach ( var rr in sensPath . RegisterReaders )
{
2018-08-23 09:39:11 +00:00
TBF . BenchControl . Elde . RegisterReader . RegisterReader regr = rr as TBF . BenchControl . Elde . RegisterReader . RegisterReader ;
if ( regr ! = null )
{
if ( regr . Position > = 1 & & regr . Position < = 8 ) { filters [ regr . Position - 1 ] = regr . Filter ; }
}
GenericDevices . IRoi roi = rr as GenericDevices . IRoi ;
2017-10-16 14:55:10 +00:00
if ( roi ! = null & & roi . Detected )
{
rois . Add ( roi ) ;
}
}
/// Find cameras
IList < GenericDevices . ICamera > cameras = new List < GenericDevices . ICamera > ( ) ;
foreach ( var roi in rois )
{
if ( roi . Camera ! = null & & ! cameras . Contains ( roi . Camera ) )
{
roi . Camera . ClearRoiParams ( ) ;
cameras . Add ( roi . Camera ) ;
}
}
/// Register ROI-parameters to cameras
foreach ( var roi in rois ) roi . RegisterRoiToCamera ( ) ;
/// Prepare measurementOperations
IList < IOperation > measureOperations = new List < IOperation > ( ) ;
foreach ( var camera in cameras ) measureOperations . Add ( camera . MeasurementOp ( ) ) ;
2018-10-10 12:03:48 +00:00
int flowDetectTime0 = StateMachine . Time ;
int flowDetectTime = 0 ;
float estFlowSetTime = 100.0f ;
2017-10-16 14:55:10 +00:00
//------------------------------------------------
Bridge . OnActivity ( this , Strings . Switching_flow_detection ) ;
//------------------------------------------------
State . Create ( string . Format ( "{0}({1}) : Starting the pump" , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
. AddOperations ( measureOperations )
. AddOperation ( ( inPath . Pump is GenericDevices . IPumpFM ) ? ( inPath . Pump as GenericDevices . IPumpFM ) . TurnOnOp ( test . PumpPower ) : null )
. AddOperation ( cBrd . SetValvesOp ( inPath . Pump , null ) )
. EnterState ( ) ;
do
{
e = StateMachine . WaitRunDevsRunOps ( ) ;
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . SwitchingFlowDetection ) ) ;
if ( TestAndLogUiCmdStop ( test , e ) ) goto stopTest ;
}
while ( ! e . Contains ( Event . ValvesSet ) ) ;
//--------------------------------
State . Create ( string . Format ( "{0}({1}) : Setting the initial flow" , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
. AddOperations ( measureOperations )
. AddOperation ( outPath . RegulValve . SetFlowAndMeasureOp ( outPath . FlowMeter , test . Qfrom , test . Qto , outPath . PidCoef , RefFlow , 600 , ( float ) test . TolerRed ) ) /// timeout = 10 min.
. EnterState ( ) ;
do
{
e = StateMachine . WaitRunDevsRunOps ( ) ;
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . SwitchingFlowDetection ) ) ;
if ( TestAndLogUiCmdStop ( test , e ) ) goto stopTest ;
if ( e . Contains ( Event . RegulValveTimeOut ) )
{
2018-06-05 09:16:13 +00:00
Bridge . OnError ( this , Strings . Flow_adjustment_failed ) ;
2017-10-16 14:55:10 +00:00
goto error ;
}
2018-10-10 12:03:48 +00:00
if ( e . Contains ( Event . Next ) ) goto init_flow_set ;
}
2017-10-16 14:55:10 +00:00
while ( ! e . Contains ( Event . FlowReached ) ) ;
//--------------------------------
switch ( ReadRegistersTempPressAmbient ( measureOperations , false ) )
{
case Event . Error : goto error ;
case Event . UiCmdStop : goto stopTest ;
}
2018-10-10 12:03:48 +00:00
init_flow_set :
//====================================
// Find the switching flow
//====================================
2017-10-16 14:55:10 +00:00
int flowSetTime0 = StateMachine . Time ;
/// Allocate detection buffers
double [ ] flowsForDetection = new double [ DetectionBufferSize ] ;
double [ ] pulseFreqsForDetection = new double [ DetectionBufferSize ] ;
/// Current values
flowsForDetection [ 0 ] = RefFlow . Val ;
pulseFreqsForDetection [ 0 ] = 0.0f ;
int startTime = StateMachine . Time ;
int lastTime = StateMachine . Time ;
/// Detection parameters
float rvPulse = ( testParams . TargetQ > ( test . Qfrom + test . Qto ) / 2.0f ) ? 0.05f : - 0.05f ; // rise or fall?
rvPulse * = ( 100.0f * testParams . RateOfChange ) ;
bool detected = false ;
bool targetReached = false ;
double detectedFlow = 0 ;
int detectionStartTime = StateMachine . Time ;
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . SwitchingFlowDetection ) ) ;
do
{
//--------------------------------
State . Create ( string . Format ( "{0}({1}) : Changing the RV position" , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
. AddOperations ( measureOperations )
. AddOperation ( outPath . RegulValve . ChangeRegulValvePositionOp ( rvPulse ) )
. EnterState ( ) ;
do
{
e = StateMachine . WaitRunDevsRunOps ( ) ;
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . SwitchingFlowDetection ) ) ;
if ( TestAndLogUiCmdStop ( test , e ) ) goto stopTest ;
}
while ( ! e . Contains ( Event . PositionReached ) ) ;
// Last pulses are kept to calculate differences
2018-10-10 12:03:48 +00:00
for ( int i = 0 ; i < Config . Data . WMsCount ; i + + ) lastWMPulses [ i ] = RegisterReaders [ i ] . WMPulses ;
2017-10-16 14:55:10 +00:00
// Shift data in the detection buffers
for ( int i = DetectionBufferSize - 2 ; i > = 0 ; i - - )
{
flowsForDetection [ i + 1 ] = flowsForDetection [ i ] ;
pulseFreqsForDetection [ i + 1 ] = pulseFreqsForDetection [ i ] ;
}
switch ( ReadRegistersTempPressAmbient ( measureOperations , false ) )
{
case Event . Error : goto error ;
case Event . UiCmdStop : goto stopTest ;
}
int time = StateMachine . Time ;
2019-01-14 13:32:26 +00:00
/// TODO: !!! The following can only be done for compound meters
2017-10-16 14:55:10 +00:00
int diff = RegisterReaders [ ( test . Part - 1 ) * 2 + 1 ] . WMPulses - lastWMPulses [ ( test . Part - 1 ) * 2 + 1 ] ;
2019-01-14 13:32:26 +00:00
2017-10-16 14:55:10 +00:00
flowsForDetection [ 0 ] = cBrd . ReferenceFreq * outPath . FlowMeter . NominalFlow / 2000.0f ;
pulseFreqsForDetection [ 0 ] = ( float ) diff / ( float ) ( time - lastTime ) ;
lastTime = StateMachine . Time ;
if ( StateMachine . Time - detectionStartTime > 15 )
{
if ( ( flowsForDetection [ 0 ] > 0 ) & & ( flowsForDetection [ DetectionBufferSize - 1 ] > 0 ) )
{
double [ ] flowBefore = new double [ DetectionKernelSize ] ;
double [ ] flowAfter = new double [ DetectionKernelSize ] ;
double [ ] freqBefore = new double [ DetectionKernelSize ] ;
double [ ] freqAfter = new double [ DetectionKernelSize ] ;
for ( int i = 0 ; i < DetectionKernelSize ; i + + )
{
flowBefore [ i ] = flowsForDetection [ DetectionBufferSize - DetectionKernelSize + i ] ;
freqBefore [ i ] = pulseFreqsForDetection [ DetectionBufferSize - DetectionKernelSize + i ] ;
flowAfter [ i ] = flowsForDetection [ i ] ;
freqAfter [ i ] = pulseFreqsForDetection [ i ] ;
}
Array . Sort ( flowBefore ) ;
Array . Sort ( flowAfter ) ;
Array . Sort ( freqBefore ) ;
Array . Sort ( freqAfter ) ;
flowBefore [ 0 ] = 0 ;
flowAfter [ 0 ] = 0 ;
//freqBefore[0] = 0;
//freqAfter[0] = 0;
flowBefore [ DetectionKernelSize - 1 ] = 0 ;
flowAfter [ DetectionKernelSize - 1 ] = 0 ;
//freqBefore[DetectionKernelSize - 1] = 0;
//freqAfter[DetectionKernelSize - 1] = 0;
double aveFlowBefore = 0 ;
double aveFlowAfter = 0 ;
double aveFreqBefore = 0 ;
double aveFreqAfter = 0 ;
foreach ( var f in flowBefore ) aveFlowBefore + = f ;
foreach ( var f in flowAfter ) aveFlowAfter + = f ;
foreach ( var f in freqBefore ) aveFreqBefore + = f ;
foreach ( var f in freqAfter ) aveFreqAfter + = f ;
aveFlowBefore / = ( double ) ( DetectionKernelSize - 2 ) ;
aveFlowAfter / = ( double ) ( DetectionKernelSize - 2 ) ;
aveFreqBefore / = ( double ) ( DetectionKernelSize ) ;
aveFreqAfter / = ( double ) ( DetectionKernelSize ) ;
UiBridge . Bridge . OnLog ( this , string . Format ( "time={0}, flow{1}, aveFlowB={2}, aveFlowA={3}, pulseFreq={4}, aveFreqB={5}, aveFreqA={6}\r\n" ,
time - startTime ,
flowsForDetection [ 0 ] . ToString ( "F2" ) ,
aveFlowBefore . ToString ( "F2" ) ,
aveFlowAfter . ToString ( "F2" ) ,
pulseFreqsForDetection [ 0 ] . ToString ( "F2" ) ,
aveFreqBefore . ToString ( "F2" ) ,
aveFreqAfter . ToString ( "F2" ) ) ) ;
//detectedFlow = (aveFlowBefore + aveFlowAfter) / 2.0f;
detectedFlow = aveFlowBefore ;
if ( rvPulse > 0 )
{
detected = ( aveFreqAfter < aveFreqBefore * ( 1.0f - testParams . DetectionThreshold ) ) ;
targetReached = ( ( aveFlowAfter + aveFlowBefore ) / 2.0f ) > testParams . TargetQ ;
}
else
{
detected = ( aveFreqAfter > aveFreqBefore * ( 1.0f + testParams . DetectionThreshold ) ) ;
targetReached = ( ( aveFlowAfter + aveFlowBefore ) / 2.0f ) < testParams . TargetQ ;
}
}
}
}
while ( ! detected & & ! targetReached ) ;
Qrise = detectedFlow ;
UiBridge . Bridge . OnLog ( this , string . Format ( "detected flow={0}\r\n" , detectedFlow . ToString ( "F2" ) ) ) ;
int flowSetTime1 = StateMachine . Time ;
Bridge . OnProcessData ( this , new ProcessDataEventArgs ( test , repetitionNr , Config . Entities . Progress . FlowSetting ) ) ;
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . FlowSetting ) ) ;
//--------------------------------
//State.Create(string.Format("{0}({1}) : Flow sensitivity detected", test.Method, test.Name))
TestEndTime = DateTime . Now ;
//------------------------------------------------
Bridge . OnActivity ( this , Strings . Test_completed ) ;
//------------------------------------------------
State . Create ( string . Format ( "{0}({1}) : {2}" , test . Method , test . Name , Strings . Stop_the_pump ) )
. AddOperation ( checkUiOp )
. AddOperation ( ( inPath ! = null & & inPath . Pump is GenericDevices . IPumpFM ) ? ( inPath . Pump as GenericDevices . IPumpFM ) . TurnOffOp ( ) : null )
. AddOperation ( cBrd . SetValvesOp ( null , inPath . Pump ) )
. EnterState ( ) ;
do
{
e = StateMachine . WaitRunDevsRunOps ( ) ;
if ( TestAndLogUiCmdStop ( test , e ) ) goto stopTest ;
}
while ( ! e . Contains ( Event . ValvesSet ) ) ;
//--------------------------------
State . Create ( string . Format ( "{0}({1}) : Stopping diverter, gate, etc." , test . Method , test . Name ) )
2018-10-10 12:03:48 +00:00
. AddOperation ( checkUiOp )
. AddOperation ( cBrd . StopPreviousOp ( ) )
. EnterState ( ) ;
2017-10-16 14:55:10 +00:00
do
{
e = StateMachine . WaitRunDevsRunOps ( ) ;
if ( TestAndLogUiCmdStop ( test , e ) ) goto stopTest ;
}
while ( ! e . Contains ( Event . PreviousStopped ) ) ;
/// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results
if ( UIFlowControl . Stop = = WaitBeginFormClosed ( ) ) goto stopTest ;
///
/// Populate TestResult data entity with data
///
Results . Entities . TestRslt tstRslt = BatchRslts . GetTestRslt ( testName , test . Part ) ;
if ( tstRslt ! = null )
{
UpdateTempPressDensAmb ( tstRslt ) ;
/// Main results
2018-02-26 11:18:04 +00:00
tstRslt . MethodClass = TbfComponents . FindComponent ( test . Method ) . ClassName ;
tstRslt . StartTime = TestStartTime ;
2017-10-16 14:55:10 +00:00
tstRslt . EndTime = TestEndTime ;
tstRslt . FlowSetTime = flowSetTime1 - flowSetTime0 ;
tstRslt . TestTime = cBrd . TTime ; /// [s] measurement time
tstRslt . PulsesMaster = 0 ; /// Pulses of the master flow meter (test total)
tstRslt . MassStartRaw = 0 ;
tstRslt . MassStart = 0 ;
tstRslt . MassEndRaw = 0 ;
tstRslt . MassEnd = 0 ;
tstRslt . FlowMass = 0 ;
tstRslt . FlowVolume = 0 ;
2018-04-10 14:10:44 +00:00
tstRslt . Buoyancy = Config . Formulas . Buoyancy ( ) ;
2017-10-16 14:55:10 +00:00
tstRslt . VolumeCTV = 0 ;
tstRslt . VolumeMaster = 0 ;
2018-04-27 09:00:05 +00:00
tstRslt . ConstMasterRaw = 0 ;
tstRslt . ConstMaster = 0 ;
2017-10-16 14:55:10 +00:00
tstRslt . ErrorMaster = 0 ;
tstRslt . FlowMean = ( float ) RefFlowStat . Average ;
tstRslt . FlowStart = ( float ) RefFlowStat . First ;
tstRslt . FlowEnd = ( float ) RefFlowStat . Last ;
tstRslt . FlowMin = ( float ) RefFlowStat . Min ;
tstRslt . FlowMax = ( float ) RefFlowStat . Max ;
tstRslt . DiverterStart = switchTimeStart ;
tstRslt . DiverterEnd = switchTimeEnd ;
tstRslt . ErrorFlagsMd = ( ErrorFlagsComp ! = null ) ? ( sbyte ) ErrorFlagsComp . Mode : ( sbyte ) 0 ;
tstRslt . ErrorFlags = ( ErrorFlagsComp ! = null ) ? ErrorFlagsComp . GetErrorFlags ( tstRslt , true , false , switchTimeStart , switchTimeEnd ) : 0 ;
for ( int i = 0 ; i < BatchRslts . WMPositionsCount ; i + + )
{
Results . Entities . MeterTestRslt meterRslt = BatchRslts . GetMeterTestRslt ( testName , i , Config . Entities . CompoundMeterId . Single ) ;
GenericDevices . IRegisterReader regReader = sensPath . RegisterReaders [ i ] ;
if ( meterRslt ! = null & & regReader ! = null )
{
2018-04-10 14:10:44 +00:00
meterRslt . RegReaderType = ( int ) regReader . RegisterReaderType ;
2018-02-26 11:18:04 +00:00
meterRslt . PulsesPerLiter = regReader . PulsesPerLtr ;
2017-10-16 14:55:10 +00:00
meterRslt . Passed = ( Qrise < = test . Qto ) & & ( tstRslt . ErrorFlags = = 0 | | tstRslt . ErrorFlagsMode ( ) ! = Config . Entities . ErrorFlagsMode . On ) ;
meterRslt . TestDone = true ;
tstRslt . TestDone = true ;
if ( Qrise ! = 0 )
{
BatchRslts . WaterMeters [ i ] . QRise = Qrise ;
}
BatchRslts . WaterMeters [ i ] . QFall = 0 ;
}
}
tstRslt . Components = Results . Entities . Components
. UpdateList ( BatchRslts . ComponentsList ,
new Results . Entities . Components ( ( BenchInfo ! = null ) ? BenchInfo . TestBenchId : 1 ,
( BenchInfo ! = null ) ? BenchInfo . TestBenchName : "testbench" ,
inPath . Pump ! = null ? inPath . Pump . Name : string . Empty ,
outPath . FlowMeter ! = null ? outPath . FlowMeter . Name : string . Empty ,
outPath . Scale ! = null ? outPath . Scale . Name : string . Empty ,
outPath . RegulValve ! = null ? outPath . RegulValve . Name : string . Empty ,
outPath . Diverter ! = null ? outPath . Diverter . Name : string . Empty ) ) ;
/// Update water meter error flags
if ( ErrorFlagsComp ! = null )
{
for ( int i = 0 ; i < BatchRslts . WMPositionsCount ; i + + )
{
if ( BatchRslts . WaterMeters [ i ] ! = null )
{
BatchRslts . WaterMeters [ i ] . ErrorFlags = ErrorFlagsComp . GetWMtrErrorFlags ( BatchRslts . WaterMeters [ i ] . MeterTestRslts ) ;
}
}
}
/// Update results
Bridge . OnTestCompleted ( this , new TestCompletedEventArgs ( testName , tstRslt ) ) ;
}
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . TransitionAfter ) ) ;
/// Append the results to the CSV-file
allResults . Info ( TestResult2CsvLine ( testName , test . Part ) ) ;
///----------------------///
/// Quit this sequence ///
///----------------------///
2018-10-10 12:03:48 +00:00
if ( isLastRepetition )
{
/// Stop the pump
State . Create ( string . Format ( "{0}({1}) : Test(s) completed -> Stopping the pump" , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
. AddOperation ( cBrd . SetValvesOp ( null , inPath . Pump ) )
. AddOperation ( ( inPath ! = null & & inPath . Pump is GenericDevices . IPumpFM ) ? ( inPath . Pump as GenericDevices . IPumpFM ) . TurnOffOp ( ) : null )
. EnterState ( ) ;
do
{
e = StateMachine . WaitRunDevsRunOps ( ) ;
if ( e . Contains ( Event . Error ) ) goto error ;
}
while ( ! e . Contains ( Event . ValvesSet ) | | ( ( inPath . Pump is GenericDevices . IPumpFM ) & & ! e . Contains ( Event . TurnPumpOnOffDone ) ) ) ;
2017-10-16 14:55:10 +00:00
}
/// Create the return value - a list with one event Event.Done - and return
IList < Event > retval1 = new List < Event > ( 1 ) ;
retval1 . Add ( Event . Done ) ;
return retval1 ;
//====================================
stopTest :
State . Create ( string . Format ( "{0}({1}) : User selected STOP -> Closing the valves" , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
. AddOperation ( ( inPath ! = null & & inPath . Pump is GenericDevices . IPumpFM ) ? ( inPath . Pump as GenericDevices . IPumpFM ) . TurnOffOp ( ) : null )
. AddOperation ( cBrd . SetValvesOp ( StateMachine . DefaultValvesOpen , StateMachine . DefaultValvesClose ) )
. EnterState ( ) ;
do
{
e = StateMachine . WaitRunDevsRunOps ( ) ;
if ( e . Contains ( Event . Error ) ) goto error ;
}
while ( ! e . Contains ( Event . ValvesSet ) ) ;
IList < Event > retval2 = new List < Event > ( 1 ) ;
retval2 . Add ( Event . UiCmdStop ) ;
return retval2 ;
//====================================
error :
State . Create ( string . Format ( "{0}({1}) : close_before_error" , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
. AddOperation ( ( inPath ! = null & & inPath . Pump is GenericDevices . IPumpFM ) ? ( inPath . Pump as GenericDevices . IPumpFM ) . TurnOffOp ( ) : null )
. AddOperation ( cBrd . SetValvesOp ( StateMachine . DefaultValvesOpen , StateMachine . DefaultValvesClose ) )
. EnterState ( ) ;
do
{
e = StateMachine . WaitRunDevsRunOps ( ) ;
2017-12-02 16:54:38 +00:00
if ( e . Contains ( Event . Error ) ) break ;
2017-10-16 14:55:10 +00:00
}
while ( ! e . Contains ( Event . ValvesSet ) ) ;
IList < Event > retval3 = new List < Event > ( 1 ) ;
retval3 . Add ( Event . Error ) ;
return retval3 ;
}
}
}