Merge pull request #79 from slsdetectorgroup/bursts

Bursts
This commit is contained in:
Dhanya Thattil 2020-02-26 11:29:05 +01:00 committed by GitHub
commit 300b0c8105
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 1122 additions and 352 deletions

View File

@ -371,101 +371,6 @@ p, li { white-space: pre-wrap; }
</property> </property>
</widget> </widget>
</widget> </widget>
<action name="actionOpenSetup">
<property name="text">
<string>&amp;Load &amp;Setup</string>
</property>
<property name="font">
<font/>
</property>
</action>
<action name="actionSaveSetup">
<property name="text">
<string>&amp;Save &amp;Setup</string>
</property>
<property name="font">
<font/>
</property>
</action>
<action name="actionMeasurementWizard">
<property name="text">
<string>&amp;Measurement Wizard</string>
</property>
</action>
<action name="actionOpenConfiguration">
<property name="text">
<string>&amp;Load &amp;Configuration</string>
</property>
</action>
<action name="actionSaveConfiguration">
<property name="text">
<string>&amp;Save &amp;Configuration</string>
</property>
</action>
<action name="actionEnergyCalibration">
<property name="text">
<string>&amp;Energy Calibration</string>
</property>
</action>
<action name="actionAngularCalibration">
<property name="text">
<string>&amp;Angular Calibration</string>
</property>
</action>
<action name="actionDebug">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Debug</string>
</property>
</action>
<action name="actionBeamline">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Beamline</string>
</property>
</action>
<action name="actionExpert">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Expert</string>
</property>
</action>
<action name="actionConfiguration">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Configuration</string>
</property>
</action>
<action name="actionVersion">
<property name="text">
<string>&amp;Version</string>
</property>
</action>
<action name="actionAbout">
<property name="text">
<string>&amp;About</string>
</property>
</action>
<action name="actionLoadConfiguration"> <action name="actionLoadConfiguration">
<property name="text"> <property name="text">
<string>Load Configuration</string> <string>Load Configuration</string>
@ -476,6 +381,11 @@ p, li { white-space: pre-wrap; }
<string>Load Trimbits</string> <string>Load Trimbits</string>
</property> </property>
</action> </action>
<action name="actionLoadParameters">
<property name="text">
<string>Load Parameters</string>
</property>
</action>
<action name="actionDebug"> <action name="actionDebug">
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>
@ -500,9 +410,9 @@ p, li { white-space: pre-wrap; }
<string>Dockable Windows</string> <string>Dockable Windows</string>
</property> </property>
</action> </action>
<action name="actionLoadParameters"> <action name="actionAbout">
<property name="text"> <property name="text">
<string>Load Parameters</string> <string>&amp;About</string>
</property> </property>
</action> </action>
</widget> </widget>

View File

@ -432,19 +432,6 @@
<property name="verticalSpacing"> <property name="verticalSpacing">
<number>4</number> <number>4</number>
</property> </property>
<item row="5" column="0">
<widget class="QLabel" name="lblNumTriggers">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Number of Triggers to be expected.&lt;/p&gt;&lt;p&gt; #triggers#&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Number of Triggers:</string>
</property>
</widget>
</item>
<item row="4" column="3"> <item row="4" column="3">
<widget class="QComboBox" name="comboPeriodUnit"> <widget class="QComboBox" name="comboPeriodUnit">
<property name="enabled"> <property name="enabled">
@ -666,108 +653,6 @@ Frame period between exposures.
</item> </item>
</widget> </widget>
</item> </item>
<item row="6" column="0">
<widget class="QLabel" name="lblDelay">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>The Delay between Trigger Edge and Start of Exposure ( or Readout).
#delay#</string>
</property>
<property name="text">
<string>Delay After Trigger:</string>
</property>
</widget>
</item>
<item row="5" column="2" colspan="2">
<widget class="QSpinBox" name="spinNumTriggers">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="toolTip">
<string>Number of Triggers to be expected.
#triggers#</string>
</property>
<property name="statusTip">
<string/>
</property>
<property name="whatsThis">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="keyboardTracking">
<bool>false</bool>
</property>
<property name="suffix">
<string/>
</property>
<property name="minimum">
<number>-1</number>
</property>
<property name="maximum">
<number>2000000000</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QDoubleSpinBox" name="spinDelay">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="toolTip">
<string>The Delay between Trigger Edge and Start of Exposure ( or Readout).
#delay#</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="keyboardTracking">
<bool>false</bool>
</property>
<property name="decimals">
<number>9</number>
</property>
<property name="minimum">
<double>-1.000000000000000</double>
</property>
<property name="maximum">
<double>2000000000.000000000000000</double>
</property>
<property name="value">
<double>0.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="2"> <item row="3" column="2">
<widget class="QDoubleSpinBox" name="spinExpTime"> <widget class="QDoubleSpinBox" name="spinExpTime">
<property name="enabled"> <property name="enabled">
@ -903,65 +788,6 @@ Exposure Time of a frame.
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="3">
<widget class="QComboBox" name="comboDelayUnit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="toolTip">
<string>The Delay between Trigger Edge and Start of Exposure ( or Readout).
#delay#</string>
</property>
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
</property>
<property name="currentIndex">
<number>2</number>
</property>
<item>
<property name="text">
<string>hr</string>
</property>
</item>
<item>
<property name="text">
<string>min</string>
</property>
</item>
<item>
<property name="text">
<string>s</string>
</property>
</item>
<item>
<property name="text">
<string>ms</string>
</property>
</item>
<item>
<property name="text">
<string>us</string>
</property>
</item>
<item>
<property name="text">
<string>ns</string>
</property>
</item>
</widget>
</item>
<item row="3" column="3"> <item row="3" column="3">
<widget class="QComboBox" name="comboExpUnit"> <widget class="QComboBox" name="comboExpUnit">
<property name="enabled"> <property name="enabled">
@ -1084,6 +910,577 @@ Frame period between exposures.
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="5" column="0">
<widget class="QStackedWidget" name="stackedLblTriggerBurst">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>171</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>171</width>
<height>32</height>
</size>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="pageLblTrigger">
<layout class="QGridLayout" name="gridLblTrigger">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="lblNumTriggers">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Number of Triggers to be expected.&lt;/p&gt;&lt;p&gt; #triggers#&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Number of Triggers:</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageLblBurst">
<layout class="QGridLayout" name="gridLblBurst">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="lblNumBursts">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Number of Triggers to be expected.&lt;/p&gt;&lt;p&gt; #triggers#&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Number of Bursts:</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item row="5" column="2">
<widget class="QStackedWidget" name="stackedSpinTriggerBurst">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>208</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>208</width>
<height>32</height>
</size>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="pageSpinTrigger">
<layout class="QGridLayout" name="gridSpinTrigger">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QSpinBox" name="spinNumTriggers">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="toolTip">
<string>Number of Triggers to be expected.
#triggers#</string>
</property>
<property name="statusTip">
<string/>
</property>
<property name="whatsThis">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="keyboardTracking">
<bool>false</bool>
</property>
<property name="suffix">
<string/>
</property>
<property name="minimum">
<number>-1</number>
</property>
<property name="maximum">
<number>2000000000</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageSpinBurst">
<layout class="QGridLayout" name="gridSpinBurst">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QSpinBox" name="spinNumBursts">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="toolTip">
<string>Number of Triggers to be expected.
#triggers#</string>
</property>
<property name="statusTip">
<string/>
</property>
<property name="whatsThis">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="keyboardTracking">
<bool>false</bool>
</property>
<property name="suffix">
<string/>
</property>
<property name="minimum">
<number>-1</number>
</property>
<property name="maximum">
<number>2000000000</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item row="6" column="0">
<widget class="QStackedWidget" name="stackedLblDelayBurstPeriod">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>171</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>171</width>
<height>32</height>
</size>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="pageLblDelay">
<layout class="QGridLayout" name="gridLblDelay">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="lblDelay">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Number of Triggers to be expected.&lt;/p&gt;&lt;p&gt; #triggers#&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Delay After Trigger:</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageLblBurstPeriod">
<layout class="QGridLayout" name="gridLblBurstPeriod">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="1">
<widget class="QLabel" name="lblBurstPeriod">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Number of Triggers to be expected.&lt;/p&gt;&lt;p&gt; #triggers#&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Burst Period:</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item row="6" column="2">
<widget class="QStackedWidget" name="stackedSpinDelayBurstPeriod">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>152</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>152</width>
<height>32</height>
</size>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="pageSpinDelay">
<layout class="QGridLayout" name="gridSpinDelay">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QDoubleSpinBox" name="spinDelay">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="toolTip">
<string>The Delay between Trigger Edge and Start of Exposure ( or Readout).
#delay#</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="keyboardTracking">
<bool>false</bool>
</property>
<property name="decimals">
<number>9</number>
</property>
<property name="minimum">
<double>-1.000000000000000</double>
</property>
<property name="maximum">
<double>2000000000.000000000000000</double>
</property>
<property name="value">
<double>0.000000000000000</double>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageSpinBurstPeriod">
<layout class="QGridLayout" name="gridSpinBurstPeriod">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QDoubleSpinBox" name="spinBurstPeriod">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="toolTip">
<string>The Delay between Trigger Edge and Start of Exposure ( or Readout).
#delay#</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="keyboardTracking">
<bool>false</bool>
</property>
<property name="decimals">
<number>9</number>
</property>
<property name="minimum">
<double>-1.000000000000000</double>
</property>
<property name="maximum">
<double>2000000000.000000000000000</double>
</property>
<property name="value">
<double>0.000000000000000</double>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item row="6" column="3">
<widget class="QStackedWidget" name="stackedComboDelayBurstPeriod">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>50</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>50</width>
<height>32</height>
</size>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="pageComboDelay">
<layout class="QGridLayout" name="gridComboDelay">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QComboBox" name="comboDelayUnit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="toolTip">
<string>The Delay between Trigger Edge and Start of Exposure ( or Readout).
#delay#</string>
</property>
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
</property>
<property name="currentIndex">
<number>2</number>
</property>
<item>
<property name="text">
<string>hr</string>
</property>
</item>
<item>
<property name="text">
<string>min</string>
</property>
</item>
<item>
<property name="text">
<string>s</string>
</property>
</item>
<item>
<property name="text">
<string>ms</string>
</property>
</item>
<item>
<property name="text">
<string>us</string>
</property>
</item>
<item>
<property name="text">
<string>ns</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageComboBurstPeriod">
<layout class="QGridLayout" name="gridComboBurstPeriod">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QComboBox" name="comboBurstPeriodUnit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="toolTip">
<string>The Delay between Trigger Edge and Start of Exposure ( or Readout).
#delay#</string>
</property>
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
</property>
<property name="currentIndex">
<number>2</number>
</property>
<item>
<property name="text">
<string>hr</string>
</property>
</item>
<item>
<property name="text">
<string>min</string>
</property>
</item>
<item>
<property name="text">
<string>s</string>
</property>
</item>
<item>
<property name="text">
<string>ms</string>
</property>
</item>
<item>
<property name="text">
<string>us</string>
</property>
</item>
<item>
<property name="text">
<string>ns</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -1116,9 +1513,6 @@ Frame period between exposures.
<tabstop>comboExpUnit</tabstop> <tabstop>comboExpUnit</tabstop>
<tabstop>spinPeriod</tabstop> <tabstop>spinPeriod</tabstop>
<tabstop>comboPeriodUnit</tabstop> <tabstop>comboPeriodUnit</tabstop>
<tabstop>spinNumTriggers</tabstop>
<tabstop>spinDelay</tabstop>
<tabstop>comboDelayUnit</tabstop>
<tabstop>spinNumSamples</tabstop> <tabstop>spinNumSamples</tabstop>
</tabstops> </tabstops>
<resources> <resources>

