
NTT Main Panel Update Loop

METHOD update IS
VAR	hpsIsOn, hydIsLo, hydIsHi, hydIsOn, hydWasOn, supChargeOn, running
BEGIN
	IF NOT vm THEN
		RETURN
	END IF

	! show 469D & HPS E-Stop Status next to Reset Button
	resetInd.showValue[NOT vm.hpsEstopDI.value AND NOT vm.estopDI.value]

	! show hydraulic status
	hpsIsOn := vm.hpsOnDI.value
	hydIsLo := vm.hydraulicsLo
	hydIsHi := vm.hydraulicsHi
	hydHiInd.showValue[hydIsHi]

	! check ball valve status change

	IF sysStatus THEN				! If 469D was in control of hps
		IF NOT vm.hpsValveOnDI.value THEN	! & NOW IS NOT
			IF hpsIsOn THEN
				vm.estopDO.set		! Pumps ON, Fire E-Stop Chain
			END IF
			sysStatus := NIL		! Say 469D NOT in control of hps
			hydHi.setActive[NIL]		! De-activate ALL buttons
			hydLo.setActive[NIL]
			hpsOn.setActive[NIL]
			supOn.setActive[NIL]
			hpsSel.setActive[NIL]
			frameUp.setActive[NIL]
			frameDn.setActive[NIL]
		END IF
	ELSE
		IF vm.hpsValveOnDI.value THEN		! 469D not in control but now IS
			sysStatus := TRUE		! Say 469D in control of hps
			hpsOn.setActive[TRUE]		! Activate basic hps buttons
			supOn.setActive[TRUE]
			hpsSel.setActive[TRUE]
			frameUp.setActive[TRUE]
			frameDn.setActive[TRUE]
		END IF
	END IF

   IF NOT sysStatus THEN		! Ball Valves BAD
	hydLoInd.showValue[hydIsLo]
	hpsOnInd.showValue[hpsIsOn]
   ELSE					! Ball Valves OK

	! blink pumps on while real pumps come up to pressure
	IF hpsIsOn AND NOT self.checkPumpsOn THEN
		IF hpsOnInd.value THEN
			hpsOnInd.showValue[NIL]
		ELSE
			hpsOnInd.showValue[TRUE]
		END IF
	ELSE
		hpsOnInd.showValue[hpsIsOn]
	END IF

	! blink low pressure while real low pressure is achieved
	IF hydIsLo AND NOT vm.atLowPressDI.value THEN
		IF hydLoInd.value THEN
			hydLoInd.showValue[NIL]
		ELSE
			hydLoInd.showValue[TRUE]
		END IF
	ELSE
		hydLoInd.showValue[hydIsLo]
	END IF

	! hydraulics turn-on/turn-off delay waiting
	IF hpsOn.value AND NOT hpsIsOn AND NOT hpsWasOn THEN
		IF NOT waiting THEN
			waitCanNotifier	.connect[self, #pumpOff]
					.setMessage['Turning on pumps...']
					.draw
			waiting		:= TRUE
		END IF
		waitCanNotifier	.spin
	ELSEIF hydLo.value AND NOT hydIsLo AND NOT hydWasLo AND NOT hydWasHi THEN
		IF NOT waiting THEN
			waitCanNotifier	.connect[self, #hydraulicsOff]
					.setMessage['Turning on low pressure...']
					.draw
			waiting		:= TRUE
		END IF
		waitCanNotifier	.spin
	ELSEIF hydHi.value AND NOT hydIsHi AND NOT hydWasHi THEN
		IF NOT waiting THEN
			waitCanNotifier	.connect[self, #cancelHydHi]
					.setMessage['Going to high pressure...']
					.draw
			waiting		:= TRUE
		END IF
		waitCanNotifier	.spin
	ELSEIF hydIsHi AND NOT hydHi.value THEN
		IF NOT waiting THEN
			waitNotifier	.setMessage['Going to low pressure...']
					.draw
			waiting		:= TRUE
		END IF
		waitCanNotifier	.spin
	ELSEIF hydIsLo AND NOT hydLo.value THEN
		IF NOT waiting THEN
			waitNotifier	.setMessage['Turning off low pressure...']
					.draw
			waiting		:= TRUE
! turn pumps OFF automatically after go back to low pressure from high pressure
! ball valve control problem
			turnOffHps	:= TRUE
		END IF
		waitCanNotifier	.spin
	ELSEIF hpsIsOn AND NOT hpsOn.value THEN
		IF NOT waiting THEN
			waitNotifier	.setMessage['Turning off pumps...']
					.draw
			waiting		:= TRUE
		END IF
		waitCanNotifier	.spin
	ELSEIF waiting THEN
		waitNotifier	.erase
		waitCanNotifier	.erase
		waiting		:= NIL
! If just turned off low pressure, then turn off pumps next - ball valve control problem
		IF turnOffHps THEN
			turnOffHps := NIL
			self.pumpOff
		END IF
	END IF

	! react to external event turning off hydraulics
	hydWasOn := hydWasLo OR hydWasHi
	hydIsOn  := vm.hydraulicsOn
	IF hydWasOn AND NOT hydIsOn THEN

		! low oil level
		IF vm.hpsLowLevelDI.value THEN
			system
			.message['Hydraulic shutdown due to low oil level.']
		END IF

		! oil overtemp
		IF vm.hpsLowLevelDI.value THEN
			system
			.message['Hydraulic shutdown due to high oil temperature.']
		END IF

		! ball valve shutoff
		IF vm.hpsLowLevelDI.value THEN
			system
			.message['Hydraulic shutdown due to ball valve shutoff.']
		END IF

		! HPS estop chain: Pump E-STOP Conditions
		IF vm.hpsEstopDI.value THEN
			system
			.message['Hydraulic shutdown due to hps e-stop.']
		END IF

		! estop chain:  estop buttons & watchdog timer
		IF vm.estopDI.value THEN
			system
			.message['Hydraulic shutdown due to e-stop button or watchdog timer.']
		END IF

		! station interlock chain:  497.01 conditioner limit detectors
		IF vm.gres.interlock[hsmStation] THEN
			system
			.message['Hydraulic shutdown due to conditioner limit detector.']
		END IF
		
		! turn off hydraulics for internal consistency
		IF hydIsOn THEN		
			self.hydraulicsOff
		END IF

		IF hpsIsOn THEN
			self.pumpOff
		END IF
	END IF

	! verify appearance of hydraulic controls
	IF hpsSel.active <> NOT hpsIsOn THEN
		hpsSel.setActive[NOT hpsIsOn]
	END IF
	supChargeOn := vm.supchargeDO.value
	IF supOn.value <> supChargeOn THEN
		supOn.initValue[supChargeOn].drawValue
	END IF
	IF supOn.active <> NOT hpsIsOn THEN
		supOn.setActive[NOT hpsIsOn]
	END IF

! can ONLY hit lo/hi pressure buttons in low pressure- low pressure now shuts OFF pumps
! and don't want to shut off pumps w/o checking parking frame UP.
	IF hydIsLo OR hydIsHi THEN
		hpsOn.setActive[NIL]
	ELSE
		hpsOn.setActive[TRUE]
	END IF
! can ONLY go back to low pressure from high pressure by hitting hi pressure button again
! and want low pressure button inactive when pumps off
	IF (NOT hpsIsOn) OR hydIsHi THEN
		hydLo.setActive[NIL]
	ELSE
		hydLo.setActive[TRUE]
	END IF

	IF hydHi.active <> vm.hydOnDI.value THEN
		hydHi.setActive[vm.hydOnDI.value]
	END IF

   END IF	! Ball Valves Status IF

	hpsWasOn := hpsIsOn
	hydWasLo := hydIsLo
	hydWasHi := hydIsHi

	! display current master span
	spanDisp.update

	! verify run/stop button appearance
	running := self.run
	IF run.value <> running THEN
		IF waitCount = 2 THEN
			IF running = 2 THEN	! preview
				self.accHold
				run.get[2].setActive[TRUE]
				run.get[3].setActive[NIL]
			ELSEIF running = 3 THEN	! run
				run.get[2].setActive[NIL]
				run.get[3].setActive[TRUE]
			END IF
			run	.showValue[running]
			IF running > 1 THEN
				self	.activateCtls
				playP	.attach
			ELSE
				stopEvent.start
			END IF
			waitCount := 1
		ELSE
			waitCount := waitCount + 1
		END IF
	ELSE
		waitCount := 1
	END IF
	IF NOT run.get[3].active
	OR (vm.dimension <> displDim AND NOT run.get[2].active) THEN
		IF vm.stopped THEN
			run.get[2].setActive[vm.dimension <> displDim]
			run.get[3].setActive[TRUE]
		END IF
	END IF

	! check for abort of STEX mode file playout
	IF running AND (vm.program=4) AND vm.stexAbortDI.value THEN
		self.setRun[1]
	END IF
	! update parking frame buttons and indicators
	frmUpInd.showValue[vm.frameUpDI.value]
	frmDnInd.showValue[vm.frameDnDI.value]

   IF sysStatus THEN	! Ball Valves OK

	IF frameUp.value AND frameDn.value AND vm.frameDnDO.value THEN
		frameDn.setValue[NIL]
		vm.frameDnDO.clear
	END IF
	IF frameDn.value AND frameUp.value AND vm.frameUpDO.value THEN
		frameUp.setValue[NIL]
		vm.frameUpDO.clear
	END IF
	IF frameUp.value THEN
		IF frmUpInd.value THEN
			IF vm.frameUpDO.value THEN
				vm.frameUpDO.clear
			ELSE
				notifier
				.setMessage['Parking frame is already up.']
				.draw
			END IF
			frameUp.setValue[NIL]
		ELSE
			IF self.frameOkay THEN
				IF (NOT vm.atZero) AND (NOT vm.frameUpDO.value) THEN
					frameUp.setValue[NIL]
					confirm	.setMessage[
					'Vertical setpoint is NOT zero.',
					'Raise parking frame anyway?']
					.setButtonName['Yes', 'Cancel']
					.connect[self, #setFrameUp, #cancelFrameUp]
					.draw
				ELSE
					vm.frameUpDO.set
				END IF
			ELSE
				frameUp.setValue[NIL]
			END IF
		END IF
	ELSE
		frameUp.setValue[NIL]
		vm.frameUpDO.clear
	END IF

	IF frameDn.value THEN
		IF frmDnInd.value THEN
			IF vm.frameDnDO.value THEN
				vm.frameDnDO.clear
			ELSE
				notifier
				.setMessage['Parking frame is already down.']
				.draw
			END IF
			frameDn.setValue[NIL]
		ELSE
			IF self.frameOkay THEN
				vm.frameDnDO.set
			ELSE
				frameDn.setValue[NIL]
			END IF
		END IF
	ELSE
		frameDn.setValue[NIL]
		vm.frameDnDO.clear
	END IF
   END IF		! Ball Valves Status IF

	! update system pressure/temperature displays
	press.update
	temp.update

	! update run/stop digital output
	vm.runStopDO.setValue[NOT vm.stopped]
END METHOD
