14 Commits

Author SHA1 Message Date
gobbo_a a039549120 Added visualization to Fdaq 2014-08-29 16:28:51 +02:00
gobbo_a 0e72d92828 Added visualization to Fdaq 2014-08-29 16:19:52 +02:00
gobbo_a 30fe3bee7f Several bug fixes and small improvements 2014-08-28 14:26:19 +02:00
ebner 3abd49b22a fixed upload url pom 2014-07-28 11:59:07 +02:00
ebner fb46af0965 Updated version 2014-05-12 11:12:03 +02:00
ebner 87607130bb Fixed stopping and improved test server 2014-05-06 13:50:08 +02:00
ebner a49fc28437 improved test server 2014-05-06 13:15:11 +02:00
ebner 04294bcf31 Added test server for testing 2014-05-05 16:37:37 +02:00
ebner c4c1f16160 fixed config to not fail if vm option is not specified 2014-05-05 13:46:33 +02:00
ebner c93f5a8d6f Added serviceloader configuration 2014-05-05 13:42:09 +02:00
ebner bae42a37a1 updated readme and edescriptor 2014-05-05 13:40:41 +02:00
ebner f215fb874c made classes fda 2.x compliant 2014-05-05 13:37:49 +02:00
ebner 416a9ab3af Use of a buffered input stream ... 2014-03-21 14:32:15 +01:00
ebner 0ad4f9f6db Fix in readout logic 2014-03-21 13:59:07 +01:00
14 changed files with 386 additions and 51 deletions
+1 -1
View File
@@ -33,7 +33,7 @@ ch.psi.fda.fdaq.port=1234
ch.psi.fda.fdaq.killPort=4321 ch.psi.fda.fdaq.killPort=4321
``` ```
Use `-Dch.psi.fda.fdaq.config=<file>` to use this property file as base configuration. Use `-Dch.psi.fda.fdaq.config.file=<file>` to use this property file as base configuration.
+16 -4
View File
@@ -3,13 +3,25 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>ch.psi</groupId> <groupId>ch.psi</groupId>
<artifactId>ch.psi.fda.fdaq</artifactId> <artifactId>ch.psi.fda.fdaq</artifactId>
<version>1.0.9</version> <version>2.3.4</version>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>ch.psi</groupId> <groupId>ch.psi</groupId>
<artifactId>ch.psi.fda.core</artifactId> <artifactId>ch.psi.fda.core</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>2.3.4</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<dependency>
<groupId>ch.psi</groupId>
<artifactId>jcae</artifactId>
<version>2.4.1</version>
</dependency> </dependency>
</dependencies> </dependencies>
@@ -48,12 +60,12 @@
<snapshotRepository> <snapshotRepository>
<id>i.snapshots</id> <id>i.snapshots</id>
<name>Artifactory Snapshots</name> <name>Artifactory Snapshots</name>
<url>http://yoke/artifactory/libs-snapshots-local</url> <url>http://yoke.psi.ch:8081/artifactory/libs-snapshots-local</url>
</snapshotRepository> </snapshotRepository>
<repository> <repository>
<id>i.releases</id> <id>i.releases</id>
<name>Atrifactory Releases</name> <name>Atrifactory Releases</name>
<url>http://yoke/artifactory/libs-releases-local</url> <url>http://yoke.psi.ch:8081/artifactory/libs-releases-local</url>
</repository> </repository>
</distributionManagement> </distributionManagement>
</project> </project>
@@ -18,8 +18,10 @@
*/ */
package ch.psi.fda.fdaq; package ch.psi.fda.fdaq;
import java.io.BufferedInputStream;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException; import java.io.IOException;
import java.net.Socket; import java.net.Socket;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@@ -35,10 +37,6 @@ import ch.psi.fda.messages.DataMessage;
import ch.psi.fda.messages.EndOfStreamMessage; import ch.psi.fda.messages.EndOfStreamMessage;
import ch.psi.fda.messages.Metadata; import ch.psi.fda.messages.Metadata;
/**
* Fdaq service
*
*/
public class Fdaq { public class Fdaq {
private static final Logger logger = Logger.getLogger(Fdaq.class.getName()); private static final Logger logger = Logger.getLogger(Fdaq.class.getName());
@@ -49,7 +47,7 @@ public class Fdaq {
private final EventBus bus; private final EventBus bus;
private FdaqConfiguration configuration; private FdaqConfiguration configuration;
private final int numberOfElements = Integer.MAX_VALUE/2; private final int numberOfElements = Integer.MAX_VALUE/2;
public Fdaq(EventBus bus, FdaqConfiguration configuration){ public Fdaq(EventBus bus, FdaqConfiguration configuration){
this.bus = bus; this.bus = bus;
@@ -65,6 +63,14 @@ public class Fdaq {
public void acquire() { public void acquire() {
running = true; // potential threading problem running = true; // potential threading problem
final List<Metadata> metadata = new ArrayList<>();
metadata.add(new Metadata("counter"));
metadata.add(new Metadata("ain1"));
metadata.add(new Metadata("ain2"));
metadata.add(new Metadata("ain3"));
metadata.add(new Metadata("ain4"));
metadata.add(new Metadata("enc1"));
Socket echoSocket = null; Socket echoSocket = null;
DataOutputStream out = null; DataOutputStream out = null;
DataInputStream in = null; DataInputStream in = null;
@@ -78,7 +84,7 @@ public class Fdaq {
stopAcquisition = false; stopAcquisition = false;
echoSocket = new Socket(configuration.getHostname(), configuration.getPort()); echoSocket = new Socket(configuration.getHostname(), configuration.getPort());
out = new DataOutputStream(echoSocket.getOutputStream()); out = new DataOutputStream(echoSocket.getOutputStream());
in = new DataInputStream(echoSocket.getInputStream()); in = new DataInputStream(new BufferedInputStream(echoSocket.getInputStream()));
ByteBuffer bytebuffer = ByteBuffer.allocate(3 * 4); // 3 times Integer ByteBuffer bytebuffer = ByteBuffer.allocate(3 * 4); // 3 times Integer
bytebuffer.order(ByteOrder.LITTLE_ENDIAN); bytebuffer.order(ByteOrder.LITTLE_ENDIAN);
@@ -96,24 +102,13 @@ public class Fdaq {
out.write(bytebuffer.array()); out.write(bytebuffer.array());
out.flush(); out.flush();
final List<Metadata> metadata = new ArrayList<>();
metadata.add(new Metadata("counter"));
metadata.add(new Metadata("ain1"));
metadata.add(new Metadata("ain2"));
metadata.add(new Metadata("ain3"));
metadata.add(new Metadata("ain4"));
metadata.add(new Metadata("enc1"));
int index=0;
for (int t = 0; t < numberOfElements; t++) { for (int t = 0; t < numberOfElements; t++) {
// struct fdaqbloc_out {int trigindex;int adc1reg;int byte[] cbuffer = new byte[4*4]; // 4 times Integers a 4 bytes
// adc2reg;int encoder;};
ByteBuffer buffer = ByteBuffer.allocate(4 * 4); // 4 times try{
// Integers in.readFully(cbuffer);
buffer.order(ByteOrder.LITTLE_ENDIAN); }
int r = in.read(buffer.array()); catch(EOFException e){
if (r == -1) {
logger.info("End of Stream"); logger.info("End of Stream");
break; break;
} }
@@ -125,6 +120,8 @@ public class Fdaq {
continue; continue;
} }
ByteBuffer buffer = ByteBuffer.wrap(cbuffer);
buffer.order(ByteOrder.LITTLE_ENDIAN);
int a = buffer.getInt(); int a = buffer.getInt();
int b = buffer.getInt(); int b = buffer.getInt();
int b1 = b & 0xffff; int b1 = b & 0xffff;
@@ -142,14 +139,9 @@ public class Fdaq {
message.getData().add(c2); message.getData().add(c2);
message.getData().add(d); message.getData().add(d);
bus.post(message); bus.post(message);
if(t==0){
logger.info("index: "+a);
}
index=a;
} }
logger.info("Done ..."+index); logger.info("Done ...");
} catch (IOException e) { } catch (IOException e) {
// Ignore potential exceptions if stop was triggered before all messages were retrieved // Ignore potential exceptions if stop was triggered before all messages were retrieved
@@ -158,12 +150,16 @@ public class Fdaq {
} }
} finally { } finally {
try { try {
if (out!=null)
out.close(); out.close();
if (in!=null)
in.close(); in.close();
if (echoSocket!=null)
echoSocket.close(); echoSocket.close();
} catch (IOException e) { } catch (IOException e) {
// Ignore because not relevant at this stage // Ignore because not relevant at this stage
} }
running = false;
} }
} }
@@ -22,12 +22,28 @@ import java.io.File;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Logger;
public class FdaqConfiguration { public class FdaqConfiguration {
private static final Logger logger = Logger.getLogger(FdaqConfiguration.class.getName());
private final static String FDAQ_CONFIG = "ch.psi.fda.fdaq.config.file";
private String hostname = "mchip015.psi.ch"; private String hostname = "mchip015.psi.ch";
private int port = 2233; private int port = 2233;
private int killPort = 2234; private int killPort = 2234;
public FdaqConfiguration(){
String config = System.getProperty(FDAQ_CONFIG);
if(config != null){
loadFile(new File(config));
}
else{
logger.warning("No configuration file specified via -D"+FDAQ_CONFIG+"=... - using defaults");
}
}
public void loadFile(File file) { public void loadFile(File file) {
Properties properties = new Properties(); Properties properties = new Properties();
try { try {
@@ -0,0 +1,80 @@
/**
*
* Copyright 2014 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.fdaq;
import java.io.File;
import javax.inject.Inject;
import ch.psi.fda.EContainer;
import ch.psi.fda.fdaq.FdaqConfiguration;
import ch.psi.fda.serializer.SerializerTXT;
import com.google.common.eventbus.EventBus;
public class FdaqEContainer implements EContainer {
private Fdaq fdaq;
private EventBus bus;
private FdaqEDescriptor edescriptor;
@Inject
public FdaqEContainer(FdaqEDescriptor edescriptor, EventBus ebus){
this.bus = ebus;
this.edescriptor = edescriptor;
}
@Override
public void initialize() {
}
@Override
public void execute() {
if(fdaq!=null && fdaq.isRunning()){
throw new IllegalStateException("FDAQ is already running");
}
fdaq = new Fdaq(bus, new FdaqConfiguration());
File file = new File(edescriptor.getFileName());
file.getParentFile().mkdirs(); // Create data base directory
SerializerTXT serializer = new SerializerTXT(file);
serializer.setShowDimensionHeader(false);
bus.register(serializer);
fdaq.acquire();
}
@Override
public void abort() {
fdaq.stop();
}
@Override
public boolean isActive() {
return fdaq.isRunning();
}
@Override
public void destroy() {
}
}
@@ -0,0 +1,20 @@
package ch.psi.fda.fdaq;
import com.google.common.eventbus.EventBus;
import ch.psi.fda.EContainer;
import ch.psi.fda.EContainerFactory;
import ch.psi.fda.edescriptor.EDescriptor;
public class FdaqEContainerFactory implements EContainerFactory {
@Override
public boolean supportsEDescriptor(EDescriptor descriptor) {
return descriptor instanceof FdaqEDescriptor;
}
@Override
public EContainer getEContainer(EDescriptor descriptor, EventBus bus) {
return new FdaqEContainer((FdaqEDescriptor) descriptor, bus);
}
}
@@ -0,0 +1,18 @@
package ch.psi.fda.fdaq;
import javax.xml.bind.annotation.XmlRootElement;
import ch.psi.fda.edescriptor.EDescriptor;
@XmlRootElement(name="fdaq")
public class FdaqEDescriptor implements EDescriptor {
private String fileName;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
@@ -0,0 +1,44 @@
package ch.psi.fda.fdaq;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import ch.psi.fda.DescriptorProvider;
import ch.psi.fda.edescriptor.EDescriptor;
import ch.psi.fda.vdescriptor.VDescriptor;
public class FdaqEDescriptorProvider implements DescriptorProvider {
private EDescriptor edescriptor;
@Override
public void load(File... files) {
try {
JAXBContext context = JAXBContext.newInstance(FdaqEDescriptor.class);
Unmarshaller u = context.createUnmarshaller();
edescriptor = (EDescriptor) u.unmarshal(files[0]);
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
@Override
public EDescriptor getEDescriptor() {
return edescriptor;
}
@Override
public VDescriptor getVDescriptor() {
return null;
}
@Override
public Class<?> getEDescriptorClass() {
return FdaqEDescriptor.class;
}
}
@@ -16,13 +16,15 @@
* along with this code. If not, see <http://www.gnu.org/licenses/>. * along with this code. If not, see <http://www.gnu.org/licenses/>.
* *
*/ */
package ch.psi.fda.fdaq; package ch.psi.fda.fdaq.ui;
import java.io.File; import java.io.File;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import sun.misc.Signal; import sun.misc.Signal;
import sun.misc.SignalHandler; import sun.misc.SignalHandler;
import ch.psi.fda.fdaq.Fdaq;
import ch.psi.fda.fdaq.FdaqConfiguration;
import ch.psi.fda.serializer.SerializerTXT; import ch.psi.fda.serializer.SerializerTXT;
import com.google.common.eventbus.AsyncEventBus; import com.google.common.eventbus.AsyncEventBus;
@@ -31,8 +33,6 @@ import com.google.common.eventbus.EventBus;
@SuppressWarnings("restriction") @SuppressWarnings("restriction")
public class FdaqMain { public class FdaqMain {
public final static String FDAQ_CONFIG = "ch.psi.fda.fdaq.config";
public static void main(String[] args) { public static void main(String[] args) {
if(args.length != 1){ if(args.length != 1){
@@ -48,12 +48,6 @@ public class FdaqMain {
} }
FdaqConfiguration configuration = new FdaqConfiguration(); FdaqConfiguration configuration = new FdaqConfiguration();
String config = System.getProperty(FDAQ_CONFIG);
if(config != null){
configuration.loadFile(new File(config));
}
EventBus bus = new AsyncEventBus(Executors.newSingleThreadExecutor()); EventBus bus = new AsyncEventBus(Executors.newSingleThreadExecutor());
final Fdaq fdaq = new Fdaq(bus, configuration); final Fdaq fdaq = new Fdaq(bus, configuration);
@@ -0,0 +1 @@
ch.psi.fda.fdaq.FdaqEDescriptorProvider
@@ -0,0 +1 @@
ch.psi.fda.fdaq.FdaqEContainerFactory
@@ -0,0 +1,154 @@
/**
*
* Copyright 2013 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.fdaq;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.logging.Logger;
/**
* Simple socket server emulating the fdaq black box.
*/
public class FdaqServer {
private static final Logger logger = Logger.getLogger(FdaqServer.class.getName());
private volatile boolean stop = false;
public void startKillSocket(int port) {
try {
ServerSocket serverSocket = new ServerSocket(port);
try{
while(true){
Socket socket = serverSocket.accept();
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
DataInputStream in = new DataInputStream(socket.getInputStream());
byte[] requestBuffer = new byte[1 * 4]; // 2 times integers
ByteBuffer bytebuffer = ByteBuffer.wrap(requestBuffer);
bytebuffer.order(ByteOrder.LITTLE_ENDIAN);
in.read(requestBuffer);
bytebuffer.getInt();
logger.info("Terminate sender");
stop=true;
out.close();
in.close();
socket.close();
}
}
finally{
serverSocket.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void startSenderSocket(int port) {
stop = false;
try {
ServerSocket serverSocket = new ServerSocket(port);
try{
while(true){
Socket socket = serverSocket.accept();
stop = false;
logger.info("Start sending ...");
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
DataInputStream in = new DataInputStream(socket.getInputStream());
byte[] requestBuffer = new byte[2 * 4]; // 2 times integers
ByteBuffer bytebuffer = ByteBuffer.wrap(requestBuffer);
bytebuffer.order(ByteOrder.LITTLE_ENDIAN);
in.read(requestBuffer);
bytebuffer.getInt(); // This will always be 26
int nMessages = bytebuffer.getInt(); // Contains number of images to
// receive
// System.out.println("Messages to send: "+nMessages);
for (int t = 0; t < nMessages; t++) {
if(stop){ // Terminate loop if kill socket got a request
break;
}
// System.out.println(t+" "+0+" "+0+" "+ (-t));
byte[] dataBuffer = new byte[4 * 4]; // 4 times Integers
ByteBuffer buffer = ByteBuffer.wrap(dataBuffer); // 4 times
// Integers
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(t);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(-t);
out.write(dataBuffer);
out.flush();
if(t>1028){ // The first 1028 images are skipped anyways
Thread.sleep(10);
}
}
out.close();
in.close();
socket.close();
}
}
finally{
serverSocket.close();
}
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) throws IOException, InterruptedException {
final FdaqConfiguration configuration = new FdaqConfiguration();
final FdaqServer server = new FdaqServer();
new Thread(new Runnable() {
@Override
public void run() {
server.startSenderSocket(configuration.getPort());
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
server.startKillSocket(configuration.getKillPort());
}
}).start();
}
}
@@ -27,8 +27,6 @@ import java.nio.ByteOrder;
/** /**
* Simple socket client to connect to the fdaq black box. * Simple socket client to connect to the fdaq black box.
* @author ebner
*
*/ */
public class SocketClient { public class SocketClient {
@@ -43,11 +41,13 @@ public class SocketClient {
public static void main(String[] args) throws IOException, InterruptedException { public static void main(String[] args) throws IOException, InterruptedException {
// Socket echoSocket = new Socket("localhost", 9999); // Socket echoSocket = new Socket("localhost", 9999);
Socket echoSocket = new Socket("mchip015", 2233); // Socket echoSocket = new Socket("mchip015", 2233);
Socket echoSocket = new Socket("localhost", 2233);
DataOutputStream out = new DataOutputStream(echoSocket.getOutputStream()); DataOutputStream out = new DataOutputStream(echoSocket.getOutputStream());
DataInputStream in = new DataInputStream(echoSocket.getInputStream()); DataInputStream in = new DataInputStream(echoSocket.getInputStream());
int nMessages = 100; // int nMessages = 100;
int nMessages = Integer.MAX_VALUE;
// struct fdaqbloc_in {int fnum;int nsample;}; // struct fdaqbloc_in {int fnum;int nsample;};
ByteBuffer bytebuffer = ByteBuffer.allocate(2*4); // 2 times Integers ByteBuffer bytebuffer = ByteBuffer.allocate(2*4); // 2 times Integers
@@ -77,7 +77,7 @@ public class SocketClient {
int c2 = (c>>16)&0xffff; int c2 = (c>>16)&0xffff;
int d = buffer.getInt(); int d = buffer.getInt();
System.out.println(a+ " " +b1+ " " +b2+ " " + c1+ " " +c2+ " " +d ); System.out.println( a+ " " +b1+ " " +b2+ " " + c1+ " " +c2+ " " +d );
} }
out.close(); out.close();
@@ -26,8 +26,6 @@ import java.nio.ByteOrder;
/** /**
* Simple socket client to connect to the fdaq black box. * Simple socket client to connect to the fdaq black box.
* @author ebner
*
*/ */
public class SocketClientStop { public class SocketClientStop {
@@ -41,7 +39,8 @@ public class SocketClientStop {
*/ */
public static void main(String[] args) throws IOException, InterruptedException { public static void main(String[] args) throws IOException, InterruptedException {
Socket echoSocket = new Socket("localhost", 9998); // Socket echoSocket = new Socket("localhost", 9998);
Socket echoSocket = new Socket("localhost", 2234);
DataOutputStream out = new DataOutputStream(echoSocket.getOutputStream()); DataOutputStream out = new DataOutputStream(echoSocket.getOutputStream());
ByteBuffer bytebuffer = ByteBuffer.allocate(1*4); // 2 times Integers ByteBuffer bytebuffer = ByteBuffer.allocate(1*4); // 2 times Integers