Commit 73fdd859 authored by Cristina Cocho's avatar Cristina Cocho

Merge branch 'V3.2_191' of https://code.ill.fr/instrument-control/nomad-modules into V3.2_191

parents 5ee983a1 7f7c476d
......@@ -110,8 +110,6 @@ void KineticAcquisitionController::writeParams() {
if (isModeChanged() == true) {
cout << " KineticAcquisitionController::writeParams KineticAcquisitionController::writeParams "<< endl;
if (useMasterAcq() == true) {
m_MasterAcqDriver->acqMode.setpoint = m_AcquisitionMode;
// this is to force the block to be valid and variable.
......
......@@ -97,7 +97,8 @@ KineticSettings::KineticSettings(const string& name) :
slices.init(this, NOSAVE, "slices");
slicesNX.init(this, NOSAVE, "slicesNX");
progression.init(this, NOSAVE, "progression");
maxSlices.init(this, NOSAVE, "max_slices");
maxSlices.init(this, SAVE, "max_slices");
maxSlices.update(450);
m_NumberOfSlices = 1;
m_Preset = 1;
......@@ -440,7 +441,7 @@ void KineticSettings::calculateSlices() throw (TwoMuchSlices, SliceTooBig) {
m_NumberOfSlices = 0;
m_CalculatedTotal = 0;
t = m_First;
int32 maxNumberOfSlices = 500;
int32 maxNumberOfSlices = maxSlices();
while (((m_CalculatedTotal - m_RoughlyTotal) < 1e-8) && (m_NumberOfSlices < maxNumberOfSlices)) {
t = pow(m_Increment, (float64) m_NumberOfSlices) * m_First;
if (t < 11e-9) {
......@@ -515,7 +516,7 @@ void KineticSettings::calculateSlices() throw (TwoMuchSlices, SliceTooBig) {
*/
void KineticSettings::setSlicesArray(int32 size) throw (TwoMuchSlices) {
int32 maxNumberOfSlices = 500;
int32 maxNumberOfSlices = maxSlices();
if (size > maxNumberOfSlices) {
......@@ -548,7 +549,7 @@ void KineticSettings::setSlicesArray(int32 size) throw (TwoMuchSlices) {
*/
void KineticSettings::showSlices() {
for (int32 i = 0; i < m_NumberOfSlices; ++i) {
cout << "Slice[" << i << "] = " << m_Slices[i] << endl;
// cout << "Slice[" << i << "] = " << m_Slices[i] << endl;
}
}
......@@ -693,7 +694,6 @@ void KineticSettings::save() throw (CannotOpenOutputFile) {
* postConfiguration
*/
void KineticSettings::postConfiguration() {
updateValue(MAX_SLICES_PROPERTY, 450);
}
/*
......
......@@ -5,7 +5,7 @@
<property name="mode" type="Long">
</property>
<property name="max_slices" type="Long" max_length="4">
<property name="max_slices" type="Long" max_length="5">
</property>
<property name="preset" type="Double" max_length="10">
......@@ -69,7 +69,7 @@
</property>
<property name="enter_mode" type="long"/>
<property name="number_of_slices" type="long" max_length="3"/>
<property name="number_of_slices" type="long" max_length="5"/>
<property name="slices" type="doublearray">
</property>
......
......@@ -119,4 +119,15 @@ scan_axis.remainingTimeSecondsSuffix=s
scan_axis.controllerHeader=Controller
scan_axis.propertyHeader=Property
scan_axis.stepHeader=Step
scan_axis.valueHeader=Value
\ No newline at end of file
scan_axis.valueHeader=Value
scan_axis.helpTitle=Help about modes
scan_axis.modeDeltaHelp=Set reference and delta values, then choose how values are distributed around reference (left
scan_axis.modeDeltaHelp2=, center
scan_axis.modeDeltaHelp3=or right
scan_axis.modeDeltaHelp4=) and a number of steps.
scan_axis.modeIntervalHelp=Set start and end values, then choose between a step value
scan_axis.modeIntervalHelp2=or a number of steps
scan_axis.modeFlipHelp=Set down and up values.
......@@ -106,6 +106,39 @@
</switchable_composite>
<newLine/>
<newLine/>
<group title="scan_axis.helpTitle">
<table_composite nbColumns="2">
<simple_image prefix="MODE_DELTA"/>
<composite>
<simple_label prefix="scan_axis.modeDeltaHelp"/>
<simple_image prefix="DELTA_LEFT"/>
<simple_label prefix="scan_axis.modeDeltaHelp2"/>
<simple_image prefix="DELTA_CENTER"/>
<simple_label prefix="scan_axis.modeDeltaHelp3"/>
<simple_image prefix="DELTA_RIGHT"/>
<simple_label prefix="scan_axis.modeDeltaHelp4"/>
</composite>
<simple_image prefix="MODE_INTERVAL"/>
<composite>
<simple_label prefix="scan_axis.modeIntervalHelp"/>
<simple_image prefix="MODE_DELTA"/>
<simple_label prefix="scan_axis.modeIntervalHelp2"/>
<simple_image prefix="NB_POINTS_FOR_LOOP"/>
</composite>
<simple_image prefix="MODE_FLIP"/>
<simple_label prefix="scan_axis.modeFlipHelp"/>
</table_composite>
</group>
<summary>
<summary_content>
<dynamic_composite role="scan_axis1" properties="controller,actual_step,n_steps">
......
......@@ -44,17 +44,18 @@ LadiController::LadiController(const string& name) :
registerFunction(TYPE);
drumPosition.init(this, NOSAVE, "drumPosition");
drumSpeed.init(this, NOSAVE, "drumSpeed");
drumPosition.init(this, NOSAVE | SPY, "drumPosition");
drumSpeed.init(this, NOSAVE | SPY, "drumSpeed");
drumDacCommand.init(this, NOSAVE, "drumDacCommand");
headPosition.init(this, NOSAVE, "headPosition");
headPosition.init(this, NOSAVE | SPY, "headPosition");
adcNbTriggersCounter.init(this, NOSAVE, "adcNbTriggersCounter");
readingAcqLine.init(this, NOSAVE| SPY, "readingAcqLine");
adcPMT.init(this, NOSAVE, "adcPMT");
nbWordsInDDR.init(this, NOSAVE, "nbWordsInDDR");
adcPhotodiode.init(this, NOSAVE, "adcPhotodiode");
adcTemperature.init(this, NOSAVE, "adcTemperature");
adcPhotodiode.init(this, NOSAVE| SPY, "adcPhotodiode");
adcTemperature.init(this, NOSAVE| SPY, "adcTemperature");
eraseProgression.init(this, NOSAVE| SPY, "eraseProgression");
readingDataProgression.init(this, NOSAVE| SPY, "readingDataProgression");
drumAcquisitionSpeed.init(this, SAVE, "drumAcquisitionSpeed");
readingInitialPoint.init(this, SAVE, "readingInitialPoint");
......@@ -72,6 +73,11 @@ LadiController::LadiController(const string& name) :
detectorHighVoltage.init(this, SAVE, "detector_high_voltage");
minNbAcquisitionLines.init(this, NOSAVE, "minNbAcquisitionLines");
minNbAcquisitionLines.update(1);
safetyState.init(this, NOSAVE | SPY, "safetyState");
m_GateOn = false;
m_ShutterState = 0x2;
......@@ -134,17 +140,21 @@ void LadiController::postConfiguration() {
* refreshReadingPixelSize
*/
void LadiController::refreshReadingPixelSize(int32 value) throw (CannotSetValue) {
if (value == 100) {
maxNbAcquisitionLines.update(3600);
if (value == 50) {
m_LadiDriver->nbEncoderStepsBetweenADCSamples = 3;
maxNbAcquisitionLines.update(600);
}
else if (value == 100) {
m_LadiDriver->nbEncoderStepsBetweenADCSamples = 18;
maxNbAcquisitionLines.update(3600);
}
else if (value == 200) {
maxNbAcquisitionLines.update(1800);
m_LadiDriver->nbEncoderStepsBetweenADCSamples = 36;
maxNbAcquisitionLines.update(1800);
}
else if (value == 400) {
maxNbAcquisitionLines.update(900);
m_LadiDriver->nbEncoderStepsBetweenADCSamples = 72;
maxNbAcquisitionLines.update(900);
}
else {
throw CannotSetValue();
......@@ -157,7 +167,10 @@ void LadiController::refreshReadingPixelSize(int32 value) throw (CannotSetValue)
void LadiController::updateNbAcquistionLines() {
int32 xsize, ysize;
ysize = nbAcquisitionLines();
if (readingYPixelSize() == 100) {
if (readingYPixelSize() == 50) {
xsize = 60000;
}
else if (readingYPixelSize() == 100) {
xsize = 10000;
}
else if (readingYPixelSize() == 200) {
......@@ -221,8 +234,8 @@ void LadiController::start() {
}
} catch (...) {
commandStatus.setError();
commandProgression = 100;
}
commandProgression = 100;
ladiMessage = "Finished";
}
......@@ -272,11 +285,11 @@ void LadiController::postStart() {
void LadiController::onHighVoltage() {
cout << "onHighVoltage" << endl;
if (m_DetectorHV->commandStatus.isRunning()) {
m_DetectorHV->stopCommand(true);
m_DetectorHV->stopCommand(false);
}
try {
m_DetectorHV->voltage.setpoint = detectorHighVoltage();
m_DetectorHV->startCommand(true);
m_DetectorHV->startCommand(false);
m_ShutterState &= ~0x4;
m_ShutterState |= 4;
m_LadiDriver->shutterState = m_ShutterState;
......@@ -290,12 +303,12 @@ void LadiController::onHighVoltage() {
void LadiController::offHighVoltage() {
cout << "offHighVoltage" << endl;
if (m_DetectorHV->commandStatus.isRunning()) {
m_DetectorHV->stopCommand(true);
m_DetectorHV->stopCommand(false);
}
if (fabs(m_DetectorHV->voltage()) > 2) {
try {
m_DetectorHV->voltage.setpoint = 0;
m_DetectorHV->startCommand(true);
m_DetectorHV->startCommand(false);
m_ShutterState &= ~0x4;
m_LadiDriver->shutterState = m_ShutterState;
m_LadiDriver.executeParallel(ladicontrol::LadiControlDriver::SET_SHUTTER);
......@@ -312,11 +325,11 @@ void LadiController::offHighVoltage() {
void LadiController::openShutter() {
cout << "openShutter" << endl;
if (m_Shutter->isStarted()) {
m_Shutter->stopCommand(true);
m_Shutter->stopCommand(false);
}
m_Shutter->setOpen();
m_Shutter->timedOut = 5;
m_Shutter->startCommand(true);
m_Shutter->startCommand(false);
if (m_Shutter->commandStatus.isIdle() == false) {
log(Level::s_Error) << "Shutter opening timed out, stop current acquisition" << endlog;
stopParallel(true);
......@@ -335,11 +348,11 @@ void LadiController::openShutter() {
void LadiController::closeShutter() {
cout << "closeShutter" << endl;
if (m_Shutter->isStarted()) {
m_Shutter->stopCommand(true);
m_Shutter->stopCommand(false);
}
m_Shutter->setClose();
m_Shutter->timedOut = 5;
m_Shutter->startCommand(true);
m_Shutter->startCommand(false);
if (m_Shutter->commandStatus.isIdle() == false) {
log(Level::s_Error) << "Shutter closing timed out" << endlog;
}
......@@ -391,6 +404,7 @@ void LadiController::updateAdcNbTriggersCounter() {
*/
void LadiController::updateReadingAcqLine() {
readingAcqLine.update(m_LadiDriver->readingAcqLine());
readingDataProgression.update((int32) ((float64) readingAcqLine() / (float64) nbAcquisitionLines() * 100.));
}
/*
......@@ -425,8 +439,7 @@ void LadiController::updateAdcTemperature() {
* updateEraseTime
*/
void LadiController::updateEraseTime() {
int32 prog = (int32) (100.
- (m_LadiDriver->eraseTimeValue() - m_LadiDriver->actualEraseTime()) / m_LadiDriver->eraseTimeValue());
int32 prog = (int32) (m_LadiDriver->actualEraseTime() / m_LadiDriver->eraseTimeValue() * 100.);
if (prog > 100) {
prog = 100;
}
......@@ -441,8 +454,17 @@ void LadiController::updateLadiDriverStatus() {
ladiStatus.update(status);
if (isStarted() == true) {
cout << "updateLadiDriverStatus : status 0x" << hex << status << dec << endl;
if (status & ladicontrol::SAFETY_RACK_OK_STATUS) {
// Abort
safetyState.update(1);
}
if (!(status & ladicontrol::SAFETY_RACK_OK_STATUS)) {
// Abort
safetyState.update(0);
}
if (status & ladicontrol::DRUM_MOVED_ABORT_ACQ_STATUS) {
// Abort
log(Level::s_Error) << "Drum moved during exposition" << endlog;
stopParallel(true);
}
// Nicolas prefere ne pas arreter
......@@ -451,11 +473,9 @@ void LadiController::updateLadiDriverStatus() {
// stopParallel(true);
// }
if (status & ladicontrol::RUNNING_ERASE_DRUM_STATUS) {
// Abort
ladiMessage.update("Erasing");
}
else if (status & ladicontrol::RUNNING_DRUM_POSITIONING_STATUS) {
// Abort
ladiMessage.update("Drum Positionning");
}
else if (status & ladicontrol::ACQUISITION_READ_DRUM_ON_STATUS) {
......
......@@ -58,7 +58,7 @@ public:
/*!
* Properties
*/
Property<int32> drumPosition;
Property<float64> drumPosition;
Property<float64> drumSpeed;
Property<float64> drumDacCommand;
Property<float64> headPosition;
......@@ -69,6 +69,7 @@ public:
Property<float64> adcPhotodiode;
Property<float64> adcTemperature;
Property<int32> eraseProgression;
Property<int32> readingDataProgression;
Property<float64> drumAcquisitionSpeed;
Property<float64> readingInitialPoint;
......@@ -77,7 +78,7 @@ public:
Property<int32> maxNbAcquisitionLines;
Property<bool> enableAverage;
Property<float64> drumSpeedErase;
Property<int32> drumErrorPositioningTolerance;
Property<float64> drumErrorPositioningTolerance;
Property<float64> eraseTimeValue;
Property<std::string> eraseTimeType;
......@@ -86,6 +87,9 @@ public:
Property<int32> ladiStatus;
Property<std::string> ladiMessage;
Property<int32> minNbAcquisitionLines;
Property<int32> safetyState;
/*!
* \brief Method called before changing the property value
* This method is called after setting configuration during the creation of controller.
......
......@@ -3,6 +3,9 @@ ladi_controller.umeter=~mum
ladi_controller.second=s
ladi_controller.volt=V
ladi_controller.mmeter=mm
ladi_controller.degree=~degree
ladi_controller.watt=w
ladi_controller.degreeC=~degreeC
ladi_controller.drumAcquisitionSpeedPrefix=Drum acquisition Speed
ladi_controller.drumSpeedErasePrefix=Drum speed erase
......@@ -20,24 +23,27 @@ ladi_controller.enableAveragePrefix=Enable average
ladi_controller.enableAverageCheckedValue=true
ladi_controller.enableAverageUncheckedValue=false
ladi_controller.drumPositionPrefix=Drum position:
ladi_controller.drumSpeedPrefix=Drum speed:
ladi_controller.drumDacCommandPrefix=Drum DAC command:
ladi_controller.headPositionPrefix=Head position:
ladi_controller.adcNbTriggersCounterPrefix=ADC Nb triggers counter:
ladi_controller.readingAcqLinePrefix=Reading acq line:
ladi_controller.adcPMTPrefix=ADC PMT:
ladi_controller.nbWordsInDDRPrefix=Nb words in DDR:
ladi_controller.drumPositionPrefix=Drum position
ladi_controller.drumSpeedPrefix=Drum speed
ladi_controller.drumDacCommandPrefix=Drum DAC command
ladi_controller.headPositionPrefix=Head position
ladi_controller.adcNbTriggersCounterPrefix=ADC Nb triggers counter
ladi_controller.readingAcqLinePrefix=Reading acq line
ladi_controller.adcPMTPrefix=ADC PMT
ladi_controller.nbWordsInDDRPrefix=Nb words in DDR
ladi_controller.adcPhotodiodePrefix=ADC photodiode
ladi_controller.adcTemperaturePrefix=Drum temperature
ladi_controller.eraseProgressionPrefix=Erase:
ladi_controller.readingDataProgressionPrefix=Reading Data:
ladi_controller.125umLabel=125 um
ladi_controller.250umLabel=250 um
ladi_controller.500umLabel=500 um
ladi_controller.fullLabel=Full
ladi_controller.125umValue=100
ladi_controller.250umValue=200
ladi_controller.500umValue=400
ladi_controller.fullValue=50
ladi_controller.safetyRackValue=1
ladi_controller.drumValue=2
......@@ -131,3 +137,6 @@ ladi_controller.runningImage=RUNNING_STATUS
ladi_controller.endImage=FINISHED_STATUS
ladi_controller.waitForStartImage=WARNING_STATUS
ladi_controller.wantedTimePrefix=Time
ladi_controller.runPrefix=Run
ladi_controller.actualTimePrefix=Now
<plugin>
<controller type="ladi_controller" role="ladi_controller1"/>
<number_of_lines nb_lines="1"/>
<property_switcher role="ladi_controller1" property="use_voltage" switcher_key="use_voltageSwitcher"/>
<property_switcher role="ladi_controller1" property="set_off" switcher_key="set_offSwitcher"/>
<switchable_composite switcher_key="use_voltageSwitcher" switch_values="true">
<check role="ladi_controller1" property="set_off" prefix="ladi_controller.setOffPrefix" checkBoxValues="ladi_controller.setOff"/>
</switchable_composite>
<switchable_composite switcher_key="set_offSwitcher" switch_values="false">
<text role="ladi_controller1" property="wanted_ladi_controller" prefix="ladi_controller.wantedCurrentCommandPrefix" suffix="ladi_controller.ladi_controllerSuffix"/>
<label role="ladi_controller1" property="actual_ladi_controller" prefix="ladi_controller.actualCurrentCommandPrefix" suffix="ladi_controller.ladi_controllerSuffix"/>
<switchable_composite switcher_key="use_voltageSwitcher" switch_values="true">
<text role="ladi_controller1" property="wanted_voltage" prefix="ladi_controller.wantedCurrentCommandPrefix" suffix="ladi_controller.voltSuffix"/>
<label role="ladi_controller1" property="actual_voltage" prefix="ladi_controller.actualCurrentCommandPrefix" suffix="ladi_controller.voltSuffix"/>
</switchable_composite>
<controller type="data_plot" role="data_plot1"/>
<number_of_lines nb_lines="3"/>
<property_switcher role="ladi_controller1" property="use_subtitle" switcher_key="use_subtitleSwitcher"/>
<switchable_composite switch_values="true" switcher_key="use_subtitleSwitcher">
<text role="ladi_controller1" property="subtitle" prefix="ladi_controller.subtitlePrefix"/>
</switchable_composite>
<plot_launcher role="data_plot1" data="detector_plot_data0" titleProperty="plot_name.0" xAxisTitleProperty="x_legend.0" yAxisTitleProperty="y_legend.0" height="20" spaceBefore="false"/>
<phase_composite phases="running,paused,finished">
<simple_label prefix="ladi_controller.numorPrefix"/>
<label role="ladi_controller1" property="numor" font_style="BOLD"/>
</phase_composite>
<newLine/>
<text role="ladi_controller1" property="eraseTimeValue" prefix="ladi_controller.eraseTimeValuePrefix"/>
<radio role="ladi_controller1" property="eraseTimeType" valuesAndLabels="ladi_controller.h,ladi_controller.m,ladi_controller.s" spaceBefore="false"/>
<text role="ladi_controller1" property="wanted_time" prefix="ladi_controller.exposureTimePrefix"/>
<radio role="ladi_controller1" property="time_type" valuesAndLabels="ladi_controller.h,ladi_controller.m,ladi_controller.s" spaceBefore="false"/>
<check role="ladi_controller1" property="savedata" prefix="ladi_controller.saveDataPrefix" checkBoxValues="ladi_controller.savedata"/>
<newLine/>
<construction>
<simple_image prefix="LEFT_TO_RIGHT_ARROW"/>
<label role="ladi_controller1" property="wanted_ladi_controller" suffix="ladi_controller.ladi_controllerSuffix"/>
<label role="ladi_controller1" property="wanted_voltage" suffix="ladi_controller.voltSuffix"/>
</construction>
<running>
<label role="ladi_controller1" property="actual_ladi_controller" suffix="ladi_controller.ladi_controllerSuffix"/>
<simple_image prefix="LEFT_TO_RIGHT_ARROW"/>
<label role="ladi_controller1" property="wanted_ladi_controller" suffix="ladi_controller.ladi_controllerSuffix"/>
<label role="ladi_controller1" property="actual_voltage" suffix="ladi_controller.voltSuffix"/>
<simple_image prefix="LEFT_TO_RIGHT_ARROW"/>
<label role="ladi_controller1" property="wanted_voltage" suffix="ladi_controller.voltSuffix"/>
</running>
<finished>
<simple_image prefix="TICK"/>
<label role="ladi_controller1" property="actual_ladi_controller" suffix="ladi_controller.ladi_controllerSuffix"/>
<label role="ladi_controller1" property="actual_voltage" suffix="ladi_controller.voltSuffix"/>
</finished>
<text role="ladi_controller1" property="readingInitialPoint" prefix="ladi_controller.readingInitialPointPrefix" suffix="ladi_controller.mmeter"/>
<combo role="ladi_controller1" property="readingYPixelSize" prefix="ladi_controller.readingYPixelSizePrefix" valuesAndLabels="ladi_controller.125um,ladi_controller.250um,ladi_controller.500um,ladi_controller.full"/>
<text role="ladi_controller1" property="nbAcquisitionLines" prefix="ladi_controller.nbAcquisitionLinesPrefix"/>
</plugin>
<plotdatas>
<plotdata key="detector_plot_data0" color="1F96C0" legend_key="genericDataLabel" plugins="COMMAND|SETUP|SPY">
<dataX p_role="data_plot1" p_name="detector_x_data.0"/>
<dataY p_role="data_plot1" p_name="detector_y_data.0"/>
<dataZ p_role="data_plot1" p_name="detector_z_data.0"/>
</plotdata>
</plotdatas>
......@@ -6,4 +6,6 @@
<command view="ladi_controllerCommandView.xml"/>
<spy view="ladi_controllerSpyView.xml"/>
</controller_plugin_config>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<controller type="ladi_controller">
<property name="drumPosition" type="int32">
<property name="drumPosition" type="float64">
<decimal_format nb_decimal_places="3"/>
</property>
<property name="drumSpeed" type="float64">
......@@ -31,6 +32,9 @@
<property name="eraseProgression" type="int32">
</property>
<property name="readingDataProgression" type="int32">
</property>
<property name="drumAcquisitionSpeed" type="float64">
</property>
......@@ -44,9 +48,11 @@
<property name="maxNbAcquisitionLines" type="int32">
</property>
<property name="minNbAcquisitionLines" type="int32">
</property>
<property name="nbAcquisitionLines" type="int32">
<!-- <strictly_positive/> -->
<!-- <property_range max_property="maxNbAcquisitionLines"/> -->
<!-- <property_range min_property="minNbAcquisitionLines" max_property="maxNbAcquisitionLines"/> -->
</property>
<property name="enableAverage" type="boolean">
......@@ -55,7 +61,8 @@
<property name="drumSpeedErase" type="float64">
</property>
<property name="drumErrorPositioningTolerance" type="int32">
<property name="drumErrorPositioningTolerance" type="float64">
<decimal_format nb_decimal_places="3"/>
</property>
<property name="eraseTimeValue" type="float64">
......@@ -97,6 +104,9 @@
<property name="status" type="int32">
</property>
<property name="safetyState" type="int32">
</property>
<property name="status_message" type="String" max_length="10">
</property>
......
<plugin>
<controller type="ladi_controller" role="ladi_controller1" />
<controller type="data_plot" role="data_plot1" />
<property_switcher role="ladi_controller1" property="status" switcher_key="acquisitionStatusSwitcher" />
<property_switcher role="ladi_controller1" property="ladi_message" switcher_key="ladi_messageSwitcher" />
<property_switcher role="ladi_controller1" property="ladi_message" switcher_key="ladi_messageSwitcher" />
<composite isVertical="true" grabHorizontal="true">
<composite>
<label role="ladi_controller1" property="wanted_time" prefix="ladi_controller.wantedTimePrefix" font_size="10"/>
<label role="ladi_controller1" property="time_type" font_size="10"/>
</composite>
<composite>
<simple_label prefix="ladi_controller.actualTimePrefix" font_size="10"/>
<changing_color_label role="ladi_controller1" property="actual_time" status_property="status" statusValuesAndStyles=" 0,2,4:STANDARD|1:CHANGING|8,32:WARNING|16:ALARM" statusValuesAndSizes="*:10" hAlignment="right" suffix="ladi_controller.second" />
</composite>
<composite>
<progress role="ladi_controller1" property="progression" size="55" displayProgression="false" />
</composite>
<label role="ladi_controller1" property="numor" prefix="ladi_controller.runPrefix" font_size="10"/>
</composite>
<form_composite>
<positionnable_composite width="85" height="85">
<plot role="data_plot1" data="detector_plot_data0" titleProperty="plot_name.0" xAxisTitleProperty="x_legend.0" yAxisTitleProperty="y_legend.0" height="85" width="85" />
</positionnable_composite>
</form_composite>
<newLine />
<composite isVertical="true" grabHorizontal="true">
<label role="ladi_controller1" property="drumPosition" prefix="ladi_controller.drumPositionPrefix" suffix="ladi_controller.degree" font_size="10"/>
<label role="ladi_controller1" property="drumSpeed" prefix="ladi_controller.drumSpeedPrefix" suffix="ladi_controller.rpm" font_size="10"/>
<label role="ladi_controller1" property="headPosition" prefix="ladi_controller.headPositionPrefix" suffix="ladi_controller.mmeter" font_size="10"/>
<switchable_composite switcher_key="ladi_messageSwitcher" switch_values="Counting">
<switchable_composite switcher_key="acquisitionStatusSwitcher" switch_values="0,1,2,4,16,32" >
<label role="ladi_controller1" property="status_message" font_size="10"/>
</switchable_composite>
</switchable_composite>
<switchable_composite switcher_key="ladi_messageSwitcher" switch_values="Erasing">
<label role="ladi_controller1" property="eraseProgression" prefix="ladi_controller.eraseProgressionPrefix" suffix="ladi_controller.progressionSuffix" spaceBefore="false" font_size="10"/>
</switchable_composite>
<switchable_composite switcher_key="ladi_messageSwitcher" switch_values="Reading Data">
<label role="ladi_controller1" property="readingDataProgression" prefix="ladi_controller.readingDataProgressionPrefix" suffix="ladi_controller.progressionSuffix" spaceBefore="false" font_size="10"/>
</switchable_composite>
</composite>
</plugin>