View File

@ -2368,7 +2368,6 @@ Displays minimum, maximum and sum of values for each plot.
<zorder>box1D</zorder> <zorder>box1D</zorder>
<zorder>boxFrequency</zorder> <zorder>boxFrequency</zorder>
<zorder>box2D</zorder> <zorder>box2D</zorder>
<zorder>horizontalSpacer_6</zorder>
<zorder>boxPlotAxis</zorder> <zorder>boxPlotAxis</zorder>
<zorder>boxSave</zorder> <zorder>boxSave</zorder>
</widget> </widget>

View File

@ -26,10 +26,12 @@ private slots:
void SetNumMeasurements(int val); void SetNumMeasurements(int val);
void SetNumFrames(int val); void SetNumFrames(int val);
void SetNumTriggers(int val); void SetNumTriggers(int val);
void SetNumBursts(int val);
void SetNumSamples(int val); void SetNumSamples(int val);
void SetExposureTime(); void SetExposureTime();
void SetAcquisitionPeriod(); void SetAcquisitionPeriod();
void SetDelay(); void SetDelay();
void SetBurstPeriod();
void SetFileWrite(bool val); void SetFileWrite(bool val);
void SetFileName(); void SetFileName();
void SetRunIndex(int val); void SetRunIndex(int val);
@ -41,17 +43,24 @@ private slots:
private: private:
void SetupWidgetWindow(); void SetupWidgetWindow();
void Initialization(); void Initialization();
/** default, show trigger and delay,
* otherwise for gotthard2 in auto timing mode and burst mode,
* show bursts and burst period
*/
void ShowTriggerDelay();
void SetupTimingMode(); void SetupTimingMode();
void EnableWidgetsforTimingMode(); void EnableWidgetsforTimingMode();
void GetTimingMode(); void GetTimingMode();
void GetNumFrames(); void GetNumFrames();
void GetNumTriggers(); void GetNumTriggers();
void GetNumBursts();
void GetNumSamples(); void GetNumSamples();
void GetExposureTime(); void GetExposureTime();
void GetAcquisitionPeriod(); void GetAcquisitionPeriod();
void CheckAcqPeriodGreaterThanExp(); void CheckAcqPeriodGreaterThanExp();
void GetDelay(); void GetDelay();
void GetBurstPeriod();
void GetFileWrite(); void GetFileWrite();
void GetFileName(); void GetFileName();
void GetRunIndex(); void GetRunIndex();

View File

