diff --git a/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/InstrumentControllerSim.scala b/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/InstrumentControllerSim.scala new file mode 100644 index 0000000000..23229bc09c --- /dev/null +++ b/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/InstrumentControllerSim.scala @@ -0,0 +1,104 @@ +// Copyright (c) 2016-2017 Association of Universities for Research in Astronomy, Inc. (AURA) +// For license information see LICENSE or https://opensource.org/licenses/BSD-3-Clause + +package edu.gemini.seqexec.server + +import java.util.concurrent.atomic.AtomicBoolean + +import edu.gemini.seqexec.model.dhs.ImageFileId +import edu.gemini.seqexec.server.SeqexecFailure.SeqexecException +import gov.aps.jca.TimeoutException +import org.log4s.getLogger +import squants.Time + +import scala.annotation.tailrec +import scalaz.{EitherT, Show} +import scalaz.concurrent.Task +import scalaz.syntax.show._ +import scalaz.syntax.std.boolean._ + +class InstrumentControllerSim(name: String) { + private val Log = getLogger + + private val stopFlag = new AtomicBoolean(false) + private val abortFlag = new AtomicBoolean(false) + private val pauseFlag = new AtomicBoolean(false) + + private val tic = 200 + + @tailrec + private def observeTic(stop: Boolean, abort: Boolean, pause: Boolean, remain: Int, timeout: Option[Int]): TrySeq[ObserveCommand.Result] = + if(remain < tic) { + Log.info(s"Simulate $name observation completed") + TrySeq(ObserveCommand.Success) + } else if(stop) TrySeq(ObserveCommand.Stopped) + else if(abort) TrySeq(ObserveCommand.Aborted) + else if(pause) TrySeq(ObserveCommand.Paused) + else if(timeout.exists(_<= 0)) TrySeq.fail(SeqexecException(new TimeoutException())) + else { + Thread.sleep(tic.toLong) + observeTic(stopFlag.get, abortFlag.get, pauseFlag.get, remain - tic, timeout.map(_ - tic)) + } + + def observe(obsid: ImageFileId, expTime: Time): SeqAction[ObserveCommand.Result] = EitherT( Task { + Log.info(s"Simulate taking $name observation with label $obsid") + pauseFlag.set(false) + stopFlag.set(false) + abortFlag.set(false) + observeTic(false, false, false, expTime.millis.toInt, + (expTime.value > 0.0).option(expTime.toMilliseconds.toInt + 2 * tic)) + } ) + + def applyConfig[C: Show](config: C): SeqAction[Unit] = EitherT( Task { + Log.info(s"Simulate applying $name configuration ${config.shows}") + Thread.sleep(1000) + TrySeq(()) + } ) + + def stopObserve: SeqAction[Unit] = EitherT( Task { + Log.info(s"Simulate stopping $name exposure") + stopFlag.set(true) + TrySeq(()) + } ) + + def abortObserve: SeqAction[Unit] = EitherT( Task { + Log.info(s"Simulate aborting $name exposure") + abortFlag.set(true) + TrySeq(()) + } ) + + def endObserve: SeqAction[Unit] = EitherT( Task { + Log.info(s"Simulate sending endObserve to $name") + TrySeq(()) + } ) + + def pauseObserve: SeqAction[Unit] = EitherT( Task { + Log.info(s"Simulate pausing $name exposure") + pauseFlag.set(true) + TrySeq(()) + } ) + + def resumePaused(expTime: Time): SeqAction[ObserveCommand.Result] = EitherT( Task { + Log.info(s"Simulate resuming $name observation") + pauseFlag.set(false) + observeTic(false, false, false, expTime.millis.toInt / 2, + (expTime.value > 0.0).option(expTime.toMilliseconds.toInt / 2 + 2 * tic)) + } ) + + def stopPaused: SeqAction[ObserveCommand.Result] = EitherT( Task { + Log.info(s"Simulate stopping $name paused observation") + pauseFlag.set(false) + observeTic(true, false, false, 1000, None) + } ) + + def abortPaused: SeqAction[ObserveCommand.Result] = EitherT( Task { + Log.info(s"Simulate aborting $name paused observation") + pauseFlag.set(false) + observeTic(false, true, false, 1000, None) + } ) + +} + +object InstrumentControllerSim { + def apply(name: String): InstrumentControllerSim = new InstrumentControllerSim(name) +} diff --git a/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/gmos/GmosControllerSim.scala b/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/gmos/GmosControllerSim.scala index 4a1a0f20b6..08dd680bc9 100644 --- a/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/gmos/GmosControllerSim.scala +++ b/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/gmos/GmosControllerSim.scala @@ -3,103 +3,40 @@ package edu.gemini.seqexec.server.gmos -import java.util.concurrent.atomic.AtomicBoolean - import edu.gemini.seqexec.model.dhs.ImageFileId -import edu.gemini.seqexec.server.SeqexecFailure.SeqexecException import edu.gemini.seqexec.server.gmos.GmosController.{GmosConfig, NorthTypes, SiteDependentTypes, SouthTypes} -import edu.gemini.seqexec.server.{ObserveCommand, SeqAction, TrySeq} -import gov.aps.jca.TimeoutException -import org.log4s._ +import edu.gemini.seqexec.server.{InstrumentControllerSim, ObserveCommand, SeqAction} import squants.Time -import scala.annotation.tailrec -import scalaz.{EitherT, Show} -import scalaz.concurrent.Task -import scalaz.syntax.show._ -import scalaz.syntax.std.boolean._ +import scalaz.Show private class GmosControllerSim[T<:SiteDependentTypes](name: String) extends GmosController[T] { - private val Log = getLogger implicit val configShow: Show[GmosConfig[T]] = Show.shows { config => s"(${config.cc.filter}, ${config.cc.disperser}, ${config.cc.fpu}, ${config.cc.stage}, ${config.cc.stage}, ${config.cc.dtaX}, ${config.cc.adc}, ${config.cc.useElectronicOffset}, ${config.dc.t}, ${config.dc.b}, ${config.dc.s}, ${config.dc.bi}, ${config.dc.roi.rois})" } override def getConfig: SeqAction[GmosConfig[T]] = ??? // scalastyle:ignore - private val stopFlag = new AtomicBoolean(false) - private val abortFlag = new AtomicBoolean(false) - private val pauseFlag = new AtomicBoolean(false) - - private val tic = 200 - - @tailrec - private def observeTic(stop: Boolean, abort: Boolean, pause: Boolean, remain: Int, timeout: Option[Int]): TrySeq[ObserveCommand.Result] = - if(remain < tic) { - Log.info(s"Simulate Gmos $name observation completed") - TrySeq(ObserveCommand.Success) - } else if(stop) TrySeq(ObserveCommand.Stopped) - else if(abort) TrySeq(ObserveCommand.Aborted) - else if(pause) TrySeq(ObserveCommand.Paused) - else if(timeout.exists(_<= 0)) TrySeq.fail(SeqexecException(new TimeoutException())) - else { - Thread.sleep(tic.toLong) - observeTic(stopFlag.get, abortFlag.get, pauseFlag.get, remain-tic, timeout.map(_ - tic)) - } - - override def observe(obsid: ImageFileId, expTime: Time): SeqAction[ObserveCommand.Result] = EitherT( Task { - Log.info(s"Simulate taking Gmos $name observation with label $obsid") - pauseFlag.set(false) - stopFlag.set(false) - abortFlag.set(false) - observeTic(false, false, false, 7000, (expTime.value > 0.0).option(expTime.toMilliseconds.toInt)) - } ) - - override def applyConfig(config: GmosConfig[T]): SeqAction[Unit] = EitherT( Task { - Log.info(s"Simulate applying Gmos $name configuration ${config.shows}") - Thread.sleep(1000) - TrySeq(()) - } ) - - override def stopObserve: SeqAction[Unit] = EitherT( Task { - Log.info(s"Simulate stopping Gmos $name exposure") - stopFlag.set(true) - TrySeq(()) - } ) - - override def abortObserve: SeqAction[Unit] = EitherT( Task { - Log.info(s"Simulate aborting Gmos $name exposure") - abortFlag.set(true) - TrySeq(()) - } ) - - override def endObserve: SeqAction[Unit] = EitherT( Task { - Log.info("Simulate sending endObserve to Gmos") - TrySeq(()) - } ) - - override def pauseObserve: SeqAction[Unit] = EitherT( Task { - Log.info(s"Simulate pausing Gmos $name exposure") - pauseFlag.set(true) - TrySeq(()) - } ) - - override def resumePaused(expTime: Time): SeqAction[ObserveCommand.Result] = EitherT( Task { - Log.info(s"Simulate resuming Gmos $name observation") - pauseFlag.set(false) - observeTic(false, false, false, 5000, (expTime.value > 0.0).option(expTime.toMilliseconds.toInt)) - } ) - - override def stopPaused: SeqAction[ObserveCommand.Result] = EitherT( Task { - Log.info(s"Simulate stopping Gmos $name paused observation") - pauseFlag.set(false) - observeTic(true, false, false, 1000, None) - } ) - - override def abortPaused: SeqAction[ObserveCommand.Result] = EitherT( Task { - Log.info(s"Simulate aborting Gmos $name paused observation") - pauseFlag.set(false) - observeTic(false, true, false, 1000, None) - } ) + private val sim: InstrumentControllerSim = InstrumentControllerSim(s"GMOS $name") + + override def observe(obsid: ImageFileId, expTime: Time): SeqAction[ObserveCommand.Result] = + sim.observe(obsid, expTime) + + override def applyConfig(config: GmosConfig[T]): SeqAction[Unit] = sim.applyConfig(config) + + override def stopObserve: SeqAction[Unit] = sim.stopObserve + + override def abortObserve: SeqAction[Unit] = sim.abortObserve + + override def endObserve: SeqAction[Unit] = sim.endObserve + + override def pauseObserve: SeqAction[Unit] = sim.pauseObserve + + override def resumePaused(expTime: Time): SeqAction[ObserveCommand.Result] = sim.resumePaused(expTime) + + override def stopPaused: SeqAction[ObserveCommand.Result] = sim.stopPaused + + override def abortPaused: SeqAction[ObserveCommand.Result] = sim.abortPaused + } object GmosControllerSim { diff --git a/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/gnirs/GnirsController.scala b/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/gnirs/GnirsController.scala index 53926466af..207ae29609 100644 --- a/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/gnirs/GnirsController.scala +++ b/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/gnirs/GnirsController.scala @@ -4,11 +4,14 @@ package edu.gemini.seqexec.server.gnirs import edu.gemini.seqexec.model.dhs.ImageFileId +import edu.gemini.seqexec.server.gnirs.GnirsController.GnirsConfig import edu.gemini.seqexec.server.{ObserveCommand, SeqAction} import squants.Time trait GnirsController { + def applyConfig(config: GnirsConfig): SeqAction[Unit] + def observe(obsid: ImageFileId, expTime: Time): SeqAction[ObserveCommand.Result] // endObserve is to notify the completion of the observation, not to cause its end. @@ -71,6 +74,6 @@ object GnirsController { wollanstonPrism: WollanstonPrism ) - final case class GnirsConfig(ccConfig: CCConfig, dcConfig: DCConfig) + final case class GnirsConfig(cc: CCConfig, dc: DCConfig) } \ No newline at end of file diff --git a/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/gnirs/GnirsControllerSim.scala b/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/gnirs/GnirsControllerSim.scala new file mode 100644 index 0000000000..fd40dfe6f1 --- /dev/null +++ b/modules/edu.gemini.seqexec.server/src/main/scala/edu/gemini/seqexec/server/gnirs/GnirsControllerSim.scala @@ -0,0 +1,35 @@ +// Copyright (c) 2016-2017 Association of Universities for Research in Astronomy, Inc. (AURA) +// For license information see LICENSE or https://opensource.org/licenses/BSD-3-Clause + +package edu.gemini.seqexec.server.gnirs + +import edu.gemini.seqexec.model.dhs.ImageFileId +import edu.gemini.seqexec.server.gnirs.GnirsController.GnirsConfig +import edu.gemini.seqexec.server.{InstrumentControllerSim, ObserveCommand, SeqAction} +import squants.Time + +import scalaz.Show + +object GnirsControllerSim extends GnirsController { + + implicit val configShow: Show[GnirsConfig] = Show.shows { config => + s"(${config.cc.mode}, ${config.cc.camera}, ${config.cc.centralWavelength}, ${config.cc.decker}, " + + s"${config.cc.disperser},${config.cc.filter}, ${config.cc.pixelScale}, ${config.cc.slitWidth}, " + + s"${config.cc.wollanstonPrism}, ${config.dc.exposureTime}, ${config.dc.coadds}, ${config.dc.readMode}, " + + s"${config.dc.wellDepth})" + } + + private val sim: InstrumentControllerSim = InstrumentControllerSim(s"GNIRS") + + override def observe(obsid: ImageFileId, expTime: Time): SeqAction[ObserveCommand.Result] = + sim.observe(obsid, expTime) + + override def applyConfig(config: GnirsConfig): SeqAction[Unit] = sim.applyConfig(config) + + override def stopObserve: SeqAction[Unit] = sim.stopObserve + + override def abortObserve: SeqAction[Unit] = sim.abortObserve + + override def endObserve: SeqAction[Unit] = sim.endObserve + +}