diff --git a/deploy/packaging/debian/kernel.noarch b/deploy/packaging/debian/kernel.noarch
index 643d98e77f..7238981dce 100644
--- a/deploy/packaging/debian/kernel.noarch
+++ b/deploy/packaging/debian/kernel.noarch
@@ -31,10 +31,10 @@
./usr/local/mdsplus/pixmaps/mdstcl.png
./usr/local/mdsplus/pixmaps/small_mdsplus_logo.jpg
./usr/local/mdsplus/pixmaps/tdi.png
-./usr/local/mdsplus/rpm/mdsipd.xinetd
-./usr/local/mdsplus/rpm/mdsipsd.xinetd
./usr/local/mdsplus/rpm/mdsip.socket
./usr/local/mdsplus/rpm/mdsip@.service
+./usr/local/mdsplus/rpm/mdsipd.xinetd
+./usr/local/mdsplus/rpm/mdsipsd.xinetd
./usr/local/mdsplus/rpm/post_install_script
./usr/local/mdsplus/rpm/post_uninstall_script
./usr/local/mdsplus/rpm/python_module_install.sh
diff --git a/deploy/packaging/debian/rfxdevices.noarch b/deploy/packaging/debian/rfxdevices.noarch
index 30645a0a72..26befa1031 100644
--- a/deploy/packaging/debian/rfxdevices.noarch
+++ b/deploy/packaging/debian/rfxdevices.noarch
@@ -14,6 +14,7 @@
./usr/local/mdsplus/pydevices/RfxDevices/DEMOSTREAM.py
./usr/local/mdsplus/pydevices/RfxDevices/DIO2_ENCDEC.py
./usr/local/mdsplus/pydevices/RfxDevices/DIO4.py
+./usr/local/mdsplus/pydevices/RfxDevices/DTACQ_SUPERVISOR.py
./usr/local/mdsplus/pydevices/RfxDevices/ELPROBES_CFG.py
./usr/local/mdsplus/pydevices/RfxDevices/EPFE.py
./usr/local/mdsplus/pydevices/RfxDevices/EPFEM.py
@@ -27,6 +28,8 @@
./usr/local/mdsplus/pydevices/RfxDevices/MARTE.py
./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_COMPONENT.py
./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_CONVERSION.py
+./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_DTACQAI.py
+./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_DTACQAO.py
./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_DUTY_CYCLE.py
./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_EPICS_IN.py
./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_EPICS_OUT.py
diff --git a/deploy/packaging/redhat/kernel.noarch b/deploy/packaging/redhat/kernel.noarch
index 8e2f574781..f601a3b3c6 100644
--- a/deploy/packaging/redhat/kernel.noarch
+++ b/deploy/packaging/redhat/kernel.noarch
@@ -39,10 +39,10 @@
./usr/local/mdsplus/pixmaps/small_mdsplus_logo.jpg
./usr/local/mdsplus/pixmaps/tdi.png
./usr/local/mdsplus/rpm
-./usr/local/mdsplus/rpm/mdsipd.xinetd
-./usr/local/mdsplus/rpm/mdsipsd.xinetd
./usr/local/mdsplus/rpm/mdsip.socket
./usr/local/mdsplus/rpm/mdsip@.service
+./usr/local/mdsplus/rpm/mdsipd.xinetd
+./usr/local/mdsplus/rpm/mdsipsd.xinetd
./usr/local/mdsplus/rpm/post_install_script
./usr/local/mdsplus/rpm/post_uninstall_script
./usr/local/mdsplus/rpm/python_module_install.sh
diff --git a/deploy/packaging/redhat/rfxdevices.noarch b/deploy/packaging/redhat/rfxdevices.noarch
index 725f4cfaaf..f172750fe6 100644
--- a/deploy/packaging/redhat/rfxdevices.noarch
+++ b/deploy/packaging/redhat/rfxdevices.noarch
@@ -15,6 +15,7 @@
./usr/local/mdsplus/pydevices/RfxDevices/DEMOSTREAM.py
./usr/local/mdsplus/pydevices/RfxDevices/DIO2_ENCDEC.py
./usr/local/mdsplus/pydevices/RfxDevices/DIO4.py
+./usr/local/mdsplus/pydevices/RfxDevices/DTACQ_SUPERVISOR.py
./usr/local/mdsplus/pydevices/RfxDevices/ELPROBES_CFG.py
./usr/local/mdsplus/pydevices/RfxDevices/EPFE.py
./usr/local/mdsplus/pydevices/RfxDevices/EPFEM.py
@@ -28,6 +29,8 @@
./usr/local/mdsplus/pydevices/RfxDevices/MARTE.py
./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_COMPONENT.py
./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_CONVERSION.py
+./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_DTACQAI.py
+./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_DTACQAO.py
./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_DUTY_CYCLE.py
./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_EPICS_IN.py
./usr/local/mdsplus/pydevices/RfxDevices/MARTE2_EPICS_OUT.py
diff --git a/java/devicebeans/src/main/java/DeviceOutputs.java b/java/devicebeans/src/main/java/DeviceOutputs.java
index 20d959c67f..f4985dbb6d 100644
--- a/java/devicebeans/src/main/java/DeviceOutputs.java
+++ b/java/devicebeans/src/main/java/DeviceOutputs.java
@@ -214,7 +214,7 @@ protected void displayData(String data, boolean is_on)
}
}
}
-
+ public void setDisplayDimensions(boolean mode){}
protected String getData() {return null;}
protected boolean getState(){return true;}
diff --git a/java/jdevices/src/main/java/DTACQ_SUPERVISORSetup.java b/java/jdevices/src/main/java/DTACQ_SUPERVISORSetup.java
new file mode 100644
index 0000000000..9da52b6581
--- /dev/null
+++ b/java/jdevices/src/main/java/DTACQ_SUPERVISORSetup.java
@@ -0,0 +1,298 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/**
+ *
+ * @author mdsplus
+ */
+public class DTACQ_SUPERVISORSetup extends DeviceSetup {
+
+ /**
+ * Creates new form DTACQ_SUPERVISORSetup
+ */
+ public DTACQ_SUPERVISORSetup() {
+ initComponents();
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ deviceButtons1 = new DeviceButtons();
+ jPanel1 = new javax.swing.JPanel();
+ jPanel2 = new javax.swing.JPanel();
+ deviceField1 = new DeviceField();
+ deviceField2 = new DeviceField();
+ jPanel3 = new javax.swing.JPanel();
+ deviceField3 = new DeviceField();
+ deviceField4 = new DeviceField();
+ jTabbedPane1 = new javax.swing.JTabbedPane();
+ jPanel4 = new javax.swing.JPanel();
+ jPanel5 = new javax.swing.JPanel();
+ deviceField5 = new DeviceField();
+ jPanel6 = new javax.swing.JPanel();
+ deviceField6 = new DeviceField();
+ jPanel7 = new javax.swing.JPanel();
+ deviceField7 = new DeviceField();
+ deviceField8 = new DeviceField();
+ deviceField9 = new DeviceField();
+ jPanel8 = new javax.swing.JPanel();
+ jPanel9 = new javax.swing.JPanel();
+ deviceField10 = new DeviceField();
+ jPanel10 = new javax.swing.JPanel();
+ deviceField11 = new DeviceField();
+ deviceField12 = new DeviceField();
+ jPanel11 = new javax.swing.JPanel();
+ jPanel12 = new javax.swing.JPanel();
+ deviceField13 = new DeviceField();
+ jPanel13 = new javax.swing.JPanel();
+ deviceChoice1 = new DeviceChoice();
+ deviceChoice2 = new DeviceChoice();
+ deviceChoice3 = new DeviceChoice();
+ deviceChoice4 = new DeviceChoice();
+ jPanel14 = new javax.swing.JPanel();
+ jPanel15 = new javax.swing.JPanel();
+ deviceChoice5 = new DeviceChoice();
+ deviceField14 = new DeviceField();
+ deviceField17 = new DeviceField();
+ jPanel16 = new javax.swing.JPanel();
+ deviceField15 = new DeviceField();
+ deviceField16 = new DeviceField();
+
+ setDeviceProvider("localhost:8100");
+ setDeviceTitle("DTACQ Supervisor");
+ setDeviceType("DTACQ_SUPERVISOR");
+ setHeight(300);
+ setWidth(800);
+ getContentPane().add(deviceButtons1, java.awt.BorderLayout.PAGE_END);
+
+ jPanel1.setLayout(new java.awt.GridLayout(2, 1));
+
+ deviceField1.setIdentifier("");
+ deviceField1.setLabelString("IP Address: ");
+ deviceField1.setNumCols(20);
+ deviceField1.setOffsetNid(1);
+ deviceField1.setTextOnly(true);
+ jPanel2.add(deviceField1);
+
+ deviceField2.setIdentifier("");
+ deviceField2.setLabelString("UDP gateway: ");
+ deviceField2.setNumCols(20);
+ deviceField2.setOffsetNid(3);
+ deviceField2.setTextOnly(true);
+ jPanel2.add(deviceField2);
+
+ jPanel1.add(jPanel2);
+
+ deviceField3.setIdentifier("");
+ deviceField3.setLabelString("UDP Address: ");
+ deviceField3.setNumCols(20);
+ deviceField3.setOffsetNid(2);
+ deviceField3.setTextOnly(true);
+ jPanel3.add(deviceField3);
+
+ deviceField4.setIdentifier("");
+ deviceField4.setLabelString("UDP Port: ");
+ deviceField4.setNumCols(6);
+ deviceField4.setOffsetNid(4);
+ jPanel3.add(deviceField4);
+
+ jPanel1.add(jPanel3);
+
+ getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_START);
+
+ jPanel4.setLayout(new java.awt.GridLayout(3, 1));
+
+ deviceField5.setIdentifier("");
+ deviceField5.setLabelString("Realtime MARTe2 AI device:");
+ deviceField5.setNumCols(30);
+ deviceField5.setOffsetNid(5);
+ jPanel5.add(deviceField5);
+
+ jPanel4.add(jPanel5);
+
+ deviceField6.setIdentifier("");
+ deviceField6.setLabelString("Bulk MARTe2 AI device: ");
+ deviceField6.setNumCols(30);
+ deviceField6.setOffsetNid(6);
+ jPanel6.add(deviceField6);
+
+ jPanel4.add(jPanel6);
+
+ deviceField7.setIdentifier("");
+ deviceField7.setLabelString("AI Sites: ");
+ deviceField7.setOffsetNid(7);
+ jPanel7.add(deviceField7);
+
+ deviceField8.setIdentifier("");
+ deviceField8.setLabelString("AI Channels: ");
+ deviceField8.setOffsetNid(8);
+ jPanel7.add(deviceField8);
+
+ deviceField9.setIdentifier("");
+ deviceField9.setLabelString("SPAD Size (Bytes): ");
+ deviceField9.setOffsetNid(9);
+ jPanel7.add(deviceField9);
+
+ jPanel4.add(jPanel7);
+
+ jTabbedPane1.addTab("AI", jPanel4);
+
+ jPanel8.setLayout(new java.awt.GridLayout(2, 1));
+
+ deviceField10.setIdentifier("");
+ deviceField10.setLabelString("MARTe2 AO device: ");
+ deviceField10.setNumCols(30);
+ deviceField10.setOffsetNid(10);
+ jPanel9.add(deviceField10);
+
+ jPanel8.add(jPanel9);
+
+ deviceField11.setIdentifier("");
+ deviceField11.setLabelString("AO Sites: ");
+ deviceField11.setOffsetNid(11);
+ jPanel10.add(deviceField11);
+
+ deviceField12.setIdentifier("");
+ deviceField12.setLabelString("AO Channels: ");
+ deviceField12.setOffsetNid(12);
+ jPanel10.add(deviceField12);
+
+ jPanel8.add(jPanel10);
+
+ jTabbedPane1.addTab("AO", jPanel8);
+
+ jPanel11.setLayout(new java.awt.GridLayout(2, 1));
+
+ deviceField13.setIdentifier("");
+ deviceField13.setLabelString("DIO Site: ");
+ deviceField13.setOffsetNid(13);
+ jPanel12.add(deviceField13);
+
+ jPanel11.add(jPanel12);
+
+ deviceChoice1.setChoiceItems(new String[] {"INPUT", "OUTPUT"});
+ deviceChoice1.setIdentifier("");
+ deviceChoice1.setLabelString("DIO Byte 1: ");
+ deviceChoice1.setOffsetNid(19);
+ deviceChoice1.setUpdateIdentifier("");
+ jPanel13.add(deviceChoice1);
+
+ deviceChoice2.setChoiceItems(new String[] {"INPUT", "OUTPUT"});
+ deviceChoice2.setIdentifier("");
+ deviceChoice2.setLabelString("DIO Byte 2: ");
+ deviceChoice2.setOffsetNid(20);
+ deviceChoice2.setUpdateIdentifier("");
+ jPanel13.add(deviceChoice2);
+
+ deviceChoice3.setChoiceItems(new String[] {"INPUT", "OUTPUT"});
+ deviceChoice3.setIdentifier("");
+ deviceChoice3.setLabelString("DIO Byte 3: ");
+ deviceChoice3.setOffsetNid(21);
+ deviceChoice3.setUpdateIdentifier("");
+ jPanel13.add(deviceChoice3);
+
+ deviceChoice4.setChoiceItems(new String[] {"INPUT", "OUTPUT"});
+ deviceChoice4.setIdentifier("");
+ deviceChoice4.setLabelString("DIO Byte 4: ");
+ deviceChoice4.setOffsetNid(22);
+ deviceChoice4.setUpdateIdentifier("");
+ jPanel13.add(deviceChoice4);
+
+ jPanel11.add(jPanel13);
+
+ jTabbedPane1.addTab("DIO", jPanel11);
+
+ jPanel14.setLayout(new java.awt.GridLayout(2, 1));
+
+ deviceChoice5.setChoiceItems(new String[] {"INTERNAL", "EXTERNAL"});
+ deviceChoice5.setIdentifier("");
+ deviceChoice5.setLabelString("Clock Mode: ");
+ deviceChoice5.setOffsetNid(14);
+ deviceChoice5.setUpdateIdentifier("");
+ jPanel15.add(deviceChoice5);
+
+ deviceField14.setIdentifier("");
+ deviceField14.setLabelString("Clock Freq. :");
+ deviceField14.setNumCols(15);
+ deviceField14.setOffsetNid(15);
+ jPanel15.add(deviceField14);
+
+ deviceField17.setIdentifier("");
+ deviceField17.setLabelString("UDP Clock Division: ");
+ deviceField17.setOffsetNid(16);
+ jPanel15.add(deviceField17);
+
+ jPanel14.add(jPanel15);
+
+ deviceField15.setIdentifier("");
+ deviceField15.setLabelString("Ext. Clock Freq: ");
+ deviceField15.setNumCols(15);
+ deviceField15.setOffsetNid(17);
+ jPanel16.add(deviceField15);
+
+ deviceField16.setIdentifier("");
+ deviceField16.setLabelString("Trigger: ");
+ deviceField16.setNumCols(20);
+ deviceField16.setOffsetNid(18);
+ jPanel16.add(deviceField16);
+
+ jPanel14.add(jPanel16);
+
+ jTabbedPane1.addTab("Clock/Trigger", jPanel14);
+
+ getContentPane().add(jTabbedPane1, java.awt.BorderLayout.CENTER);
+ }// //GEN-END:initComponents
+
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private DeviceButtons deviceButtons1;
+ private DeviceChoice deviceChoice1;
+ private DeviceChoice deviceChoice2;
+ private DeviceChoice deviceChoice3;
+ private DeviceChoice deviceChoice4;
+ private DeviceChoice deviceChoice5;
+ private DeviceField deviceField1;
+ private DeviceField deviceField10;
+ private DeviceField deviceField11;
+ private DeviceField deviceField12;
+ private DeviceField deviceField13;
+ private DeviceField deviceField14;
+ private DeviceField deviceField15;
+ private DeviceField deviceField16;
+ private DeviceField deviceField17;
+ private DeviceField deviceField2;
+ private DeviceField deviceField3;
+ private DeviceField deviceField4;
+ private DeviceField deviceField5;
+ private DeviceField deviceField6;
+ private DeviceField deviceField7;
+ private DeviceField deviceField8;
+ private DeviceField deviceField9;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JPanel jPanel10;
+ private javax.swing.JPanel jPanel11;
+ private javax.swing.JPanel jPanel12;
+ private javax.swing.JPanel jPanel13;
+ private javax.swing.JPanel jPanel14;
+ private javax.swing.JPanel jPanel15;
+ private javax.swing.JPanel jPanel16;
+ private javax.swing.JPanel jPanel2;
+ private javax.swing.JPanel jPanel3;
+ private javax.swing.JPanel jPanel4;
+ private javax.swing.JPanel jPanel5;
+ private javax.swing.JPanel jPanel6;
+ private javax.swing.JPanel jPanel7;
+ private javax.swing.JPanel jPanel8;
+ private javax.swing.JPanel jPanel9;
+ private javax.swing.JTabbedPane jTabbedPane1;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/java/jdevices/src/main/java/MARTE2_DTACQAISetup.java b/java/jdevices/src/main/java/MARTE2_DTACQAISetup.java
new file mode 100644
index 0000000000..4913de9f2d
--- /dev/null
+++ b/java/jdevices/src/main/java/MARTE2_DTACQAISetup.java
@@ -0,0 +1,76 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/**
+ *
+ * @author mdsplus
+ */
+public class MARTE2_DTACQAISetup extends DeviceSetup {
+
+ /**
+ * Creates new form MARTE2_DTACQAISetup
+ */
+ public MARTE2_DTACQAISetup() {
+ initComponents();
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ deviceButtons1 = new DeviceButtons();
+ jPanel1 = new javax.swing.JPanel();
+ deviceField1 = new DeviceField();
+ deviceField2 = new DeviceField();
+ deviceField3 = new DeviceField();
+ deviceOutputs2 = new DeviceOutputs();
+
+ setDeviceProvider("localhost:8100");
+ setDeviceTitle("MARTe2 DTACQAI");
+ setDeviceType("MARTE2_DTACQAI");
+ setHeight(400);
+ setWidth(800);
+ getContentPane().add(deviceButtons1, java.awt.BorderLayout.PAGE_END);
+
+ deviceField1.setIdentifier("");
+ deviceField1.setLabelString("Acq CPU Mask: ");
+ deviceField1.setNumCols(8);
+ deviceField1.setOffsetNid(40);
+ jPanel1.add(deviceField1);
+
+ deviceField2.setIdentifier("");
+ deviceField2.setLabelString("Storage CPU Mask: ");
+ deviceField2.setNumCols(8);
+ deviceField2.setOffsetNid(50);
+ jPanel1.add(deviceField2);
+
+ deviceField3.setIdentifier("");
+ deviceField3.setLabelString("Samples: ");
+ deviceField3.setNumCols(6);
+ deviceField3.setOffsetNid(43);
+ jPanel1.add(deviceField3);
+
+ getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_START);
+
+ deviceOutputs2.setDisplayDimensions(true);
+ getContentPane().add(deviceOutputs2, java.awt.BorderLayout.CENTER);
+ }// //GEN-END:initComponents
+
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private DeviceButtons deviceButtons1;
+ private DeviceField deviceField1;
+ private DeviceField deviceField2;
+ private DeviceField deviceField3;
+ private DeviceOutputs deviceOutputs2;
+ private javax.swing.JPanel jPanel1;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/java/jdevices/src/main/java/MARTE2_DTACQAOSetup.java b/java/jdevices/src/main/java/MARTE2_DTACQAOSetup.java
new file mode 100644
index 0000000000..8d3d980c08
--- /dev/null
+++ b/java/jdevices/src/main/java/MARTE2_DTACQAOSetup.java
@@ -0,0 +1,60 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/**
+ *
+ * @author mdsplus
+ */
+public class MARTE2_DTACQAOSetup extends DeviceSetup {
+
+ /**
+ * Creates new form MARTE2_DTACQAOSetup
+ */
+ public MARTE2_DTACQAOSetup() {
+ initComponents();
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ deviceButtons1 = new DeviceButtons();
+ deviceInputs1 = new DeviceInputs();
+ jPanel1 = new javax.swing.JPanel();
+ deviceField1 = new DeviceField();
+
+ setDeviceProvider("localhost:8100");
+ setDeviceTitle("MARTE2_DTACQAO Setup");
+ setDeviceType("MARTE2_DTACQAO");
+ setHeight(400);
+ setWidth(500);
+ getContentPane().add(deviceButtons1, java.awt.BorderLayout.PAGE_END);
+
+ deviceInputs1.setOffsetNid(20);
+ getContentPane().add(deviceInputs1, java.awt.BorderLayout.CENTER);
+
+ deviceField1.setIdentifier("");
+ deviceField1.setLabelString("Timebase: ");
+ deviceField1.setNumCols(25);
+ deviceField1.setOffsetNid(3);
+ jPanel1.add(deviceField1);
+
+ getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_START);
+ }// //GEN-END:initComponents
+
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private DeviceButtons deviceButtons1;
+ private DeviceField deviceField1;
+ private DeviceInputs deviceInputs1;
+ private javax.swing.JPanel jPanel1;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/java/jdevices/src/main/resources/DTACQ_SUPERVISORSetup.form b/java/jdevices/src/main/resources/DTACQ_SUPERVISORSetup.form
new file mode 100644
index 0000000000..dd2d4570c1
--- /dev/null
+++ b/java/jdevices/src/main/resources/DTACQ_SUPERVISORSetup.form
@@ -0,0 +1,394 @@
+
+
+
diff --git a/java/jdevices/src/main/resources/MARTE2_DTACQAISetup.form b/java/jdevices/src/main/resources/MARTE2_DTACQAISetup.form
new file mode 100644
index 0000000000..dd5640fb8d
--- /dev/null
+++ b/java/jdevices/src/main/resources/MARTE2_DTACQAISetup.form
@@ -0,0 +1,84 @@
+
+
+
diff --git a/java/jdevices/src/main/resources/MARTE2_DTACQAOSetup.form b/java/jdevices/src/main/resources/MARTE2_DTACQAOSetup.form
new file mode 100644
index 0000000000..66f38d26f2
--- /dev/null
+++ b/java/jdevices/src/main/resources/MARTE2_DTACQAOSetup.form
@@ -0,0 +1,68 @@
+
+
+
diff --git a/pydevices/RfxDevices/DTACQ_SUPERVISOR.py b/pydevices/RfxDevices/DTACQ_SUPERVISOR.py
new file mode 100644
index 0000000000..f48a597bfa
--- /dev/null
+++ b/pydevices/RfxDevices/DTACQ_SUPERVISOR.py
@@ -0,0 +1,413 @@
+from MDSplus import mdsExceptions, Device, Data, Range, makeArray, Int32, Int32Array, Float64, Float64Array, String
+try:
+ import acq400_hapi
+except:
+ pass
+import socket
+import os
+
+class DTACQ_SUPERVISOR(Device):
+ """DTACQ device supervisor"""
+ parts = [
+ {'path': ':IP_ADDR', 'type': 'text'},
+ {'path': ':UDP_ADDR', 'type': 'text'},
+ {'path': ':UDP_GATEWAY', 'type': 'text'},
+ {'path': ':UDP_PORT', 'type': 'numeric', 'value': 53676},
+ {'path': ':AI_R_DEVICE', 'type': 'numeric'},
+ {'path': ':AI_B_DEVICE', 'type': 'numeric'},
+ {'path': ':AI_SITES', 'type': 'numeric', 'value': Int32Array([1,2])},
+ {'path': ':AI_CHANS', 'type': 'numeric', 'value': Int32Array([32,32])},
+ {'path': ':SPAD_SIZE', 'type': 'numeric', 'value': 16},
+ {'path': ':AO_DEVICE', 'type': 'numeric'},
+ {'path': ':AO_SITES', 'type': 'numeric', 'value': Int32Array([3])},
+ {'path': ':AO_CHANS', 'type': 'numeric', 'value': Int32Array([32])},
+ {'path': ':DIO_SITE', 'type': 'numeric', 'value': 6},
+ {'path': ':CLOCK_MODE', 'type': 'text', 'value': 'INTERNAL'},
+ {'path': ':CLOCK_FREQ', 'type': 'numeric', 'value': 10000},
+ {'path': ':CLOCK_DIV', 'type': 'numeric', 'value': 10},
+ {'path': ':EXT_CK_FREQ', 'type': 'numeric', 'value': 10000},
+ {'path': ':TRIGGER', 'type': 'numeric', 'value': 0},
+ {'path': ':DIO_BYTE1', 'type': 'text', 'value': 'INPUT'},
+ {'path': ':DIO_BYTE2', 'type': 'text', 'value': 'INPUT'},
+ {'path': ':DIO_BYTE3', 'type': 'text', 'value': 'INPUT'},
+ {'path': ':DIO_BYTE4', 'type': 'text', 'value': 'INPUT'},
+ {'path': ':INIT', 'type': 'action',
+ 'valueExpr': "Action(Dispatch('MARTE_SERVER','INIT',50,None),Method(None,'init',head))",
+ 'options': ('no_write_shot',)}]
+
+
+ class Args:
+ def __init__(self, netmask, tx_ip, rx_ip, gw, port, run0, play0, broadcast = 0, disco = None, hudp_relay = None,
+ spp = 1, hudp_decim = 1):
+
+ self.netmask = netmask
+ self.tx_ip = tx_ip
+ self.rx_ip = rx_ip
+ self.gw = gw
+ self.port = port
+ self.run0 = run0
+ self.play0 = play0
+ self.broadcast = broadcast
+ self.disco = disco
+ self.hudp_relay = hudp_relay
+ self.spp = spp
+ self.hudp_decim = hudp_decim
+
+# INIT
+ def init(self):
+ import hudp_setup
+ print('INIT')
+ try:
+ ipAddr = self.ip_addr.data()
+ except:
+ print('Cannot get IP Address')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+
+ try:
+ uut = acq400_hapi.factory(ipAddr)
+ #uut = acq400.Acq400(ipAddr)
+ except:
+ print('Cannot connect to '+ipAddr)
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+
+ try:
+ triggerTime = self.trigger.data()
+ except:
+ print('Cannot read trigger time')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+
+ try:
+ udpAddress = self.udp_addr.data()
+ except:
+ print('Cannot read UDP address')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+ try:
+ udpGateway = self.udp_gateway.data()
+ except:
+ print('Cannot read UDP gateway')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+ try:
+ udpPort = self.udp_port.data()
+ except:
+ print('Cannot read UDP port')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+
+ try:
+ clockMode = self.clock_mode.data()
+ except:
+ print('Cannot read Clock Mode')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+ if(clockMode != 'INTERNAL') and (clockMode != 'EXTERNAL'):
+ print('Invalid clock mode: '+clockMode +' must be either INTERNAL or EXTERNAL')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+
+ try:
+ aiSites = self.ai_sites.data()
+ except:
+ print('Cannot read AI sites')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+ try:
+ l = len(aiSites)
+ except:
+ aiSites = [aiSites]
+
+ try:
+ aiChans = self.ai_chans.data()
+ except:
+ print('Cannot read AI Chans')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+ try:
+ l = len(aiChans)
+ except:
+ aiChans = [aiChans]
+
+ if len(aiSites) != len(aiChans):
+ print("AI sites and AI Chans must be of the same length")
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+
+ try:
+ aoSites = self.ao_sites.data()
+ except:
+ print('No AO sites defined, AO will be skipped')
+ aoSites = []
+ try:
+ l = len(aoSites)
+ except:
+ aoSites = [aoSites]
+ if len(aoSites) > 0:
+ try:
+ aoChans = self.ao_chans.data()
+ except:
+ print('Cannot read AO channels')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+ try:
+ l = len(aoChans)
+ except:
+ aoChans = [aoChans]
+ if len(aoSites) != len(aoChans):
+ print("AO sites and AO Chans must be of the same length "+str(len(aoSites)) + ", " +str(len(aoChans)))
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+ try:
+ dioSite = self.dio_site.data()
+ except:
+ print('No DIO modulee defined')
+ dioSite = -1
+ numDis = 0
+ numDos = 0
+ if dioSite > 0:
+ if self.dio_byte1.data() == 'INPUT' or self.dio_byte2.data() == 'INPUT' or self.dio_byte3.data() == 'INPUT' or self.dio_byte4.data() == 'INPUT':
+ numDis = 1
+ else:
+ numDis = 0
+ if self.dio_byte1.data() == 'OUTPUT' or self.dio_byte2.data() == 'OUTPUT' or self.dio_byte4.data() == 'OUTPUT' or self.dio_byte4.data() == 'OUTPUT':
+ numDos = 1
+ else:
+ numDos = 0
+ try:
+ spadSize = self.spad_size.data()
+ except:
+ print('Cannot read SPAD size')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+
+
+ try:
+ clockFreq = self.clock_freq.data()
+ except:
+ print('Cannot read clock frequency')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+ try:
+ freqDiv = self.clock_div.data()
+ except:
+ print('Cannot read clock division')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+ if clockMode == 'INTERNAL':
+ uut.s0.sync_role = 'master ' + str(int(clockFreq))
+ else:
+ try:
+ extClockFreq = self.ext_ck_freq.data()
+ except:
+ extClockFreq = clockFreq
+ uut.s0.sync_role = 'fpmaster '+str(int(clockFreq) + ' '+str(int(extClockFreq)))
+
+ uut.s0.transient='SOFT_TRIGGER=0'
+ uut.s0.spad1_us='1,1,1'
+ uut.s0.spad1_us_clk_src='0'
+ direction = ''
+ if self.dio_byte1.data() == 'OUTPUT':
+ direction += '1,'
+ else:
+ direction += '0,'
+ if self.dio_byte2.data() == 'OUTPUT':
+ direction += '1,'
+ else:
+ direction += '0,'
+ if self.dio_byte3.data() == 'OUTPUT':
+ direction += '1,'
+ else:
+ direction += '0,'
+ if self.dio_byte4.data() == 'OUTPUT':
+ direction += '1'
+ else:
+ direction += '0'
+
+ if dioSite > 0:
+ getattr(uut, 's'+str(dioSite)).byte_is_output = direction
+
+
+ if len(aiSites > 0):
+ offsTxt = []
+ calsTxt = []
+ for i in range(len(aiSites)):
+ offsTxt.append(getattr(uut, 's'+str(aiSites[i])).AI_CAL_EOFF)
+ calsTxt.append(getattr(uut, 's'+str(aiSites[i])).AI_CAL_ESLO)
+ offs = []
+ cals = []
+ for offTxt in offsTxt:
+ currS = offTxt.split()
+ for i in range(3, len(currS)):
+ offs.append(float(currS[i]))
+
+ for calTxt in calsTxt:
+ currS = calTxt.split()
+ for i in range(3, len(currS)):
+ cals.append(float(currS[i]))
+
+ hasRealtimeAi = False
+ hasBulkAi = False
+ try:
+ dtackAi = self.ai_b_device.getData()
+ hasBulkAi = True
+ dtackAi.parameters_par_1_value.putData(Float64(clockFreq))
+ dtackAi.parameters_par_2_value.putData(Float64(triggerTime))
+ dtackAi.parameters_par_3_value.putData(Int32(1))
+ dtackAi.parameters_par_4_value.putData(len(aiSites))
+ dtackAi.parameters_par_5_value.putData(Int32(numDis))
+ dtackAi.parameters_par_6_value.putData(Int32Array(aiChans))
+ dtackAi.parameters_par_7_value.putData(Float64Array(cals))
+ dtackAi.parameters_par_8_value.putData(Float64Array(offs))
+ dtackAi.parameters_par_9_value.putData(String(ipAddr))
+ dtackAi.parameters_par_10_value.putData(Int32(4210))
+ dtackAi.parameters_par_12_value.putData(Int32(spadSize))
+ except:
+ print('No Bulk AI MARTe2 device')
+
+ try:
+ dtackAi = self.ai_r_device.getData()
+ hasRealtimeAi = True
+ try :
+ freqDivision = self.clock_div.data()
+ except:
+ print('Frequency division not defined for realtime device')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+
+ dtackAi.parameters_par_1_value.putData(Float64(clockFreq/freqDiv))
+ dtackAi.parameters_par_2_value.putData(Float64(triggerTime))
+ dtackAi.parameters_par_3_value.putData(Int32(2))
+ dtackAi.parameters_par_4_value.putData(len(aiSites))
+ dtackAi.parameters_par_5_value.putData(Int32(numDis))
+ dtackAi.parameters_par_6_value.putData(Int32Array(aiChans))
+ dtackAi.parameters_par_7_value.putData(Float64Array(cals))
+ dtackAi.parameters_par_8_value.putData(Float64Array(offs))
+ dtackAi.parameters_par_9_value.putData(String(udpAddress))
+ dtackAi.parameters_par_10_value.putData(Int32(udpPort))
+ dtackAi.parameters_par_12_value.putData(Int32(spadSize))
+ dtackAi.parameters_par_14_value.putData(Int32(freqDivision))
+ except:
+ print('No Realtime AI MARTe2 device')
+
+ st = ''
+ for i in range(len(aiSites)):
+ st += str(aiSites[i])
+ if i < len(aiSites) - 1:
+ st += ','
+ if numDis > 0:
+ st += ','+str(dioSite)
+# st += ' 1,'+str(spadSize)+',0'
+ st += ' 1,'+str(spadSize/4)+',0'
+ if hasRealtimeAi:
+ args = self.Args('255.255.255.0', udpAddress, socket.gethostbyname(socket.gethostname()), udpGateway, udpPort, st, '', hudp_decim = freqDiv)
+ self.config_tx_uut(uut, args)
+ if hasBulkAi:
+ print("BULK ")
+ print(st)
+ uut.s0.run0 = st
+
+ #endif len(aiSites) > 0
+ if len(aoSites) > 0: #There are Outputs
+ try:
+ dtackAo = self.ao_device.getData()
+ except:
+ print('Cannot fine MARTE2_TACQAO device')
+ raise mdsExceptions.TclFAILED_ESSENTIAL
+ dtackAo.parameters_par_1_value.putData(Int32(len(aoSites)))
+ dtackAo.parameters_par_2_value.putData(Int32(numDos))
+ dtackAo.parameters_par_3_value.putData(Int32Array(aoChans))
+ dtackAo.parameters_par_4_value.putData(udpAddress)
+ dtackAo.parameters_par_5_value.putData(Int32(udpPort))
+
+ st = ''
+ for i in range(len(aoSites)):
+ st += str(aoSites[i])
+ if i < len(aoSites) - 1:
+ st += ','
+ if numDos > 0:
+ st += ','+str(dioSite)
+ st += ' 0'
+
+ args = self.Args('255.255.255.0', socket.gethostbyname(socket.gethostname()), udpAddress, udpGateway, udpPort, '', st)
+ self.config_rx_uut(uut, args)
+
+####################HUDP_SEUP Stuff
+
+
+ def hudp_init(self, args, uut, ip):
+ uut.s10.tx_ctrl = 9
+ uut.s10.ip = ip
+ uut.s10.gw = args.gw
+ uut.s10.netmask = args.netmask
+ if args.disco is not None:
+ print("enable disco at {}".format(args.disco))
+ uut.s10.disco_idx = args.disco
+ uut.s10.disco_en = 1
+ else:
+ uut.s10.disco_en = 0
+
+ def hudp_enable(self, uut):
+ uut.s10.tx_ctrl = 1
+
+ def ip_broadcast(self, args):
+ ip_dest = args.rx_ip.split('.')
+ nm = args.netmask.split('.')
+
+ for ii in range(3,0,-1):
+ if nm[ii] != '0':
+ break
+ else:
+ ip_dest[ii] = '255'
+
+ return '.'.join(ip_dest)
+
+ MTU = 1400
+
+ # tx: XI : AI, DI
+ def config_tx_uut(self, txuut, args):
+ print("txuut {}".format(txuut.uut))
+ print(args.run0)
+ if args.run0 != 'notouch':
+ txuut.s0.run0 = args.run0
+ self.hudp_init(args, txuut, args.tx_ip)
+ txuut.s10.hudp_decim = args.hudp_decim
+ txuut.s10.src_port = args.port
+ txuut.s10.dst_port = args.port
+ txuut.s10.dst_ip = args.rx_ip if args.broadcast == 0 else ip_broadcast(args)
+
+ if args.hudp_relay is not None:
+ txuut.s10.udp_data_src = 1
+ tx_ssb = int(txuut.s0.dssb) - args.hudp_relay
+ txuut.s10.slice_len = tx_ssb//4
+ txuut.s10.slice_off = args.hudp_relay//4
+ else:
+ txuut.s10.udp_data_src = 0
+ tx_ssb = int(txuut.s0.ssb)
+
+ txuut.s10.tx_sample_sz = tx_ssb
+ txuut.s10.tx_spp = args.spp
+ tx_pkt_sz = tx_ssb*args.spp # compute tx pkt sz and check bounds
+ if tx_pkt_sz > self.MTU:
+ print("ERROR packet length {} exceeds MTU {}".format(tx_pkt_sz, self.MTU))
+ self.hudp_enable(txuut)
+ tx_calc_pkt_sz = int(txuut.s10.tx_calc_pkt_sz) # actual tx pkt sz computed by FPGA logic.
+ if tx_pkt_sz != tx_calc_pkt_sz:
+ print("ERROR: set tx_pkt_size {} actual tx_pkt_size {}".format(tx_pkt_sz, tx_calc_pkt_sz))
+ print("TX configured. ssb:{} spp:{} tx_pkt_size {}".format(tx_ssb, args.spp, tx_pkt_sz))
+
+ # rx: XO : AO, DO
+ def config_rx_uut(self, rxuut, args):
+ print("rxuut {}".format(rxuut.uut))
+
+ if args.play0 != 'notouch':
+ rxuut.s0.play0 = args.play0
+ rxuut.s0.distributor = 'comms=U off'
+ rxuut.s0.distributor = 'on'
+
+ self.hudp_init(args, rxuut, args.rx_ip)
+ rxuut.s10.rx_src_ip = args.tx_ip
+ rxuut.s10.rx_port = args.port
+ self.hudp_enable(rxuut)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pydevices/RfxDevices/MARTE2_DTACQAI.py b/pydevices/RfxDevices/MARTE2_DTACQAI.py
new file mode 100644
index 0000000000..9689b01bc1
--- /dev/null
+++ b/pydevices/RfxDevices/MARTE2_DTACQAI.py
@@ -0,0 +1,70 @@
+#
+# Copyright (c) 2017, Massachusetts Institute of Technology All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# Redistributions of source code must retain the above copyright notice, this
+# list of conditions and the following disclaimer.
+#
+# Redistributions in binary form must reproduce the above copyright notice, this
+# list of conditions and the following disclaimer in the documentation and/or
+# other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+from MDSplus import Data
+MC = __import__('MARTE2_COMPONENT', globals())
+
+
+@MC.BUILDER('DTACQAI', MC.MARTE2_COMPONENT.MODE_SYNCH_INPUT)
+class MARTE2_DTACQAI(MC.MARTE2_COMPONENT):
+ outputs = [
+ {'name': 'Counter', 'type': 'uint32', 'dimensions': 0, 'parameters': []},
+ {'name': 'Time', 'type': 'uint32', 'dimensions': 0, 'parameters': []}]
+ for i in range(64):
+ outputs += [
+ {'name': 'CHAN_'+str(i+1), 'type': 'float64', 'dimensions': -1, 'parameters': [
+ {'name': 'ChannelId', 'type': 'int', 'value': 0},]}]
+ for i in range(32):
+ outputs += [
+ {'name': 'DI_'+str(i+1), 'type': 'uint8', 'dimensions': -1, 'parameters': [
+ {'name': 'ChannelId', 'type': 'int', 'value': 0},]}]
+ parameters = [
+ {'name': 'SamplingFrequency', 'type': 'float64', 'value': 1E3},
+ {'name': 'TriggerTime', 'type': 'float64', 'value': 0},
+ {'name': 'Mode', 'type': 'int32', 'value': 2},
+ {'name': 'NumAdc', 'type': 'int32', 'value': 0},
+ {'name': 'NumDi', 'type': 'int32', 'value': 0},
+ {'name': 'NumAiChans', 'type': 'int32'},
+ {'name': 'CalGains', 'type': 'int32'},
+ {'name': 'CalOffsets', 'type': 'int32'},
+ {'name': 'IpAddress', 'type': 'string'},
+ {'name': 'Port', 'type': 'int32'},
+ {'name': 'CPUs', 'type': 'int32', 'value': 0xf},
+ {'name': 'SpadSize', 'type': 'int32', 'value': 64},
+ {'name': 'NumSamples', 'type': 'int32', 'value': 1},
+ {'name': 'FreqDivision', 'type': 'int32', 'value': 1},
+ ]
+ parts = []
+
+ def prepareMarteInfo(self):
+ print('0:1000000 :1. / (build_path("\\'+self.getFullPath()+'.parameters:par_1:value"))')
+ self.timebase.putData(Data.compile('0:1000000 : 1. / (build_path("\\'+self.getFullPath()+'.parameters:par_1:value"))'))
+ self.outputs_time_samples.putData(self.parameters_par_13_value.data())
+ self.outputs_counter_samples.putData(self.parameters_par_13_value.data())
+ for i in range(64):
+ getattr(self, 'outputs_chan_'+str(i+1)+'_samples').putData(self.parameters_par_13_value.data())
+ for i in range(32):
+ getattr(self, 'outputs_di_'+str(i+1)+'_samples').putData(self.parameters_par_13_value.data())
+
diff --git a/pydevices/RfxDevices/MARTE2_DTACQAO.py b/pydevices/RfxDevices/MARTE2_DTACQAO.py
new file mode 100644
index 0000000000..c6fe14a5cd
--- /dev/null
+++ b/pydevices/RfxDevices/MARTE2_DTACQAO.py
@@ -0,0 +1,51 @@
+#
+# Copyright (c) 2017, Massachusetts Institute of Technology All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# Redistributions of source code must retain the above copyright notice, this
+# list of conditions and the following disclaimer.
+#
+# Redistributions in binary form must reproduce the above copyright notice, this
+# list of conditions and the following disclaimer in the documentation and/or
+# other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+from MDSplus import Data
+MC = __import__('MARTE2_COMPONENT', globals())
+
+
+@MC.BUILDER('DTACQAO', MC.MARTE2_COMPONENT.MODE_OUTPUT)
+class MARTE2_DTACQAO(MC.MARTE2_COMPONENT):
+ inputs = []
+ for i in range(32):
+ inputs += [
+ {'name': 'CHAN_'+str(i+1), 'type': 'float64', 'dimensions': 0, 'parameters': [
+ {'name': 'ChannelId', 'type': 'int', 'value': i},]}]
+ for i in range(32):
+ inputs += [
+ {'name': 'DO_'+str(i+1), 'type': 'uint8', 'dimensions': 0, 'parameters': [
+ {'name': 'ChannelId', 'type': 'int', 'value': i},]}]
+ parameters = [
+ {'name': 'NumDac', 'type': 'int32', 'value': 0},
+ {'name': 'NumDo', 'type': 'int32', 'value': 0},
+ {'name': 'NumAoChans', 'type': 'int32'},
+ {'name': 'IpAddress', 'type': 'string'},
+ {'name': 'Port', 'type': 'int32'},
+ ]
+ parts = []
+
+ def prepareMarteInfo(self):
+ pass
\ No newline at end of file