Skip to content

Commit

Permalink
Merge pull request #448 from jluhrs/feature/SEQNG-495
Browse files Browse the repository at this point in the history
GNIRS controller simulator
  • Loading branch information
jluhrs authored Feb 1, 2018
2 parents 503cbba + 57cf78d commit 0f5d54d
Show file tree
Hide file tree
Showing 4 changed files with 166 additions and 87 deletions.
Original file line number Diff line number Diff line change
@@ -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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -71,6 +74,6 @@ object GnirsController {
wollanstonPrism: WollanstonPrism
)

final case class GnirsConfig(ccConfig: CCConfig, dcConfig: DCConfig)
final case class GnirsConfig(cc: CCConfig, dc: DCConfig)

}
Original file line number Diff line number Diff line change
@@ -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

}

0 comments on commit 0f5d54d

Please sign in to comment.