/*
#  C.E.A. IRFU/SIS/LDISC
#
*/

program checkMTRBrake

%%#include <stdio.h>
%%#include <string.h>
%%#include <stdlib.h>

/**** MTR PV *******/
short ErrorBrakeMtrGet;
assign ErrorBrakeMtrGet to "{PREFIX}:PBI-EM:CURRENT_ERR_GET";
monitor ErrorBrakeMtrGet;
evflag ErrorBrakeMtrEvent;
sync ErrorBrakeMtrGet ErrorBrakeMtrEvent;

short statusMTRMov;
assign statusMTRMov to "{PMACPREFIX}:{MOTOR_NAME}.MOVN";
monitor statusMTRMov;

short ErrorBrakeMtrSet;
assign ErrorBrakeMtrSet to "{PREFIX}:PBI-EM:CURRENT_ERR_SET";
monitor ErrorBrakeMtrSet;

short brakeMtrCMD;
assign brakeMtrCMD to "{PREFIX}:PBI-EM:VER-BRAKE_SET";
monitor brakeMtrCMD;

short brakeMtrGET;
assign brakeMtrGET to "{PREFIX}:PBI-EM:VER-BRAKE_GET";
monitor brakeMtrGET;
evflag brakeMtrGETEvent;
sync brakeMtrGET brakeMtrGETEvent;

short AbortscanMtrCMD;
assign AbortscanMtrCMD to "{DEVICE}:MTR-ABORT.PROC";
monitor AbortscanMtrCMD;

short countErrors=0;

ss ss1
{
	state init {
	    	      when (delay(1.0) && (pvConnectCount() == pvChannelCount())) 
					{
					printf("\nWAIT\n");
					ErrorBrakeMtrSet=0;
			        pvPut(ErrorBrakeMtrSet);
					} state waiting
		   }
	
	state waiting
		   {    
		    when(efTestAndClear(ErrorBrakeMtrEvent)&&(ErrorBrakeMtrGet==1)&&(delay(0.1)))
			    {
			    printf("\nERRROR CURRENT : BRAKE OFF \n");
			    brakeMtrCMD=1;
			    pvPut(brakeMtrCMD);	
			    delay(1);
			    ErrorBrakeMtrSet=0;
			    pvPut(ErrorBrakeMtrSet);	   
			    }state count	    
		    }
		    
	state count	
	       {
	       when(countErrors>3)
			    {
			    printf("\nERRROR CURRENT : STOP MEASURE \n");
			    }state stopMeasure
			    
			when((delay(1.0)) && (statusMTRMov==1))
			    {
			    printf("\nERRROR CURRENT : PROBLEM SOLVED \n");
			    countErrors=0;
			    }state waiting
			    
			when((delay(1.0)) && (statusMTRMov==0))
			    {
			    countErrors=countErrors+1;
			    }state waiting
			}


	state stopMeasure
		 {	
			when(delay(1.0)){
			printf("\n ABORT\n");
			AbortscanMtrCMD=1;
			pvPut(AbortscanMtrCMD);
			countErrors=0;
			}state waiting
		 }

}