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