Cleanup OTF scan
This commit is contained in:
@@ -52,16 +52,15 @@ import ch.psi.fda.core.actors.ChannelAccessLinearActuator;
|
||||
import ch.psi.fda.core.actors.ChannelAccessTableActuator;
|
||||
import ch.psi.fda.core.actors.ComplexActuator;
|
||||
import ch.psi.fda.core.actors.JythonFunction;
|
||||
import ch.psi.fda.core.actors.OTFActuator;
|
||||
import ch.psi.fda.core.actors.PseudoActuatorSensor;
|
||||
import ch.psi.fda.core.guard.ChannelAccessGuard;
|
||||
import ch.psi.fda.core.guard.ChannelAccessGuardCondition;
|
||||
import ch.psi.fda.core.loops.ActorSensorLoop;
|
||||
import ch.psi.fda.core.loops.TemplateOTF;
|
||||
import ch.psi.fda.core.loops.OTFLoop;
|
||||
import ch.psi.fda.core.loops.cr.CrlogicLoop;
|
||||
import ch.psi.fda.core.loops.cr.ParallelCrlogic;
|
||||
import ch.psi.fda.core.loops.cr.ScrlogicLoop;
|
||||
import ch.psi.fda.core.loops.otf.OTFLoop;
|
||||
import ch.psi.fda.core.loops.otf.TemplateOTF;
|
||||
import ch.psi.fda.core.manipulator.JythonManipulation;
|
||||
import ch.psi.fda.core.messages.DataMessageMetadata;
|
||||
import ch.psi.fda.core.scripting.JythonGlobalVariable;
|
||||
@@ -73,7 +72,6 @@ import ch.psi.fda.core.scripting.JythonParameterMappingID;
|
||||
import ch.psi.fda.core.sensors.ChannelAccessSensor;
|
||||
import ch.psi.fda.core.sensors.MillisecondTimestampSensor;
|
||||
import ch.psi.fda.core.sensors.OTFNamedChannelSensor;
|
||||
import ch.psi.fda.core.sensors.OTFReadbackSensor;
|
||||
import ch.psi.fda.core.sensors.OTFScalerChannelSensor;
|
||||
import ch.psi.fda.model.ModelManager;
|
||||
import ch.psi.fda.model.v1.Action;
|
||||
@@ -1031,10 +1029,7 @@ public class Acquisition {
|
||||
if(p.getAdditionalBacklash()!=null){
|
||||
backlash = p.getAdditionalBacklash();
|
||||
}
|
||||
OTFActuator actor = new OTFActuator(p.getId(), p.getName(), p.getReadback(), p.getStart(), p.getEnd(), p.getStepSize(), p.getIntegrationTime(), backlash);
|
||||
actionLoop.setActor(actor);
|
||||
|
||||
actionLoop.getSensors().add(new OTFReadbackSensor(p.getId()));
|
||||
actionLoop.setActuator(p.getId(), p.getName(), p.getReadback(), p.getStart(), p.getEnd(), p.getStepSize(), p.getIntegrationTime(), backlash);
|
||||
|
||||
// Map sensors
|
||||
// ATTENTION: the sequence of the mapping depends on the sequence in the schema file !
|
||||
@@ -1091,8 +1086,7 @@ public class Acquisition {
|
||||
if(p.getAdditionalBacklash()!=null){
|
||||
backlash = p.getAdditionalBacklash();
|
||||
}
|
||||
OTFActuator actor = new OTFActuator(p.getId(), p.getName(), p.getReadback(), p.getStart(), p.getEnd(), p.getStepSize(), p.getIntegrationTime(), backlash);
|
||||
actionLoop.setActor(actor);
|
||||
actionLoop.setActuator(p.getId(), p.getName(), p.getReadback(), p.getStart(), p.getEnd(), p.getStepSize(), p.getIntegrationTime(), backlash);
|
||||
|
||||
// Map sensors
|
||||
// ATTENTION: the sequence of the mapping depends on the sequence in the schema file !
|
||||
|
||||
@@ -1,99 +0,0 @@
|
||||
/**
|
||||
*
|
||||
* Copyright 2010 Paul Scherrer Institute. All rights reserved.
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful,
|
||||
* but without any warranty; without even the implied warranty of
|
||||
* merchantability or fitness for a particular purpose. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this code. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package ch.psi.fda.core.actors;
|
||||
|
||||
import ch.psi.fda.core.Actor;
|
||||
|
||||
/**
|
||||
* Special actuator for the OTFLoop. This type of actor must not be used in any other
|
||||
* type of loop than OTFLoop. If it is used it will, depending on the loop, immediately stop the loop
|
||||
* as it no single step.
|
||||
*/
|
||||
public class OTFActuator implements Actor {
|
||||
|
||||
private final String id;
|
||||
private final String name; // name of the motor channel
|
||||
private final String readback; // name of the encoder channel
|
||||
private double start;
|
||||
private double end;
|
||||
private final double stepSize;
|
||||
private final double integrationTime;
|
||||
private final double additionalBacklash;
|
||||
|
||||
|
||||
public OTFActuator(String id, String name, String readback, double start, double end, double stepSize, double integrationTime, double additionalBacklash){
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.readback = readback;
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
this.stepSize = stepSize;
|
||||
this.integrationTime = integrationTime;
|
||||
this.additionalBacklash = additionalBacklash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public void init() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reverse() {
|
||||
double aend = end;
|
||||
end=start;
|
||||
start=aend;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
public String getReadback() {
|
||||
return readback;
|
||||
}
|
||||
public double getStart() {
|
||||
return start;
|
||||
}
|
||||
public double getEnd() {
|
||||
return end;
|
||||
}
|
||||
public double getStepSize() {
|
||||
return stepSize;
|
||||
}
|
||||
public double getIntegrationTime() {
|
||||
return integrationTime;
|
||||
}
|
||||
public double getAdditionalBacklash() {
|
||||
return additionalBacklash;
|
||||
}
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
}
|
||||
@@ -49,7 +49,6 @@ import ch.psi.fda.core.messages.Message;
|
||||
*/
|
||||
public class ActorSensorLoop implements ActionLoop {
|
||||
|
||||
// Get Logger
|
||||
private static Logger logger = Logger.getLogger(ActorSensorLoop.class.getName());
|
||||
|
||||
/**
|
||||
@@ -120,16 +119,10 @@ public class ActorSensorLoop implements ActionLoop {
|
||||
private List<ActorSetCallable> pactors;
|
||||
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
*/
|
||||
public ActorSensorLoop(){
|
||||
this(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create instance of the
|
||||
*/
|
||||
public ActorSensorLoop(boolean zigZag){
|
||||
this.zigZag = zigZag;
|
||||
this.actionLoops = new ArrayList<ActionLoop>();
|
||||
@@ -148,9 +141,6 @@ public class ActorSensorLoop implements ActionLoop {
|
||||
}
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see ch.psi.fda.engine.ActionLoop#execute()
|
||||
*/
|
||||
/**
|
||||
* Executes the actor sensor loop. The actor sensor loop is build up as follows:
|
||||
* preActions
|
||||
@@ -353,9 +343,6 @@ public class ActorSensorLoop implements ActionLoop {
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see ch.psi.fda.engine.ActionLoop#abort()
|
||||
*/
|
||||
@Override
|
||||
public void abort(){
|
||||
abort = true;
|
||||
@@ -372,9 +359,6 @@ public class ActorSensorLoop implements ActionLoop {
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see ch.psi.fda.core.ActionLoop#prepare()
|
||||
*/
|
||||
@Override
|
||||
public void prepare() {
|
||||
// Put in prepare code here
|
||||
@@ -396,10 +380,6 @@ public class ActorSensorLoop implements ActionLoop {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see ch.psi.fda.core.ActionLoop#cleanup()
|
||||
*/
|
||||
@Override
|
||||
public void cleanup() {
|
||||
// Put in cleanup code here
|
||||
@@ -436,89 +416,38 @@ public class ActorSensorLoop implements ActionLoop {
|
||||
return new DataQueue(dataQueue, m);
|
||||
}
|
||||
|
||||
// Getter functions for variable parts
|
||||
|
||||
/**
|
||||
* @return the actionLoops
|
||||
*/
|
||||
public List<ActionLoop> getActionLoops() {
|
||||
return actionLoops;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return the preActorActions
|
||||
*/
|
||||
public List<Action> getPreActorActions() {
|
||||
return preActorActions;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return the postActorActions
|
||||
*/
|
||||
public List<Action> getPostActorActions() {
|
||||
return postActorActions;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return the preSensorActions
|
||||
*/
|
||||
public List<Action> getPreSensorActions() {
|
||||
return preSensorActions;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return the postSensorActions
|
||||
*/
|
||||
public List<Action> getPostSensorActions() {
|
||||
return postSensorActions;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return the actors
|
||||
*/
|
||||
public List<Actor> getActors() {
|
||||
return actors;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return the sensors
|
||||
*/
|
||||
public List<Sensor> getSensors() {
|
||||
return sensors;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the guard
|
||||
*/
|
||||
public Guard getGuard() {
|
||||
return guard;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param guard the guard to set
|
||||
*/
|
||||
public void setGuard(Guard guard) {
|
||||
this.guard = guard;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the dataGroup
|
||||
*/
|
||||
public boolean isDataGroup() {
|
||||
return dataGroup;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param dataGroup the dataGroup to set
|
||||
*/
|
||||
public void setDataGroup(boolean dataGroup) {
|
||||
this.dataGroup = dataGroup;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -38,7 +38,6 @@ import jcifs.smb.SmbFile;
|
||||
import ch.psi.fda.core.Action;
|
||||
import ch.psi.fda.core.ActionLoop;
|
||||
import ch.psi.fda.core.Sensor;
|
||||
import ch.psi.fda.core.actors.OTFActuator;
|
||||
import ch.psi.fda.core.messages.ComponentMetadata;
|
||||
import ch.psi.fda.core.messages.DataMessage;
|
||||
import ch.psi.fda.core.messages.DataMessageMetadata;
|
||||
@@ -126,11 +125,6 @@ public class CrlogicLoop implements ActionLoop {
|
||||
*/
|
||||
private Semaphore semaphore = new Semaphore(1);
|
||||
|
||||
/**
|
||||
* Special OTF Actuator
|
||||
*/
|
||||
private OTFActuator actuator = null;
|
||||
|
||||
/**
|
||||
* List of sensors of this loop
|
||||
*/
|
||||
@@ -156,6 +150,15 @@ public class CrlogicLoop implements ActionLoop {
|
||||
private final ChannelService cservice;
|
||||
|
||||
|
||||
private String id;
|
||||
private String name; // name of the motor channel
|
||||
private String readback; // name of the encoder channel
|
||||
private double start;
|
||||
private double end;
|
||||
private double stepSize;
|
||||
private double integrationTime;
|
||||
private double additionalBacklash;
|
||||
|
||||
public CrlogicLoop(ChannelService cservice, String prefix, String server, String share, String smbShare, boolean zigZag){
|
||||
this.cservice = cservice;
|
||||
this.prefix = prefix;
|
||||
@@ -175,7 +178,18 @@ public class CrlogicLoop implements ActionLoop {
|
||||
this.dataQueue = new LinkedBlockingQueue<Message>(2000);
|
||||
}
|
||||
|
||||
|
||||
public void setActuator(String id, String name, String readback, double start, double end, double stepSize, double integrationTime, double additionalBacklash){
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.readback = readback;
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
this.stepSize = stepSize;
|
||||
this.integrationTime = integrationTime;
|
||||
this.additionalBacklash = additionalBacklash;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Collect data from share
|
||||
* @param tmpFileName Name of the temporary file
|
||||
@@ -323,15 +337,9 @@ public class CrlogicLoop implements ActionLoop {
|
||||
public void execute() throws InterruptedException {
|
||||
try{
|
||||
|
||||
double stepSize = actuator.getStepSize();
|
||||
double start = actuator.getStart();
|
||||
double end = actuator.getEnd();
|
||||
double integrationTime = actuator.getIntegrationTime();
|
||||
double ubacklash = actuator.getAdditionalBacklash();
|
||||
|
||||
// Set values for the datafilter
|
||||
crlogicDataFilter.setStart(actuator.getStart());
|
||||
crlogicDataFilter.setEnd(actuator.getEnd());
|
||||
crlogicDataFilter.setStart(start);
|
||||
crlogicDataFilter.setEnd(end);
|
||||
|
||||
// Reset data filter
|
||||
for(Integer k: scalerIndices.keySet()){
|
||||
@@ -461,7 +469,7 @@ public class CrlogicLoop implements ActionLoop {
|
||||
|
||||
// TODO Calculate and set motor speed, backlash, etc.
|
||||
double motorSpeed = stepSize/integrationTime;
|
||||
double backlash = (0.5*motorSpeed*motortemplate.getAccelerationTime().getValue())+motorBacklash+ubacklash;
|
||||
double backlash = (0.5*motorSpeed*motortemplate.getAccelerationTime().getValue())+motorBacklash+additionalBacklash;
|
||||
double realEnd = end+(backlash*direction);
|
||||
double realStart = start-(backlash*direction);
|
||||
|
||||
@@ -569,7 +577,10 @@ public class CrlogicLoop implements ActionLoop {
|
||||
readQueue.put(tmpFileName);
|
||||
|
||||
if(zigZag){
|
||||
actuator.reverse();
|
||||
// reverse start/end
|
||||
double aend = end;
|
||||
end=start;
|
||||
start=aend;
|
||||
}
|
||||
|
||||
synchronized(this){
|
||||
@@ -638,7 +649,7 @@ public class CrlogicLoop implements ActionLoop {
|
||||
// Connect motor channels
|
||||
motortemplate = new TemplateMotor();
|
||||
map = new HashMap<>();
|
||||
map.put("PREFIX", actuator.getName());
|
||||
map.put("PREFIX", this.name);
|
||||
cservice.createAnnotatedChannels(motortemplate, map);
|
||||
|
||||
useReadback = motortemplate.getUseReadback().getValue();
|
||||
@@ -655,20 +666,20 @@ public class CrlogicLoop implements ActionLoop {
|
||||
// Determine mode of motor
|
||||
if((!useReadback) && (!useEncoder)){
|
||||
// Open loop
|
||||
if(actuator.getReadback()!=null){
|
||||
if(this.readback!=null){
|
||||
throw new IllegalArgumentException("Readback not supported if motor is configured in open loop");
|
||||
}
|
||||
else{
|
||||
readoutResources.add(actuator.getName());
|
||||
readoutResources.add(this.name);
|
||||
}
|
||||
|
||||
}
|
||||
else if(useReadback && (!useEncoder)){
|
||||
String readback;
|
||||
// use readback link
|
||||
if(actuator.getReadback()!=null){
|
||||
if(this.readback!=null){
|
||||
// Use specified readback
|
||||
readback = (actuator.getReadback());
|
||||
readback = this.readback;
|
||||
}
|
||||
else{
|
||||
// Set resouce to readback link
|
||||
@@ -701,12 +712,12 @@ public class CrlogicLoop implements ActionLoop {
|
||||
}
|
||||
else if (useEncoder && (!useReadback)){
|
||||
// use readback link
|
||||
if(actuator.getReadback()!=null){
|
||||
if(this.readback!=null){
|
||||
throw new IllegalArgumentException("Readback not supported if motor is configured to use encoder");
|
||||
}
|
||||
else{
|
||||
// Set resouce to readback link
|
||||
readoutResources.add(actuator.getName()+"_ENC");
|
||||
readoutResources.add(this.name+"_ENC");
|
||||
}
|
||||
}
|
||||
else{
|
||||
@@ -799,14 +810,6 @@ public class CrlogicLoop implements ActionLoop {
|
||||
return sensors;
|
||||
}
|
||||
|
||||
public OTFActuator getActor() {
|
||||
return actuator;
|
||||
}
|
||||
|
||||
public void setActor(OTFActuator actor) {
|
||||
this.actuator = actor;
|
||||
}
|
||||
|
||||
/**
|
||||
* The structure of the data message depends on the sensors registered at this loop
|
||||
* at the time this method is called.
|
||||
@@ -816,7 +819,7 @@ public class CrlogicLoop implements ActionLoop {
|
||||
DataMessageMetadata m = new DataMessageMetadata();
|
||||
|
||||
// Build up data message metadata based on the sensors currently registered.
|
||||
m.getComponents().add(new ComponentMetadata(actuator.getId()));
|
||||
m.getComponents().add(new ComponentMetadata(this.id));
|
||||
for(Sensor s: sensors){
|
||||
m.getComponents().add(new ComponentMetadata(s.getId()));
|
||||
}
|
||||
|
||||
+1
-5
@@ -16,7 +16,7 @@
|
||||
* along with this code. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package ch.psi.fda.core.loops;
|
||||
package ch.psi.fda.core.loops.otf;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
@@ -26,10 +26,6 @@ import java.net.MalformedURLException;
|
||||
|
||||
import jcifs.smb.SmbFile;
|
||||
|
||||
/**
|
||||
* @author ebner
|
||||
*
|
||||
*/
|
||||
public class DistributedFile {
|
||||
|
||||
private SmbFile smbfile = null;
|
||||
+37
-35
@@ -17,7 +17,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
package ch.psi.fda.core.loops;
|
||||
package ch.psi.fda.core.loops.otf;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
@@ -32,7 +32,6 @@ import java.util.logging.Logger;
|
||||
import ch.psi.fda.core.Action;
|
||||
import ch.psi.fda.core.ActionLoop;
|
||||
import ch.psi.fda.core.Sensor;
|
||||
import ch.psi.fda.core.actors.OTFActuator;
|
||||
import ch.psi.fda.core.messages.ComponentMetadata;
|
||||
import ch.psi.fda.core.messages.DataMessage;
|
||||
import ch.psi.fda.core.messages.DataMessageMetadata;
|
||||
@@ -41,18 +40,14 @@ import ch.psi.fda.core.messages.EndOfStreamMessage;
|
||||
import ch.psi.fda.core.messages.Message;
|
||||
import ch.psi.fda.core.sensors.MillisecondTimestampSensor;
|
||||
import ch.psi.fda.core.sensors.OTFNamedChannelSensor;
|
||||
import ch.psi.fda.core.sensors.OTFReadbackSensor;
|
||||
import ch.psi.fda.core.sensors.OTFScalerChannelSensor;
|
||||
|
||||
/**
|
||||
* ActionLoop that is implementing the OTF Scan logic.
|
||||
* While executing the loop a full OTF scan procedure is executed.
|
||||
* @author ebner
|
||||
*
|
||||
*/
|
||||
public class OTFLoop implements ActionLoop {
|
||||
|
||||
// Get Logger
|
||||
private static Logger logger = Logger.getLogger(OTFLoop.class.getName());
|
||||
|
||||
/**
|
||||
@@ -61,7 +56,6 @@ public class OTFLoop implements ActionLoop {
|
||||
*/
|
||||
private boolean dataGroup = false;
|
||||
|
||||
// Constants
|
||||
/**
|
||||
* Maximum number of monitored channels
|
||||
*/
|
||||
@@ -108,11 +102,6 @@ public class OTFLoop implements ActionLoop {
|
||||
*/
|
||||
private List<Action> postActions;
|
||||
|
||||
/**
|
||||
* Special OTF Actuator
|
||||
*/
|
||||
private OTFActuator actor = null;
|
||||
|
||||
/**
|
||||
* List of sensors of this loop
|
||||
*/
|
||||
@@ -138,8 +127,18 @@ public class OTFLoop implements ActionLoop {
|
||||
*/
|
||||
private volatile boolean abort = false;
|
||||
|
||||
|
||||
private String id;
|
||||
private String name; // name of the motor channel
|
||||
private String readback; // name of the encoder channel
|
||||
private double start;
|
||||
private double end;
|
||||
private double stepSize;
|
||||
private double integrationTime;
|
||||
private double additionalBacklash;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param channelPrefix Prefix of the OTF related records, e.g. MTEST-HW3-OTF
|
||||
* @param server NFS server the OTF C Logic should put its data to
|
||||
* @param share Share on NFS server to put the OTF C Logic data
|
||||
@@ -164,6 +163,18 @@ public class OTFLoop implements ActionLoop {
|
||||
this.dataQueue = new LinkedBlockingQueue<Message>(2000);
|
||||
}
|
||||
|
||||
public void setActuator(String id, String name, String readback, double start, double end, double stepSize, double integrationTime, double additionalBacklash){
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.readback = readback;
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
this.stepSize = stepSize;
|
||||
this.integrationTime = integrationTime;
|
||||
this.additionalBacklash = additionalBacklash;
|
||||
}
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see ch.psi.fda.core.Action#execute()
|
||||
*/
|
||||
@@ -218,14 +229,10 @@ public class OTFLoop implements ActionLoop {
|
||||
// Set abort flag to false
|
||||
abort=false;
|
||||
|
||||
// Check whether actor is set for the loop
|
||||
if(actor == null){
|
||||
throw new IllegalStateException("No actor specified for this loop");
|
||||
}
|
||||
|
||||
// list with all monitored channels
|
||||
List<String> monitoredChannels = new ArrayList<String>();
|
||||
dataIndexes = new ArrayList<Integer>();
|
||||
dataIndexes.add(1); // The first one is always the readback of the motor
|
||||
int channelCount =0;
|
||||
for(Sensor s: sensors){
|
||||
if(s instanceof OTFNamedChannelSensor){
|
||||
@@ -251,9 +258,9 @@ public class OTFLoop implements ActionLoop {
|
||||
else if (s instanceof MillisecondTimestampSensor){
|
||||
dataIndexes.add(2+numberOfScalerChannels+numberOfMonitoredChannels);
|
||||
}
|
||||
else if (s instanceof OTFReadbackSensor){
|
||||
dataIndexes.add(1);
|
||||
}
|
||||
// else if (s instanceof OTFReadbackSensor){
|
||||
// dataIndexes.add(1);
|
||||
// }
|
||||
else{
|
||||
throw new IllegalArgumentException("Sensor type "+s.getClass()+" is not supported by this loop");
|
||||
}
|
||||
@@ -264,23 +271,23 @@ public class OTFLoop implements ActionLoop {
|
||||
obean.resetToDefaults();
|
||||
|
||||
// Set actor properties
|
||||
obean.setMotor(actor.getName());
|
||||
obean.setMotor(this.name);
|
||||
obean.waitUntilMotorOk(timeout);
|
||||
|
||||
obean.setBegin(actor.getStart());
|
||||
obean.setEnd(actor.getEnd());
|
||||
obean.setStepSize(actor.getStepSize());
|
||||
obean.setIntegrationTime(actor.getIntegrationTime());
|
||||
obean.setBegin(this.start);
|
||||
obean.setEnd(this.end);
|
||||
obean.setStepSize(this.stepSize);
|
||||
obean.setIntegrationTime(this.integrationTime);
|
||||
|
||||
// Override encoder if specified
|
||||
if(actor.getReadback()!=null){
|
||||
if(this.readback!=null){
|
||||
obean.setUseEncoder(true);
|
||||
obean.setEncoder(actor.getReadback());
|
||||
obean.setEncoder(this.readback);
|
||||
obean.waitUntilEncoderOk(timeout);
|
||||
}
|
||||
|
||||
// Set user backlash
|
||||
obean.setUserBacklash(actor.getAdditionalBacklash());
|
||||
obean.setUserBacklash(this.additionalBacklash);
|
||||
|
||||
|
||||
// NFS settings
|
||||
@@ -348,6 +355,7 @@ public class OTFLoop implements ActionLoop {
|
||||
*/
|
||||
public DataQueue getDataQueue() {
|
||||
DataMessageMetadata m = new DataMessageMetadata();
|
||||
m.getComponents().add(new ComponentMetadata(id)); // Id of the readback of the motor
|
||||
|
||||
// Build up data message metadata based on the sensors currently registered.
|
||||
for(Sensor s: sensors){
|
||||
@@ -441,12 +449,6 @@ public class OTFLoop implements ActionLoop {
|
||||
public List<Sensor> getSensors() {
|
||||
return sensors;
|
||||
}
|
||||
public OTFActuator getActor() {
|
||||
return actor;
|
||||
}
|
||||
public void setActor(OTFActuator actor) {
|
||||
this.actor = actor;
|
||||
}
|
||||
public boolean isDataGroup() {
|
||||
return dataGroup;
|
||||
}
|
||||
+1
-1
@@ -17,7 +17,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
package ch.psi.fda.core.loops;
|
||||
package ch.psi.fda.core.loops.otf;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
@@ -1,48 +0,0 @@
|
||||
/**
|
||||
*
|
||||
* Copyright 2010 Paul Scherrer Institute. All rights reserved.
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful,
|
||||
* but without any warranty; without even the implied warranty of
|
||||
* merchantability or fitness for a particular purpose. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this code. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package ch.psi.fda.core.sensors;
|
||||
|
||||
import ch.psi.fda.core.Sensor;
|
||||
|
||||
/**
|
||||
* Sensor to read actuator readback. This sensor must only be used within the
|
||||
* OTFLoop. If it is used in other loops, the read value will always be 0.
|
||||
* @author ebner
|
||||
*
|
||||
*/
|
||||
public class OTFReadbackSensor implements Sensor {
|
||||
|
||||
private final String id;
|
||||
|
||||
public OTFReadbackSensor(String id){
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object read() {
|
||||
// Always return 0 if read() method is called.
|
||||
return 0d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,7 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import ch.psi.fda.TestConfiguration;
|
||||
import ch.psi.fda.core.loops.otf.DistributedFile;
|
||||
|
||||
/**
|
||||
* @author ebner
|
||||
@@ -58,7 +59,7 @@ public class DistributedFileTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link ch.psi.fda.core.loops.DistributedFile#getCanonicalPath()}.
|
||||
* Test method for {@link ch.psi.fda.core.loops.otf.DistributedFile#getCanonicalPath()}.
|
||||
* @throws IOException
|
||||
*/
|
||||
@Test
|
||||
@@ -68,7 +69,7 @@ public class DistributedFileTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link ch.psi.fda.core.loops.DistributedFile#exists()}.
|
||||
* Test method for {@link ch.psi.fda.core.loops.otf.DistributedFile#exists()}.
|
||||
* @throws IOException
|
||||
*/
|
||||
@Test
|
||||
@@ -82,7 +83,7 @@ public class DistributedFileTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link ch.psi.fda.core.loops.DistributedFile#isDirectory()}.
|
||||
* Test method for {@link ch.psi.fda.core.loops.otf.DistributedFile#isDirectory()}.
|
||||
* @throws IOException
|
||||
*/
|
||||
@Test
|
||||
@@ -96,7 +97,7 @@ public class DistributedFileTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link ch.psi.fda.core.loops.DistributedFile#listFiles()}.
|
||||
* Test method for {@link ch.psi.fda.core.loops.otf.DistributedFile#listFiles()}.
|
||||
*/
|
||||
@Test
|
||||
public void testListFiles() {
|
||||
@@ -104,7 +105,7 @@ public class DistributedFileTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link ch.psi.fda.core.loops.DistributedFile#getName()}.
|
||||
* Test method for {@link ch.psi.fda.core.loops.otf.DistributedFile#getName()}.
|
||||
*/
|
||||
@Test
|
||||
public void testGetName() {
|
||||
@@ -113,7 +114,7 @@ public class DistributedFileTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link ch.psi.fda.core.loops.DistributedFile#isFile()}.
|
||||
* Test method for {@link ch.psi.fda.core.loops.otf.DistributedFile#isFile()}.
|
||||
* @throws IOException
|
||||
*/
|
||||
@Test
|
||||
@@ -127,7 +128,7 @@ public class DistributedFileTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link ch.psi.fda.core.loops.DistributedFile#delete()}.
|
||||
* Test method for {@link ch.psi.fda.core.loops.otf.DistributedFile#delete()}.
|
||||
*/
|
||||
@Test
|
||||
public void testDelete() {
|
||||
@@ -135,7 +136,7 @@ public class DistributedFileTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link ch.psi.fda.core.loops.DistributedFile#getInputStream()}.
|
||||
* Test method for {@link ch.psi.fda.core.loops.otf.DistributedFile#getInputStream()}.
|
||||
*/
|
||||
@Test
|
||||
public void testGetInputStream() {
|
||||
|
||||
@@ -34,15 +34,14 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import ch.psi.fda.TestConfiguration;
|
||||
import ch.psi.fda.core.actors.OTFActuator;
|
||||
import ch.psi.fda.core.loops.OTFLoop;
|
||||
import ch.psi.fda.core.loops.otf.OTFLoop;
|
||||
import ch.psi.fda.core.loops.otf.TemplateOTF;
|
||||
import ch.psi.fda.core.messages.ControlMessage;
|
||||
import ch.psi.fda.core.messages.DataMessage;
|
||||
import ch.psi.fda.core.messages.DataMessageMetadata;
|
||||
import ch.psi.fda.core.messages.Message;
|
||||
import ch.psi.fda.core.sensors.MillisecondTimestampSensor;
|
||||
import ch.psi.fda.core.sensors.OTFNamedChannelSensor;
|
||||
import ch.psi.fda.core.sensors.OTFReadbackSensor;
|
||||
import ch.psi.fda.core.sensors.OTFScalerChannelSensor;
|
||||
import ch.psi.jcae.Channel;
|
||||
import ch.psi.jcae.ChannelDescriptor;
|
||||
@@ -70,8 +69,6 @@ public class OTFLoopTest {
|
||||
cservice = new DefaultChannelService();
|
||||
statusChannel = cservice.createChannel(new ChannelDescriptor<>(Integer.class, configuration.getOtfPrefix()+":USTAT"));
|
||||
|
||||
OTFActuator actor = new OTFActuator("id", configuration.getMotor1(), null, 0, 8, 0.5, 0.5, 0);
|
||||
OTFReadbackSensor s1 = new OTFReadbackSensor("id0");
|
||||
OTFScalerChannelSensor s2 = new OTFScalerChannelSensor("id1", 0);
|
||||
OTFScalerChannelSensor s3 = new OTFScalerChannelSensor("id2", 1);
|
||||
MillisecondTimestampSensor s4 = new MillisecondTimestampSensor("id3");
|
||||
@@ -85,8 +82,7 @@ public class OTFLoopTest {
|
||||
|
||||
// ZigZag loop
|
||||
loopZigZag = new OTFLoop(template, configuration.getServer(), configuration.getShare(), configuration.getSmbShare(), true);
|
||||
loopZigZag.setActor(actor);
|
||||
loopZigZag.getSensors().add(s1);
|
||||
loopZigZag.setActuator("id0", configuration.getMotor1(), null, 0, 8, 0.5, 0.5, 0);
|
||||
loopZigZag.getSensors().add(s2);
|
||||
loopZigZag.getSensors().add(s3);
|
||||
loopZigZag.getSensors().add(s4);
|
||||
@@ -95,8 +91,7 @@ public class OTFLoopTest {
|
||||
|
||||
// Normal loop
|
||||
loop = new OTFLoop(template, configuration.getServer(), configuration.getShare(), configuration.getSmbShare(), false);
|
||||
loop.setActor(actor);
|
||||
loop.getSensors().add(s1);
|
||||
loop.setActuator("id0", configuration.getMotor1(), null, 0, 8, 0.5, 0.5, 0);
|
||||
loop.getSensors().add(s2);
|
||||
loop.getSensors().add(s3);
|
||||
loop.getSensors().add(s4);
|
||||
@@ -109,7 +104,7 @@ public class OTFLoopTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link ch.psi.fda.core.loops.OTFLoop#execute()}.
|
||||
* Test method for {@link ch.psi.fda.core.loops.otf.OTFLoop#execute()}.
|
||||
* Test ordinary 1D OTF scan
|
||||
* @throws ExecutionException
|
||||
* @throws ChannelException
|
||||
@@ -134,7 +129,7 @@ public class OTFLoopTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link ch.psi.fda.core.loops.OTFLoop#execute()}.
|
||||
* Test method for {@link ch.psi.fda.core.loops.otf.OTFLoop#execute()}.
|
||||
* Test OTF ZigZag mode
|
||||
* @throws ExecutionException
|
||||
* @throws ChannelException
|
||||
@@ -160,7 +155,7 @@ public class OTFLoopTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link ch.psi.fda.core.loops.OTFLoop#execute()}.
|
||||
* Test method for {@link ch.psi.fda.core.loops.otf.OTFLoop#execute()}.
|
||||
* Test abort functionality while executing an OTF scan
|
||||
* @throws ExecutionException
|
||||
* @throws ChannelException
|
||||
@@ -240,10 +235,10 @@ public class OTFLoopTest {
|
||||
Message m = queue.take();
|
||||
if(m instanceof DataMessage){
|
||||
DataMessage x = (DataMessage) m;
|
||||
logger.fine( x.toString() );
|
||||
logger.info( x.toString() );
|
||||
}
|
||||
else if(m instanceof ControlMessage){
|
||||
logger.fine("---- "+m.toString()+" ----");
|
||||
logger.info("---- "+m.toString()+" ----");
|
||||
}
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
|
||||
@@ -33,7 +33,6 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import ch.psi.fda.TestConfiguration;
|
||||
import ch.psi.fda.core.actors.OTFActuator;
|
||||
import ch.psi.fda.core.messages.EndOfStreamMessage;
|
||||
import ch.psi.fda.core.messages.Message;
|
||||
import ch.psi.fda.core.sensors.MillisecondTimestampSensor;
|
||||
@@ -92,7 +91,7 @@ public class ParallelCrlogicTest {
|
||||
|
||||
|
||||
CrlogicLoop crlogic = new CrlogicLoop(cservice, c.getCrlogicPrefix(), c.getServer(), c.getShare(), c.getSmbShare(), zigZag);
|
||||
crlogic.setActor(new OTFActuator("cmot", c.getMotor1(), readback, start, end, stepSize, integrationTime, additionalBacklash));
|
||||
crlogic.setActuator("cmot", c.getMotor1(), readback, start, end, stepSize, integrationTime, additionalBacklash);
|
||||
crlogic.getSensors().add(new OTFNamedChannelSensor("trigger", "TRIGGER0"));
|
||||
crlogic.getSensors().add(new OTFScalerChannelSensor("scaler0", 0));
|
||||
crlogic.getSensors().add(new OTFScalerChannelSensor("scaler1", 1));
|
||||
|
||||
Reference in New Issue
Block a user