1 #include "TangoHKLAdapter.h"
2 #include "PseudoAxisAdapter.h"
4 namespace DiffractometerDevice_ns
7 PseudoAxisAdapter::PseudoAxisAdapter(TangoHKLAdapter
&hklAdapter
, HklPseudoAxis
*pseudo_r
, HklPseudoAxis
*pseudo_w
):
8 _hklAdapter(hklAdapter
),
15 std::vector
<AxisAdapter
> &axes
= hklAdapter
.get_axes();
18 _state
= Tango::UNKNOWN
;
22 len
= HKL_LIST_LEN(_pseudo_r
->engine
->mode
->axes_names
);
23 names
= _pseudo_r
->engine
->mode
->axes_names
;
25 for(j
=0; j
<axes
.size(); ++j
){
26 AxisAdapter
& axis
= axes
[j
];
27 if(axis
.get_name() == names
[i
]) {
28 _axes
.push_back(&axis
);
34 PseudoAxisAdapter::~PseudoAxisAdapter(void)
43 void PseudoAxisAdapter::update(void)
45 HklDiffractometer
*diffractometer
= _hklAdapter
.diffractometer();
47 _read
= hkl_parameter_get_value_unit((HklParameter
*)_pseudo_r
);
48 _write
= hkl_parameter_get_value_unit((HklParameter
*)_pseudo_w
);
51 if(!diffractometer
|| !diffractometer
->samples
){
52 _state
= Tango::FAULT
;
53 _status
= "Internal Error";
58 if(!diffractometer
->samples
->current
){
59 _state
= Tango::FAULT
;
60 _status
= "Sample not set";
64 // now compute the state ans status of the pseudo axes.
65 _state
= Tango::STANDBY
;
66 std::string extra_status
;
68 _status
= "REAL Mode: Motors will REALLY move.";
69 if (!this->is_ready()) {
70 _state
= Tango::FAULT
;
71 extra_status
= "\nCan not connect to axes proxies";
73 for(size_t i
=0;i
<_axes
.size();++i
) {
74 AxisAdapter
const * axis
= _axes
[i
];
75 ::compose_state(_state
, axis
->get_state());
76 if (axis
->get_state() != Tango::STANDBY
)
77 extra_status
+= "\n" + axis
->get_device_name() + " is in " + Tango::DevStateName
[axis
->get_state()];
80 extra_status
+= "\nPseudoAxe status: ";
81 extra_status
+= Tango::DevStateName
[_state
];
82 _status
+= extra_status
;
85 void PseudoAxisAdapter::to_proxies(void)
88 long len
= _axes
.size();
89 std::vector
<double> values(len
);
91 for (long i
=0; i
<len
; ++i
) {
92 _axes
[i
]->from_HklAxis();
93 values
[i
] = _axes
[i
]->get_write_real();
94 _axes
[i
]->set_state(Tango::MOVING
);
97 #ifdef WRITE_TO_PROXY_ALLOWED
101 _group
->command_inout(AXIS_COMMAND_STOP_NAME
);
102 _group
->write_attribute(AXIS_ATTRIBUTE_POSITION_NAME
, values
, true);
106 //TODO remove this try catch when tango group will be updated
112 bool PseudoAxisAdapter::is_ready(void)
117 for(i
=0; i
<_axes
.size(); ++i
)
118 if(!_axes
[i
]->is_ready())
122 _group
= new Tango::Group("tmp");
124 for(i
=0; i
<_axes
.size(); ++i
)
125 _group
->add(_axes
[i
]->get_device_name());