@ -42,6 +42,10 @@ void qTabMeasurement::SetupWidgetWindow() {
lblDelay->setEnabled(true); lblDelay->setEnabled(true);
spinDelay->setEnabled(true); spinDelay->setEnabled(true);
comboDelayUnit->setEnabled(true); comboDelayUnit->setEnabled(true);
// default is triggers and delay (not #bursts and burst period for gotthard2 in auto mode)
ShowTriggerDelay();
// enabling according to det type // enabling according to det type
switch(det->getDetectorType().squash()) { switch(det->getDetectorType().squash()) {
case slsDetectorDefs::MOENCH: case slsDetectorDefs::MOENCH:
@ -60,6 +64,13 @@ void qTabMeasurement::SetupWidgetWindow() {
spinStartingFrameNumber->setEnabled(true); spinStartingFrameNumber->setEnabled(true);
startingFnumImplemented = true; startingFnumImplemented = true;
break; break;
case slsDetectorDefs::GOTTHARD2:
lblNumBursts->setEnabled(true);
spinNumBursts->setEnabled(true);
lblBurstPeriod->setEnabled(true);
spinBurstPeriod->setEnabled(true);
comboBurstPeriodUnit->setEnabled(true);
break;
default: default:
break; break;
} }
@ -78,6 +89,9 @@ void qTabMeasurement::Initialization() {
connect(spinNumMeasurements, SIGNAL(valueChanged(int)), this, SLOT(SetNumMeasurements(int))); connect(spinNumMeasurements, SIGNAL(valueChanged(int)), this, SLOT(SetNumMeasurements(int)));
connect(spinNumFrames, SIGNAL(valueChanged(int)), this, SLOT(SetNumFrames(int))); connect(spinNumFrames, SIGNAL(valueChanged(int)), this, SLOT(SetNumFrames(int)));
connect(spinNumTriggers, SIGNAL(valueChanged(int)), this, SLOT(SetNumTriggers(int))); connect(spinNumTriggers, SIGNAL(valueChanged(int)), this, SLOT(SetNumTriggers(int)));
if (spinNumBursts->isEnabled()) {
connect(spinNumBursts, SIGNAL(valueChanged(int)), this, SLOT(SetNumBursts(int)));
}
if (spinNumSamples->isEnabled()) { if (spinNumSamples->isEnabled()) {
connect(spinNumSamples, SIGNAL(valueChanged(int)), this, SLOT(SetNumSamples(int))); connect(spinNumSamples, SIGNAL(valueChanged(int)), this, SLOT(SetNumSamples(int)));
} }
@ -89,6 +103,10 @@ void qTabMeasurement::Initialization() {
connect(spinDelay, SIGNAL(valueChanged(double)), this, SLOT(SetDelay())); connect(spinDelay, SIGNAL(valueChanged(double)), this, SLOT(SetDelay()));
connect(comboDelayUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(SetDelay())); connect(comboDelayUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(SetDelay()));
} }
if (spinBurstPeriod->isEnabled()) {
connect(spinBurstPeriod, SIGNAL(valueChanged(double)), this, SLOT(SetBurstPeriod()));
connect(comboBurstPeriodUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(SetBurstPeriod()));
}
connect(chkFile, SIGNAL(toggled(bool)), this, SLOT(SetFileWrite(bool))); connect(chkFile, SIGNAL(toggled(bool)), this, SLOT(SetFileWrite(bool)));
connect(dispFileName, SIGNAL(editingFinished()), this, SLOT(SetFileName())); connect(dispFileName, SIGNAL(editingFinished()), this, SLOT(SetFileName()));
connect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(SetRunIndex(int))); connect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(SetRunIndex(int)));
@ -101,6 +119,35 @@ void qTabMeasurement::Initialization() {
} }
void qTabMeasurement::ShowTriggerDelay() {
bool showTrigger = true;
if (det->getDetectorType().squash() == slsDetectorDefs::GOTTHARD2) {
try {
FILE_LOG(logDEBUG) << "Getting burst mode";
auto retval = det->getBurstMode().tsquash("Inconsistent burst mode for all detectors.");
// burst mode and auto timing mode
if (retval != slsDetectorDefs::BURST_OFF && comboTimingMode->currentIndex() == AUTO) {
showTrigger = false;
}
} CATCH_DISPLAY ("Could not get burst mode.", "qTabMeasurement::ShowTriggerDelay")
}
if (showTrigger) {
stackedLblTriggerBurst->setCurrentWidget(pageLblTrigger);
stackedSpinTriggerBurst->setCurrentWidget(pageSpinTrigger);
stackedLblDelayBurstPeriod->setCurrentWidget(pageLblDelay);
stackedSpinDelayBurstPeriod->setCurrentWidget(pageSpinDelay);
stackedComboDelayBurstPeriod->setCurrentWidget(pageComboDelay);
} else {
stackedLblTriggerBurst->setCurrentWidget(pageLblBurst);
stackedSpinTriggerBurst->setCurrentWidget(pageSpinBurst);
stackedLblDelayBurstPeriod->setCurrentWidget(pageLblBurstPeriod);
stackedSpinDelayBurstPeriod->setCurrentWidget(pageSpinBurstPeriod);
stackedComboDelayBurstPeriod->setCurrentWidget(pageComboBurstPeriod);
}
}
void qTabMeasurement::SetupTimingMode() { void qTabMeasurement::SetupTimingMode() {
QStandardItemModel* model = qobject_cast<QStandardItemModel *>(comboTimingMode->model()); QStandardItemModel* model = qobject_cast<QStandardItemModel *>(comboTimingMode->model());
QModelIndex index[NUMTIMINGMODES]; QModelIndex index[NUMTIMINGMODES];
@ -139,7 +186,9 @@ void qTabMeasurement::EnableWidgetsforTimingMode() {
switch(comboTimingMode->currentIndex()) { switch(comboTimingMode->currentIndex()) {
case AUTO: case AUTO:
// #frames, exptime, period // #frames, exptime, period
spinNumTriggers->setValue(1); if (det->getDetectorType().squash() != slsDetectorDefs::GOTTHARD2) {
spinNumTriggers->setValue(1);
}
lblNumFrames->setEnabled(true); lblNumFrames->setEnabled(true);
spinNumFrames->setEnabled(true); spinNumFrames->setEnabled(true);
lblExpTime->setEnabled(true); lblExpTime->setEnabled(true);
@ -148,6 +197,9 @@ void qTabMeasurement::EnableWidgetsforTimingMode() {
lblPeriod->setEnabled(true); lblPeriod->setEnabled(true);
spinPeriod->setEnabled(true); spinPeriod->setEnabled(true);
comboPeriodUnit->setEnabled(true); comboPeriodUnit->setEnabled(true);
if (det->getDetectorType().squash() == slsDetectorDefs::GOTTHARD2) {
ShowTriggerDelay();
}
break; break;
case TRIGGER: case TRIGGER:
// #triggers, exptime // #triggers, exptime
@ -168,6 +220,9 @@ void qTabMeasurement::EnableWidgetsforTimingMode() {
lblDelay->setEnabled(true); lblDelay->setEnabled(true);
spinDelay->setEnabled(true); spinDelay->setEnabled(true);
comboDelayUnit->setEnabled(true); comboDelayUnit->setEnabled(true);
if (det->getDetectorType().squash() == slsDetectorDefs::GOTTHARD2) {
ShowTriggerDelay();
}
} }
break; break;
case GATED: case GATED:
@ -266,6 +321,23 @@ void qTabMeasurement::SetNumTriggers(int val) {
} CATCH_HANDLE("Could not set number of triggers.", "qTabMeasurement::SetNumTriggers", this, &qTabMeasurement::GetNumTriggers) } CATCH_HANDLE("Could not set number of triggers.", "qTabMeasurement::SetNumTriggers", this, &qTabMeasurement::GetNumTriggers)
} }
void qTabMeasurement::GetNumBursts() {
FILE_LOG(logDEBUG) << "Getting number of bursts";
disconnect(spinNumBursts, SIGNAL(valueChanged(int)), this, SLOT(SetNumBursts(int)));
try {
auto retval = det->getNumberOfBursts().tsquash("Inconsistent number of bursts for all detectors.");
spinNumBursts->setValue(retval);
} CATCH_DISPLAY ("Could not get number of frames.", "qTabMeasurement::GetNumBursts")
connect(spinNumBursts, SIGNAL(valueChanged(int)), this, SLOT(SetNumBursts(int)));
}
void qTabMeasurement::SetNumBursts(int val) {
FILE_LOG(logINFO) << "Setting number of bursts to " << val;
try {
det->setNumberOfBursts(val);
} CATCH_HANDLE("Could not set number of bursts.", "qTabMeasurement::SetNumBursts", this, &qTabMeasurement::GetNumBursts)
}
void qTabMeasurement::GetNumSamples() { void qTabMeasurement::GetNumSamples() {
FILE_LOG(logDEBUG) << "Getting number of samples"; FILE_LOG(logDEBUG) << "Getting number of samples";
disconnect(spinNumSamples, SIGNAL(valueChanged(int)), this, SLOT(SetNumSamples(int))); disconnect(spinNumSamples, SIGNAL(valueChanged(int)), this, SLOT(SetNumSamples(int)));
@ -385,6 +457,32 @@ void qTabMeasurement::SetDelay() {
} CATCH_HANDLE("Could not set delay.", "qTabMeasurement::SetDelay", this, &qTabMeasurement::GetDelay) } CATCH_HANDLE("Could not set delay.", "qTabMeasurement::SetDelay", this, &qTabMeasurement::GetDelay)
} }
void qTabMeasurement::GetBurstPeriod() {
FILE_LOG(logDEBUG) << "Getting Burst Period";
disconnect(spinBurstPeriod, SIGNAL(valueChanged(double)), this, SLOT(SetBurstPeriod()));
disconnect(comboBurstPeriodUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(SetBurstPeriod()));
try {
spinBurstPeriod->setValue(-1);
auto retval = det->getBurstPeriod().tsquash("Inconsistent burst period for all detectors.");
auto time = qDefs::getUserFriendlyTime(retval);
spinBurstPeriod->setValue(time.first);
comboBurstPeriodUnit->setCurrentIndex(static_cast<int>(time.second));
} CATCH_DISPLAY ("Could not get burst period.", "qTabMeasurement::GetBurstPeriod")
connect(spinBurstPeriod, SIGNAL(valueChanged(double)), this, SLOT(SetBurstPeriod()));
connect(comboBurstPeriodUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(SetBurstPeriod()));
}
void qTabMeasurement::SetBurstPeriod() {
auto val = spinBurstPeriod->value();
auto unit = static_cast<qDefs::timeUnit>(comboBurstPeriodUnit->currentIndex());
FILE_LOG(logINFO) << "Setting burst period to " << val << " " << qDefs::getUnitString(unit);
try {
auto timeNS = qDefs::getNSTime(std::make_pair(val, unit));
det->setBurstPeriod(timeNS);
} CATCH_HANDLE("Could not set burst period.", "qTabMeasurement::SetBurstPeriod", this, &qTabMeasurement::GetBurstPeriod)
}
void qTabMeasurement::GetFileWrite() { void qTabMeasurement::GetFileWrite() {
FILE_LOG(logDEBUG) << "Getting File Write Enable"; FILE_LOG(logDEBUG) << "Getting File Write Enable";
disconnect(chkFile, SIGNAL(toggled(bool)), this, SLOT(SetFileWrite(bool))); disconnect(chkFile, SIGNAL(toggled(bool)), this, SLOT(SetFileWrite(bool)));
@ -577,9 +675,15 @@ void qTabMeasurement::Refresh() {
GetExposureTime(); GetExposureTime();
GetAcquisitionPeriod(); GetAcquisitionPeriod();
GetNumTriggers(); GetNumTriggers();
if (spinNumBursts->isEnabled()) {
GetNumBursts();
}
if (delayImplemented) { if (delayImplemented) {
GetDelay(); GetDelay();
} }
if (spinBurstPeriod->isEnabled()) {
GetBurstPeriod();
}
if (sampleImplemented) { if (sampleImplemented) {
GetNumSamples(); GetNumSamples();
} }

View File

@ -47,6 +47,10 @@ int injectedChannelsIncrement = 0;
int vetoReference[NCHIP][NCHAN]; int vetoReference[NCHIP][NCHAN];
uint8_t adcConfiguration[NCHIP][NADC]; uint8_t adcConfiguration[NCHIP][NADC];
int burstMode = BURST_INTERNAL; int burstMode = BURST_INTERNAL;
int64_t numTriggers = 1;
int64_t numBursts = 1;
int64_t delayAfterTriggerNs = 0;
int64_t burstPeriodNs = 0;
int detPos[2] = {}; int detPos[2] = {};
int isInitCheckDone() { int isInitCheckDone() {
@ -350,6 +354,10 @@ void setupDetector() {
injectedChannelsOffset = 0; injectedChannelsOffset = 0;
injectedChannelsIncrement = 0; injectedChannelsIncrement = 0;
burstMode = BURST_INTERNAL; burstMode = BURST_INTERNAL;
numTriggers = 1;
numBursts = 1;
delayAfterTriggerNs = 0;
burstPeriodNs = 0;
{ {
int i, j; int i, j;
for (i = 0; i < NUM_CLOCKS; ++i) { for (i = 0; i < NUM_CLOCKS; ++i) {
@ -433,9 +441,11 @@ void setupDetector() {
// Initialization of acquistion parameters // Initialization of acquistion parameters
setNumFrames(DEFAULT_NUM_FRAMES); setNumFrames(DEFAULT_NUM_FRAMES);
setNumTriggers(DEFAULT_NUM_CYCLES); setNumTriggers(DEFAULT_NUM_CYCLES);
setNumBursts(DEFAULT_NUM_BURSTS);
setExpTime(DEFAULT_EXPTIME); setExpTime(DEFAULT_EXPTIME);
setPeriod(DEFAULT_PERIOD); setPeriod(DEFAULT_PERIOD);
setDelayAfterTrigger(DEFAULT_DELAY_AFTER_TRIGGER); setDelayAfterTrigger(DEFAULT_DELAY_AFTER_TRIGGER);
setBurstPeriod(DEFAULT_BURST_PERIOD);
setTiming(DEFAULT_TIMING_MODE); setTiming(DEFAULT_TIMING_MODE);
} }
@ -725,7 +735,7 @@ int setDynamicRange(int dr){
/* parameters - timer */ /* parameters - timer */
void setNumFrames(int64_t val) { void setNumFrames(int64_t val) {
if (val > 0) { if (val > 0) {
FILE_LOG(logINFO, ("Setting number of frames %lld [local]\n", (long long int)val)); FILE_LOG(logINFO, ("Setting number of frames %lld [local]\n", val));
// continuous mode // continuous mode
if (burstMode == BURST_OFF) { if (burstMode == BURST_OFF) {
setNumFramesCont(val); setNumFramesCont(val);
@ -747,21 +757,48 @@ int64_t getNumFrames() {
void setNumTriggers(int64_t val) { void setNumTriggers(int64_t val) {
if (val > 0) { if (val > 0) {
FILE_LOG(logINFO, ("Setting number of triggers %lld\n", (long long int)val)); FILE_LOG(logINFO, ("Setting number of triggers %lld\n", val));
set64BitReg(val, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG); numTriggers = val;
if (burstMode != BURST_OFF && getTiming() == AUTO_TIMING) {
FILE_LOG(logINFO, ("\tBurst and Auto mode: not writing #triggers to register\n"));
} else {
set64BitReg(val, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG);
}
} }
} }
int64_t getNumTriggers() { int64_t getNumTriggers() {
return get64BitReg(SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG); if (burstMode != BURST_OFF && getTiming() == AUTO_TIMING) {
return numTriggers;
}
return get64BitReg(SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG);
}
void setNumBursts(int64_t val) {
if (val > 0) {
FILE_LOG(logINFO, ("Setting number of bursts %lld\n", val));
numBursts = val;
if (burstMode != BURST_OFF && getTiming() == AUTO_TIMING) {
set64BitReg(val, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG);
} else {
FILE_LOG(logINFO, ("\tNot (Burst and Auto mode): not writing #bursts to register\n"));
}
}
}
int64_t getNumBursts() {
if (burstMode != BURST_OFF && getTiming() == AUTO_TIMING) {
return get64BitReg(SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG);
}
return numBursts;
} }
int setExpTime(int64_t val) { int setExpTime(int64_t val) {
if (val < 0) { if (val < 0) {
FILE_LOG(logERROR, ("Invalid exptime: %lld ns\n", (long long int)val)); FILE_LOG(logERROR, ("Invalid exptime: %lld ns\n", val));
return FAIL; return FAIL;
} }
FILE_LOG(logINFO, ("Setting exptime %lld ns [local]\n", (long long int)val)); FILE_LOG(logINFO, ("Setting exptime %lld ns [local]\n", val));
// continuous mode // continuous mode
if (burstMode == BURST_OFF) { if (burstMode == BURST_OFF) {
return setExptimeCont(val); return setExptimeCont(val);
@ -776,10 +813,10 @@ int64_t getExpTime() {
int setPeriod(int64_t val) { int setPeriod(int64_t val) {
if (val < 0) { if (val < 0) {
FILE_LOG(logERROR, ("Invalid period: %lld ns\n", (long long int)val)); FILE_LOG(logERROR, ("Invalid period: %lld ns\n", val));
return FAIL; return FAIL;
} }
FILE_LOG(logINFO, ("Setting period %lld ns [local]\n", (long long int)val)); FILE_LOG(logINFO, ("Setting period %lld ns [local]\n", val));
// continuous mode // continuous mode
if (burstMode == BURST_OFF) { if (burstMode == BURST_OFF) {
setPeriodBurst(0); setPeriodBurst(0);
@ -809,7 +846,7 @@ int64_t getNumFramesBurst() {
} }
void setNumFramesCont(int64_t val) { void setNumFramesCont(int64_t val) {
FILE_LOG(logINFO, ("Setting number of frames %lld [Continuous mode]\n", (long long int)val)); FILE_LOG(logINFO, ("Setting number of frames %lld [Continuous mode]\n", val));
set64BitReg(val, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); set64BitReg(val, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG);
} }
@ -818,12 +855,12 @@ int64_t getNumFramesCont() {
} }
int setExptimeBurst(int64_t val) { int setExptimeBurst(int64_t val) {
FILE_LOG(logINFO, ("Setting exptime %lld ns [Burst mode]\n", (long long int)val)); FILE_LOG(logINFO, ("Setting exptime %lld ns [Burst mode]\n", val));
return setExptimeBoth(val); return setExptimeBoth(val);
} }
int setExptimeCont(int64_t val) { int setExptimeCont(int64_t val) {
FILE_LOG(logINFO, ("Setting exptime %lld ns [Continuous mode]\n", (long long int)val)); FILE_LOG(logINFO, ("Setting exptime %lld ns [Continuous mode]\n", val));
return setExptimeBoth(val); return setExptimeBoth(val);
} }
@ -846,7 +883,7 @@ int64_t getExptimeBoth() {
int setPeriodBurst(int64_t val) { int setPeriodBurst(int64_t val) {
FILE_LOG(logINFO, ("Setting period %lld ns [Burst mode]\n", (long long int)val)); FILE_LOG(logINFO, ("Setting period %lld ns [Burst mode]\n", val));
val *= (1E-9 * clkFrequency[SYSTEM_C0]); val *= (1E-9 * clkFrequency[SYSTEM_C0]);
set64BitReg(val, ASIC_INT_PERIOD_LSB_REG, ASIC_INT_PERIOD_MSB_REG); set64BitReg(val, ASIC_INT_PERIOD_LSB_REG, ASIC_INT_PERIOD_MSB_REG);
@ -865,7 +902,7 @@ int64_t getPeriodBurst() {
} }
int setPeriodCont(int64_t val) { int setPeriodCont(int64_t val) {
FILE_LOG(logINFO, ("Setting period %lld ns [Continuous mode]\n", (long long int)val)); FILE_LOG(logINFO, ("Setting period %lld ns [Continuous mode]\n", val));
val *= (1E-9 * FIXED_PLL_FREQUENCY); val *= (1E-9 * FIXED_PLL_FREQUENCY);
set64BitReg(val, SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG); set64BitReg(val, SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG);
@ -885,12 +922,17 @@ int64_t getPeriodCont() {
int setDelayAfterTrigger(int64_t val) { int setDelayAfterTrigger(int64_t val) {
if (val < 0) { if (val < 0) {
FILE_LOG(logERROR, ("Invalid delay after trigger: %lld ns\n", (long long int)val)); FILE_LOG(logERROR, ("Invalid delay after trigger: %lld ns\n", val));
return FAIL; return FAIL;
} }
FILE_LOG(logINFO, ("Setting delay after trigger %lld ns\n", (long long int)val)); FILE_LOG(logINFO, ("Setting delay after trigger %lld ns\n", val));
val *= (1E-9 * FIXED_PLL_FREQUENCY); delayAfterTriggerNs = val;
set64BitReg(val, SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG); val *= (1E-9 * FIXED_PLL_FREQUENCY);
if (burstMode != BURST_OFF && getTiming() == AUTO_TIMING) {
FILE_LOG(logINFO, ("\tBurst and Auto mode: not writing delay to register\n"));
} else {
set64BitReg(val, SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG);
}
// validate for tolerance // validate for tolerance
int64_t retval = getDelayAfterTrigger(); int64_t retval = getDelayAfterTrigger();
@ -902,9 +944,42 @@ int setDelayAfterTrigger(int64_t val) {
} }
int64_t getDelayAfterTrigger() { int64_t getDelayAfterTrigger() {
if (burstMode != BURST_OFF && getTiming() == AUTO_TIMING) {
return delayAfterTriggerNs;
}
return get64BitReg(SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG) / (1E-9 * FIXED_PLL_FREQUENCY); return get64BitReg(SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG) / (1E-9 * FIXED_PLL_FREQUENCY);
} }
int setBurstPeriod(int64_t val) {
if (val < 0) {
FILE_LOG(logERROR, ("Invalid burst period: %lld ns\n", val));
return FAIL;
}
FILE_LOG(logINFO, ("Setting burst period %lld ns\n", val));
burstPeriodNs = val;
val *= (1E-9 * FIXED_PLL_FREQUENCY);
if (burstMode != BURST_OFF && getTiming() == AUTO_TIMING) {
set64BitReg(val, SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG);
} else {
FILE_LOG(logINFO, ("\tNot (Burst and Auto mode): not writing burst period to register\n"));
}
// validate for tolerance
int64_t retval = getBurstPeriod();
val /= (1E-9 * FIXED_PLL_FREQUENCY);
if (val != retval) {
return FAIL;
}
return OK;
}
int64_t getBurstPeriod() {
if (burstMode != BURST_OFF && getTiming() == AUTO_TIMING) {
return get64BitReg(SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG) / (1E-9 * FIXED_PLL_FREQUENCY);
}
return burstPeriodNs;
}
int64_t getNumFramesLeft() { int64_t getNumFramesLeft() {
return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG);
} }
@ -1129,6 +1204,12 @@ void setTiming( enum timingMode arg){
default: default:
FILE_LOG(logERROR, ("Unknown timing mode %d\n", arg)); FILE_LOG(logERROR, ("Unknown timing mode %d\n", arg));
} }
FILE_LOG(logINFO, ("\tUpdating trigger/burst and delay/burst period registers\n"))
setNumTriggers(numTriggers);
setNumBursts(numBursts);
setDelayAfterTrigger(delayAfterTriggerNs);
setBurstPeriod(burstPeriodNs);
} }
enum timingMode getTiming() { enum timingMode getTiming() {
@ -1807,8 +1888,14 @@ int setBurstMode(enum burstMode burst) {
return FAIL; return FAIL;
} }
FILE_LOG(logINFO, ("\tUpdating trigger/burst and delay/burst period registers\n"))
setNumTriggers(numTriggers);
setNumBursts(numBursts);
setDelayAfterTrigger(delayAfterTriggerNs);
setBurstPeriod(burstPeriodNs);
// set number of frames and period again (set registers according to timing mode) // set number of frames and period again (set registers according to timing mode)
FILE_LOG(logINFO, ("\tUpdating #frames and period registers")); FILE_LOG(logINFO, ("\tUpdating #frames and period registers\n"));
setNumFrames(frames); setNumFrames(frames);
setPeriod(period); setPeriod(period);

View File

@ -33,9 +33,11 @@
#define DEFAULT_BURST_MODE (BURST_INTERNAL) #define DEFAULT_BURST_MODE (BURST_INTERNAL)
#define DEFAULT_NUM_FRAMES (1) #define DEFAULT_NUM_FRAMES (1)
#define DEFAULT_NUM_CYCLES (1) #define DEFAULT_NUM_CYCLES (1)
#define DEFAULT_NUM_BURSTS (1)
#define DEFAULT_EXPTIME (0) // 0 ms (220ns in firmware) #define DEFAULT_EXPTIME (0) // 0 ms (220ns in firmware)
#define DEFAULT_PERIOD (0) // 0 ms #define DEFAULT_PERIOD (0) // 0 ms
#define DEFAULT_DELAY_AFTER_TRIGGER (0) #define DEFAULT_DELAY_AFTER_TRIGGER (0)
#define DEFAULT_BURST_PERIOD (0)
#define DEFAULT_HIGH_VOLTAGE (0) #define DEFAULT_HIGH_VOLTAGE (0)
#define DEFAULT_TIMING_MODE (AUTO_TIMING) #define DEFAULT_TIMING_MODE (AUTO_TIMING)
#define DEFAULT_SETTINGS (DYNAMICGAIN) #define DEFAULT_SETTINGS (DYNAMICGAIN)

View File

@ -178,6 +178,11 @@ int64_t getExpTime();
int setPeriod(int64_t val); int setPeriod(int64_t val);
int64_t getPeriod(); int64_t getPeriod();
#ifdef GOTTHARD2D #ifdef GOTTHARD2D
void setNumBursts(int64_t val);
int64_t getNumBursts();
int setBurstPeriod(int64_t val);
int64_t getBurstPeriod();
void setNumFramesBurst(int64_t val); void setNumFramesBurst(int64_t val);
int64_t getNumFramesBurst(); int64_t getNumFramesBurst();
void setNumFramesCont(int64_t val); void setNumFramesCont(int64_t val);

View File

@ -208,3 +208,7 @@ int set_adc_enable_mask_10g(int);
int get_adc_enable_mask_10g(int); int get_adc_enable_mask_10g(int);
int set_counter_mask(int); int set_counter_mask(int);
int get_counter_mask(int); int get_counter_mask(int);
int get_num_bursts(int);
int set_num_bursts(int);
int get_burst_period(int);
int set_burst_period(int);

View File

@ -315,6 +315,10 @@ const char* getFunctionName(enum detFuncs func) {
case F_GET_ADC_ENABLE_MASK_10G: return "F_GET_ADC_ENABLE_MASK_10G"; case F_GET_ADC_ENABLE_MASK_10G: return "F_GET_ADC_ENABLE_MASK_10G";
case F_SET_COUNTER_MASK: return "F_SET_COUNTER_MASK"; case F_SET_COUNTER_MASK: return "F_SET_COUNTER_MASK";
case F_GET_COUNTER_MASK: return "F_GET_COUNTER_MASK"; case F_GET_COUNTER_MASK: return "F_GET_COUNTER_MASK";
case F_GET_NUM_BURSTS: return "F_GET_NUM_BURSTS";
case F_SET_NUM_BURSTS: return "F_SET_NUM_BURSTS";
case F_GET_BURST_PERIOD: return "F_GET_BURST_PERIOD";
case F_SET_BURST_PERIOD: return "F_SET_BURST_PERIOD";
default: return "Unknown Function"; default: return "Unknown Function";
} }
@ -499,6 +503,10 @@ void function_table() {
flist[F_GET_ADC_ENABLE_MASK_10G] = &get_adc_enable_mask_10g; flist[F_GET_ADC_ENABLE_MASK_10G] = &get_adc_enable_mask_10g;
flist[F_SET_COUNTER_MASK] = &set_counter_mask; flist[F_SET_COUNTER_MASK] = &set_counter_mask;
flist[F_GET_COUNTER_MASK] = &get_counter_mask; flist[F_GET_COUNTER_MASK] = &get_counter_mask;
flist[F_GET_NUM_BURSTS] = &get_num_bursts;
flist[F_SET_NUM_BURSTS] = &set_num_bursts;
flist[F_GET_BURST_PERIOD] = &get_burst_period;
flist[F_SET_BURST_PERIOD] = &set_burst_period;
// check // check
if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) { if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) {
@ -2799,7 +2807,26 @@ int send_update(int file_des) {
n = sendData(file_des,&i64,sizeof(i64),INT64); n = sendData(file_des,&i64,sizeof(i64),INT64);
if (n < 0) return printSocketReadError(); if (n < 0) return printSocketReadError();
// readout flags // #bursts
#ifdef GOTTHARD2D
i64 = getNumBursts();
n = sendData(file_des,&i64,sizeof(i64),INT64);
if (n < 0) return printSocketReadError();
#endif
// timing mode
i32 = (int)getTiming();
n = sendData(file_des,&i32,sizeof(i32),INT32);
if (n < 0) return printSocketReadError();
// burst mode
#ifdef GOTTHARD2D
i32 = (int)getBurstMode();
n = sendData(file_des,&i32,sizeof(i32),INT32);
if (n < 0) return printSocketReadError();
#endif
// readout mode
#ifdef CHIPTESTBOARDD #ifdef CHIPTESTBOARDD
i32 = getReadoutMode(); i32 = getReadoutMode();
n = sendData(file_des,&i32,sizeof(i32),INT32); n = sendData(file_des,&i32,sizeof(i32),INT32);
@ -6629,3 +6656,83 @@ int get_counter_mask(int file_des) {
#endif #endif
return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval));
} }
int get_num_bursts(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
int64_t retval = -1;
#ifndef GOTTHARD2D
functionNotImplemented();
#else
// get only
retval = getNumBursts();
FILE_LOG(logDEBUG1, ("retval num bursts %lld\n", (long long int)retval));
#endif
return Server_SendResult(file_des, INT64, UPDATE, &retval, sizeof(retval));
}
int set_num_bursts(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
int64_t arg = -1;
if (receiveData(file_des, &arg, sizeof(arg), INT64) < 0)
return printSocketReadError();
FILE_LOG(logDEBUG1, ("Setting number of bursts %lld\n", (long long int)arg));
#ifndef GOTTHARD2D
functionNotImplemented();
#else
// only set
if (Server_VerifyLock() == OK) {
setNumBursts(arg);
int64_t retval = getNumBursts();
FILE_LOG(logDEBUG1, ("retval num bursts %lld\n", (long long int)retval));
validate64(arg, retval, "set number of bursts", DEC);
}
#endif
return Server_SendResult(file_des, INT64, UPDATE, NULL, 0);
}
int get_burst_period(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
int64_t retval = -1;
#ifndef GOTTHARD2D
functionNotImplemented();
#else
// get only
retval = getBurstPeriod();
FILE_LOG(logDEBUG1, ("retval burst period %lld ns\n", (long long int)retval));
#endif
return Server_SendResult(file_des, INT64, UPDATE, &retval, sizeof(retval));
}
int set_burst_period(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
int64_t arg = -1;
if (receiveData(file_des, &arg, sizeof(arg), INT64) < 0)
return printSocketReadError();
FILE_LOG(logDEBUG1, ("Setting burst period %lld ns\n", (long long int)arg));
#ifndef GOTTHARD2D
functionNotImplemented();
#else
// only set
if (Server_VerifyLock() == OK) {
ret = setBurstPeriod(arg);
int64_t retval = getBurstPeriod();
FILE_LOG(logDEBUG1, ("retval burst period %lld ns\n", (long long int)retval));
if (ret == FAIL) {
sprintf(mess, "Could not set burst period. Set %lld ns, read %lld ns.\n", (long long int)arg, (long long int)retval);
FILE_LOG(logERROR,(mess));
}
}
#endif
return Server_SendResult(file_des, INT64, UPDATE, NULL, 0);
}

View File

@ -155,12 +155,10 @@ class Detector {
void setPeriod(ns t, Positions pos = {}); void setPeriod(ns t, Positions pos = {});
/** [Gotthard][Jungfrau][CTB][Mythen3] /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */
* [Gotthard2] only in continuous mode */
Result<ns> getDelayAfterTrigger(Positions pos = {}) const; Result<ns> getDelayAfterTrigger(Positions pos = {}) const;
/** [Gotthard][Jungfrau][CTB][Mythen3] /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */
* [Gotthard2] only in continuous mode */
void setDelayAfterTrigger(ns value, Positions pos = {}); void setDelayAfterTrigger(ns value, Positions pos = {});
/** [Gotthard][Jungfrau][CTB][Mythen3] /** [Gotthard][Jungfrau][CTB][Mythen3]
@ -898,6 +896,18 @@ class Detector {
* * * *
* ************************************************/ * ************************************************/
/** [Gotthard2] only in burst mode and auto timing mode */
Result<int64_t> getNumberOfBursts(Positions pos = {}) const;
/** [Gotthard2] only in burst mode and auto timing mode */
void setNumberOfBursts(int64_t value);
/** [Gotthard2] only in burst mode and auto timing mode */
Result<ns> getBurstPeriod(Positions pos = {}) const;
/** [Gotthard2] only in burst mode and auto timing mode */
void setBurstPeriod(ns value, Positions pos = {});
/** [Gotthard2] offset channel, increment channel */ /** [Gotthard2] offset channel, increment channel */
Result<std::array<int, 2>> getInjectChannel(Positions pos = {}); Result<std::array<int, 2>> getInjectChannel(Positions pos = {});

View File

@ -572,9 +572,11 @@ class CmdProxy {
{"acquire", &CmdProxy::acquire}, {"acquire", &CmdProxy::acquire},
{"frames", &CmdProxy::frames}, {"frames", &CmdProxy::frames},
{"triggers", &CmdProxy::triggers}, {"triggers", &CmdProxy::triggers},
{"bursts", &CmdProxy::bursts},
{"exptime", &CmdProxy::exptime}, {"exptime", &CmdProxy::exptime},
{"period", &CmdProxy::period}, {"period", &CmdProxy::period},
{"delay", &CmdProxy::delay}, {"delay", &CmdProxy::delay},
{"burstperiod", &CmdProxy::burstperiod},
{"framesl", &CmdProxy::framesl}, {"framesl", &CmdProxy::framesl},
{"triggersl", &CmdProxy::triggersl}, {"triggersl", &CmdProxy::triggersl},
{"delayl", &CmdProxy::delayl}, {"delayl", &CmdProxy::delayl},
@ -1017,6 +1019,10 @@ class CmdProxy {
std::stol, std::stol,
"[n_triggers]\n\tNumber of triggers per aquire. Use timing command to set timing mode."); "[n_triggers]\n\tNumber of triggers per aquire. Use timing command to set timing mode.");
INTEGER_COMMAND_NOID(bursts, getNumberOfBursts, setNumberOfBursts,
std::stol,
"[n_bursts]\n\t[Gotthard2] Number of bursts per aquire. Only in auto timing mode and burst mode. Use timing command to set timing mode and burstmode command to set burst mode.");
TIME_COMMAND(exptime, getExptime, setExptime, TIME_COMMAND(exptime, getExptime, setExptime,
"[duration] [(optional unit) ns|us|ms|s]\n\tExposure time" "[duration] [(optional unit) ns|us|ms|s]\n\tExposure time"
"\n\t[Gotthard2] Uploaded to detector just before acquisition starts"); "\n\t[Gotthard2] Uploaded to detector just before acquisition starts");
@ -1026,8 +1032,10 @@ class CmdProxy {
"\n\t[Gotthard2] Uploaded to detector just before acquisition starts"); "\n\t[Gotthard2] Uploaded to detector just before acquisition starts");
TIME_COMMAND(delay, getDelayAfterTrigger, setDelayAfterTrigger, TIME_COMMAND(delay, getDelayAfterTrigger, setDelayAfterTrigger,
"[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb] Delay after trigger" "[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb] Delay after trigger");
"\n\t[Gotthard2] only in continuous mode.");
TIME_COMMAND(burstperiod, getBurstPeriod, setBurstPeriod,
"[duration] [(optional unit) ns|us|ms|s]\n\t[Gotthard2] Burst period. Only in burst mode and auto timing mode.");
GET_COMMAND(framesl, getNumberOfFramesLeft, GET_COMMAND(framesl, getNumberOfFramesLeft,
"\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] Number of frames left in acquisition." "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] Number of frames left in acquisition."

View File

@ -1160,6 +1160,22 @@ void Detector::setImageTestMode(int value, Positions pos) {
// Gotthard2 Specific // Gotthard2 Specific
Result<int64_t> Detector::getNumberOfBursts(Positions pos) const {
return pimpl->Parallel(&slsDetector::getNumberOfBursts, pos);
}
void Detector::setNumberOfBursts(int64_t value) {
pimpl->Parallel(&slsDetector::setNumberOfBursts, {}, value);
}
Result<ns> Detector::getBurstPeriod(Positions pos) const {
return pimpl->Parallel(&slsDetector::getBurstPeriod, pos);
}
void Detector::setBurstPeriod(ns value, Positions pos) {
pimpl->Parallel(&slsDetector::setBurstPeriod, pos, value.count());
}
Result<std::array<int, 2>> Detector::getInjectChannel(Positions pos) { Result<std::array<int, 2>> Detector::getInjectChannel(Positions pos) {
return pimpl->Parallel(&slsDetector::getInjectChannel, pos); return pimpl->Parallel(&slsDetector::getInjectChannel, pos);
} }

View File

@ -877,24 +877,12 @@ void DetectorImpl::registerDataCallback(void (*userCallback)(detectorData *,
} }
double DetectorImpl::setTotalProgress() { double DetectorImpl::setTotalProgress() {
int64_t nf = Parallel(&slsDetector::getNumberOfFramesFromShm, {}) int64_t tot = Parallel(&slsDetector::getTotalNumFramesToReceive, {})
.tsquash("Inconsistent number of frames"); .tsquash("Inconsistent number of total frames (#frames x #triggers(or bursts) x #storage cells)");
int64_t nc = Parallel(&slsDetector::getNumberOfTriggersFromShm, {}) if (tot == 0) {
.tsquash("Inconsistent number of triggers"); throw RuntimeError("Invalid Total Number of frames (0)");
if (nf == 0 || nc == 0) {
throw RuntimeError("Number of frames or triggers is 0");
} }
totalProgress = tot;
int ns = 1;
if (multi_shm()->multiDetectorType == JUNGFRAU) {
ns =
Parallel(&slsDetector::getNumberOfAdditionalStorageCellsFromShm, {})
.tsquash("Inconsistent number of additional storage cells");
++ns;
}
totalProgress = nf * nc * ns;
FILE_LOG(logDEBUG1) << "nf " << nf << " nc " << nc << " ns " << ns;
FILE_LOG(logDEBUG1) << "Set total progress " << totalProgress << std::endl; FILE_LOG(logDEBUG1) << "Set total progress " << totalProgress << std::endl;
return totalProgress; return totalProgress;
} }

View File

@ -338,7 +338,10 @@ void slsDetector::initializeDetectorStructure(detectorType type) {
shm()->currentThresholdEV = -1; shm()->currentThresholdEV = -1;
shm()->nFrames = 1; shm()->nFrames = 1;
shm()->nTriggers = 1; shm()->nTriggers = 1;
shm()->nBursts = 1;
shm()->nAddStorageCells = 0; shm()->nAddStorageCells = 0;
shm()->timingMode = AUTO_TIMING;
shm()->burstMode = BURST_INTERNAL;
shm()->deadTime = 0; shm()->deadTime = 0;
sls::strcpy_safe(shm()->rxHostname, "none"); sls::strcpy_safe(shm()->rxHostname, "none");
shm()->rxTCPPort = DEFAULT_PORTNO + 2; shm()->rxTCPPort = DEFAULT_PORTNO + 2;
@ -756,8 +759,8 @@ void slsDetector::updateCachedDetectorVariables() {
n += client.Receive(&i64, sizeof(i64)); n += client.Receive(&i64, sizeof(i64));
shm()->nFrames = i64; shm()->nFrames = i64;
// storage cell
if (shm()->myDetectorType == JUNGFRAU) { if (shm()->myDetectorType == JUNGFRAU) {
// storage cell
n += client.Receive(&i64, sizeof(i64)); n += client.Receive(&i64, sizeof(i64));
shm()->nAddStorageCells = i64; shm()->nAddStorageCells = i64;
} }
@ -766,6 +769,22 @@ void slsDetector::updateCachedDetectorVariables() {
n += client.Receive(&i64, sizeof(i64)); n += client.Receive(&i64, sizeof(i64));
shm()->nTriggers = i64; shm()->nTriggers = i64;
// bursts
if (shm()->myDetectorType == GOTTHARD2) {
n += client.Receive(&i64, sizeof(i64));
shm()->nBursts = i64;
}
// timing mode
n += client.Receive(&i32, sizeof(i32));
shm()->timingMode = static_cast<timingMode>(i32);
// burst mode
if (shm()->myDetectorType == GOTTHARD2) {
n += client.Receive(&i32, sizeof(i32));
shm()->burstMode = static_cast<burstMode>(i32);
}
// readout mode // readout mode
if (shm()->myDetectorType == CHIPTESTBOARD) { if (shm()->myDetectorType == CHIPTESTBOARD) {
n += client.Receive(&i32, sizeof(i32)); n += client.Receive(&i32, sizeof(i32));
@ -1200,25 +1219,31 @@ uint64_t slsDetector::getStartingFrameNumber() {
return retval; return retval;
} }
int64_t slsDetector::getTotalNumFramesToReceive() {
int64_t repeats = shm()->nTriggers;
// gotthard2 & auto & burst mode, use nBursts instead of nTriggers
if (shm()->myDetectorType == GOTTHARD2) {
if (shm()->burstMode != BURST_OFF && shm()->timingMode == AUTO_TIMING) {
repeats = shm()->nBursts;
}
}
return (shm()->nFrames * repeats * (int64_t)(shm()->nAddStorageCells + 1));
}
void slsDetector::sendTotalNumFramestoReceiver() { void slsDetector::sendTotalNumFramestoReceiver() {
if (shm()->useReceiverFlag) { if (shm()->useReceiverFlag) {
int64_t arg = shm()->nFrames * shm()->nTriggers * (shm()->nAddStorageCells + 1); int64_t arg = getTotalNumFramesToReceive();
FILE_LOG(logDEBUG1) << "Sending total number of frames (#f x #t x #s) to Receiver: " << arg; FILE_LOG(logDEBUG1) << "Sending total number of frames (#f x #t x #s) to Receiver: " << arg;
sendToReceiver(F_RECEIVER_SET_NUM_FRAMES, arg, nullptr); sendToReceiver(F_RECEIVER_SET_NUM_FRAMES, arg, nullptr);
} }
} }
int64_t slsDetector::getNumberOfFramesFromShm() {
return shm()->nFrames;
}
int64_t slsDetector::getNumberOfFrames() { int64_t slsDetector::getNumberOfFrames() {
int64_t prevVal = shm()->nFrames;
int64_t retval = -1; int64_t retval = -1;
sendToDetector(F_GET_NUM_FRAMES, nullptr, retval); sendToDetector(F_GET_NUM_FRAMES, nullptr, retval);
FILE_LOG(logDEBUG1) << "number of frames :" << retval; FILE_LOG(logDEBUG1) << "number of frames :" << retval;
shm()->nFrames = retval; if (shm()->nFrames != retval) {
if (prevVal != retval) { shm()->nFrames = retval;
sendTotalNumFramestoReceiver(); sendTotalNumFramestoReceiver();
} }
return shm()->nFrames; return shm()->nFrames;
@ -1231,17 +1256,12 @@ void slsDetector::setNumberOfFrames(int64_t value) {
sendTotalNumFramestoReceiver(); sendTotalNumFramestoReceiver();
} }
int64_t slsDetector::getNumberOfTriggersFromShm() {
return shm()->nTriggers;
}
int64_t slsDetector::getNumberOfTriggers() { int64_t slsDetector::getNumberOfTriggers() {
int64_t prevVal = shm()->nTriggers;
int64_t retval = -1; int64_t retval = -1;
sendToDetector(F_GET_NUM_TRIGGERS, nullptr, retval); sendToDetector(F_GET_NUM_TRIGGERS, nullptr, retval);
FILE_LOG(logDEBUG1) << "number of triggers :" << retval; FILE_LOG(logDEBUG1) << "number of triggers :" << retval;
shm()->nTriggers = retval; if (shm()->nTriggers != retval) {
if (prevVal != retval) { shm()->nTriggers = retval;
sendTotalNumFramestoReceiver(); sendTotalNumFramestoReceiver();
} }
return shm()->nTriggers; return shm()->nTriggers;
@ -1254,8 +1274,22 @@ void slsDetector::setNumberOfTriggers(int64_t value) {
sendTotalNumFramestoReceiver(); sendTotalNumFramestoReceiver();
} }
int slsDetector::getNumberOfAdditionalStorageCellsFromShm() { int64_t slsDetector::getNumberOfBursts() {
return shm()->nAddStorageCells; int64_t retval = -1;
sendToDetector(F_GET_NUM_BURSTS, nullptr, retval);
FILE_LOG(logDEBUG1) << "number of bursts :" << retval;
if (shm()->nBursts != retval) {
shm()->nBursts = retval;
sendTotalNumFramestoReceiver();
}
return shm()->nBursts;
}
void slsDetector::setNumberOfBursts(int64_t value) {
FILE_LOG(logDEBUG1) << "Setting number of bursts to " << value;
sendToDetector(F_SET_NUM_BURSTS, value, nullptr);
shm()->nBursts = value;
sendTotalNumFramestoReceiver();
} }
int slsDetector::getNumberOfAdditionalStorageCells() { int slsDetector::getNumberOfAdditionalStorageCells() {
@ -1367,6 +1401,18 @@ void slsDetector::setDelayAfterTrigger(int64_t value) {
sendToDetector(F_SET_DELAY_AFTER_TRIGGER, value, nullptr); sendToDetector(F_SET_DELAY_AFTER_TRIGGER, value, nullptr);
} }
int64_t slsDetector::getBurstPeriod() {
int64_t retval = -1;
sendToDetector(F_GET_BURST_PERIOD, nullptr, retval);
FILE_LOG(logDEBUG1) << "burst period :" << retval << "ns";
return retval;
}
void slsDetector::setBurstPeriod(int64_t value) {
FILE_LOG(logDEBUG1) << "Setting burst period to " << value << "ns";
sendToDetector(F_SET_BURST_PERIOD, value, nullptr);
}
int64_t slsDetector::getSubExptime() { int64_t slsDetector::getSubExptime() {
int64_t retval = -1; int64_t retval = -1;
sendToDetector(F_GET_SUB_EXPTIME, nullptr, retval); sendToDetector(F_GET_SUB_EXPTIME, nullptr, retval);
@ -1498,6 +1544,7 @@ slsDetectorDefs::timingMode slsDetector::setTimingMode(timingMode value) {
FILE_LOG(logDEBUG1) << "Setting communication to mode " << value; FILE_LOG(logDEBUG1) << "Setting communication to mode " << value;
sendToDetector(fnum, static_cast<int>(value), retval); sendToDetector(fnum, static_cast<int>(value), retval);
FILE_LOG(logDEBUG1) << "Timing Mode: " << retval; FILE_LOG(logDEBUG1) << "Timing Mode: " << retval;
shm()->timingMode = retval;
return retval; return retval;
} }
@ -2488,13 +2535,15 @@ slsDetectorDefs::burstMode slsDetector::getBurstMode() {
int retval = -1; int retval = -1;
sendToDetector(F_GET_BURST_MODE, nullptr, retval); sendToDetector(F_GET_BURST_MODE, nullptr, retval);
FILE_LOG(logDEBUG1) << "Burst mode:" << retval; FILE_LOG(logDEBUG1) << "Burst mode:" << retval;
return static_cast<slsDetectorDefs::burstMode>(retval); shm()->burstMode = static_cast<slsDetectorDefs::burstMode>(retval);
return shm()->burstMode;
} }
void slsDetector::setBurstMode(slsDetectorDefs::burstMode value) { void slsDetector::setBurstMode(slsDetectorDefs::burstMode value) {
int arg = static_cast<int>(value); int arg = static_cast<int>(value);
FILE_LOG(logDEBUG1) << "Setting burst mode to " << arg; FILE_LOG(logDEBUG1) << "Setting burst mode to " << arg;
sendToDetector(F_SET_BURST_MODE, arg, nullptr); sendToDetector(F_SET_BURST_MODE, arg, nullptr);
shm()->burstMode = value;
} }
int slsDetector::setCounterBit(int cb) { int slsDetector::setCounterBit(int cb) {

View File

@ -13,7 +13,7 @@
class ServerInterface; class ServerInterface;
#define SLS_SHMAPIVERSION 0x190726 #define SLS_SHMAPIVERSION 0x190726
#define SLS_SHMVERSION 0x191127 #define SLS_SHMVERSION 0x200225
/** /**
* @short structure allocated in shared memory to store detector settings for * @short structure allocated in shared memory to store detector settings for
@ -86,9 +86,18 @@ struct sharedSlsDetector {
/** number of triggers */ /** number of triggers */
int64_t nTriggers; int64_t nTriggers;
/** number of bursts */
int64_t nBursts;
/** number of additional storage cells */ /** number of additional storage cells */
int nAddStorageCells; int nAddStorageCells;
/** timing mode */
slsDetectorDefs::timingMode timingMode;
/** burst mode */
slsDetectorDefs::burstMode burstMode;
/** rate correction in ns */ /** rate correction in ns */
int64_t deadTime; int64_t deadTime;
@ -521,22 +530,23 @@ class slsDetector : public virtual slsDetectorDefs {
*/ */
uint64_t getStartingFrameNumber(); uint64_t getStartingFrameNumber();
void sendTotalNumFramestoReceiver(); int64_t getTotalNumFramesToReceive();
int64_t getNumberOfFramesFromShm(); void sendTotalNumFramestoReceiver();
int64_t getNumberOfFrames(); int64_t getNumberOfFrames();
void setNumberOfFrames(int64_t value); void setNumberOfFrames(int64_t value);
int64_t getNumberOfTriggersFromShm();
int64_t getNumberOfTriggers(); int64_t getNumberOfTriggers();
void setNumberOfTriggers(int64_t value); void setNumberOfTriggers(int64_t value);
/** [Jungfrau] Advanced */ /** [Gotthard2] only in burst mode and in auto timing mode */
int getNumberOfAdditionalStorageCellsFromShm(); int64_t getNumberOfBursts();
/** [Gotthard2] only in burst mode and in auto timing mode */
void setNumberOfBursts(int64_t value);
/** [Jungfrau] Advanced */ /** [Jungfrau] Advanced */
int getNumberOfAdditionalStorageCells(); int getNumberOfAdditionalStorageCells();
@ -564,14 +574,18 @@ class slsDetector : public virtual slsDetectorDefs {
void setPeriod(int64_t value); void setPeriod(int64_t value);
/** [Gotthard][Jungfrau][CTB][Mythen3] /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */
* [Gotthard2] only in continuous mode */
int64_t getDelayAfterTrigger(); int64_t getDelayAfterTrigger();
/** [Gotthard][Jungfrau][CTB][Mythen3] /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */
* [Gotthard2] only in continuous mode */
void setDelayAfterTrigger(int64_t value); void setDelayAfterTrigger(int64_t value);
/** [Gotthard2] only in burst mode and in auto timing mode */
int64_t getBurstPeriod();
/** [Gotthard2] only in burst mode and in auto timing mode */
void setBurstPeriod(int64_t value);
/** [Eiger] in 32 bit mode */ /** [Eiger] in 32 bit mode */
int64_t getSubExptime(); int64_t getSubExptime();

View File

@ -227,3 +227,58 @@ TEST_CASE("inj_ch", "[.cmd]") {
REQUIRE_THROWS(proxy.Call("inj_ch", {}, -1, GET)); REQUIRE_THROWS(proxy.Call("inj_ch", {}, -1, GET));
} }
} }
TEST_CASE("bursts", "[.cmd]") {
Detector det;
CmdProxy proxy(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::GOTTHARD2) {
auto previous = det.getNumberOfBursts().squash(1);
auto previousTrigger = det.getNumberOfTriggers().squash(1);
std::ostringstream oss_set, oss_get;
proxy.Call("bursts", {"3"}, -1, PUT, oss_set);
REQUIRE(oss_set.str() == "bursts 3\n");
// change to trigger and back (bursts should still be same)
proxy.Call("timing", {"trigger"}, -1, PUT);
proxy.Call("triggers", {"2"}, -1, PUT);
proxy.Call("timing", {"auto"}, -1, PUT);
proxy.Call("bursts", {}, -1, GET, oss_get);
REQUIRE(oss_get.str() == "bursts 3\n");
det.setNumberOfBursts(previous);
det.setNumberOfTriggers(previousTrigger);
} else {
REQUIRE_THROWS(proxy.Call("bursts", {}, -1, GET));
}
}
TEST_CASE("burstperiod", "[.cmd]") {
Detector det;
CmdProxy proxy(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::GOTTHARD2) {
auto previous = det.getBurstPeriod();
std::ostringstream oss_set, oss_get;
proxy.Call("burstperiod", {"30ms"}, -1, PUT, oss_set);
REQUIRE(oss_set.str() == "burstperiod 30ms\n");
proxy.Call("burstperiod", {}, -1, GET, oss_get);
REQUIRE(oss_get.str() == "burstperiod 30ms\n");
// Reset all dacs to previous value
for (int i = 0; i != det.size(); ++i) {
det.setBurstPeriod(previous[i], {i});
}
} else {
REQUIRE_THROWS(proxy.Call("burstperiod", {}, -1, GET));
}
}

View File

@ -188,9 +188,14 @@ enum detFuncs{
F_GET_ADC_ENABLE_MASK_10G, F_GET_ADC_ENABLE_MASK_10G,
F_SET_COUNTER_MASK, F_SET_COUNTER_MASK,
F_GET_COUNTER_MASK, F_GET_COUNTER_MASK,
NUM_DET_FUNCTIONS, F_GET_NUM_BURSTS,
F_SET_NUM_BURSTS,
F_GET_BURST_PERIOD,
F_SET_BURST_PERIOD,
NUM_DET_FUNCTIONS,
RECEIVER_ENUM_START = 256, /**< detector function should not exceed this (detector server should not compile anyway) */ RECEIVER_ENUM_START = 256, /**< detector function should not exceed this (detector server should not compile anyway) */
F_EXEC_RECEIVER_COMMAND, F_EXEC_RECEIVER_COMMAND,
F_EXIT_RECEIVER, F_EXIT_RECEIVER,
F_LOCK_RECEIVER, F_LOCK_RECEIVER,
@ -443,6 +448,10 @@ static const char* getFunctionNameFromEnum(enum detFuncs func) {
case F_GET_ADC_ENABLE_MASK_10G: return "F_GET_ADC_ENABLE_MASK_10G"; case F_GET_ADC_ENABLE_MASK_10G: return "F_GET_ADC_ENABLE_MASK_10G";
case F_SET_COUNTER_MASK: return "F_SET_COUNTER_MASK"; case F_SET_COUNTER_MASK: return "F_SET_COUNTER_MASK";
case F_GET_COUNTER_MASK: return "F_GET_COUNTER_MASK"; case F_GET_COUNTER_MASK: return "F_GET_COUNTER_MASK";
case F_GET_NUM_BURSTS: return "F_GET_NUM_BURSTS";
case F_SET_NUM_BURSTS: return "F_SET_NUM_BURSTS";
case F_GET_BURST_PERIOD: return "F_GET_BURST_PERIOD";
case F_SET_BURST_PERIOD: return "F_SET_BURST_PERIOD";
case NUM_DET_FUNCTIONS: return "NUM_DET_FUNCTIONS"; case NUM_DET_FUNCTIONS: return "NUM_DET_FUNCTIONS";
case RECEIVER_ENUM_START: return "RECEIVER_ENUM_START"; case RECEIVER_ENUM_START: return "RECEIVER_ENUM_START";

View File

@ -9,4 +9,4 @@
#define APIJUNGFRAU 0x200131 #define APIJUNGFRAU 0x200131
#define APIMOENCH 0x200131 #define APIMOENCH 0x200131
#define APIMYTHEN3 0x200224 #define APIMYTHEN3 0x200224
#define APIGOTTHARD2 0x200224 #define APIGOTTHARD2 0x200226