* do not throw an exception if no command "On" on the Axis.
[diffractometer.git] / src / PseudoAxisAdapter.cpp
blob54ba74412c7c5db90ffdeaaedbd9ff6f3c842aab
1 #include "TangoHKLAdapter.h"
2 #include "PseudoAxisAdapter.h"
3 #include "macros.h"
5 namespace Diffractometer_ns
8 PseudoAxisAdapter::PseudoAxisAdapter(TangoHKLAdapter &hklAdapter, HklPseudoAxis *pseudo_r, HklPseudoAxis *pseudo_w):
9 _hklAdapter(hklAdapter),
10 _pseudo_r(pseudo_r),
11 _pseudo_w(pseudo_w)
13 size_t len;
14 size_t i, j;
15 char const **names;
16 std::vector<AxisAdapter> & axes = hklAdapter.get_axes();
18 _ready = false;
19 _state = Tango::UNKNOWN;
21 _axes.clear();
22 len = HKL_LIST_LEN(_pseudo_r->engine->mode->axes_names);
23 names = _pseudo_r->engine->mode->axes_names;
24 for(i=0; i<len; ++i)
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);
29 continue;
33 len = HKL_LIST_LEN(_pseudo_r->engine->modes);
34 _mode_names.resize(len, 1);
35 for(i=0; i<len; ++i)
36 _mode_names.data[i] = const_cast<char *>(_pseudo_r->engine->modes[i]->name);
39 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);
50 // the internal part
51 if(!diffractometer || !diffractometer->samples){
52 _state = Tango::FAULT;
53 _status = "Internal Error";
54 return;
57 // the sample part
58 if(!diffractometer->samples->current){
59 _state = Tango::FAULT;
60 _status = "Sample not set";
61 return;
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";
72 } else {
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_proxy_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)
87 #ifdef WRITE_TO_PROXY_ALLOWED
88 if(this->is_ready())
89 for (size_t i=0; i<_axes.size(); ++i) {
90 _axes[i]->stop();
91 _axes[i]->from_HklAxis();
92 _axes[i]->set_state(Tango::MOVING);
93 _axes[i]->to_proxy();
95 #endif
98 bool PseudoAxisAdapter::is_ready(void)
100 if(!_ready){
101 size_t i;
103 for(i=0; i<_axes.size(); ++i)
104 if(!_axes[i]->is_ready())
105 return _ready;
106 _ready = true;
108 return _ready;
111 Tango::DevString *PseudoAxisAdapter::get_mode(void) const
113 return _hklAdapter.pseudo_axis_get_mode(this);
116 void PseudoAxisAdapter::set_mode(Tango::DevString const & mode)
118 _hklAdapter.pseudo_axis_set_mode(this, mode);
121 void PseudoAxisAdapter::get_mode_parameters(Tango::DevVarDoubleStringArray *argout)
123 _hklAdapter.pseudo_axis_get_mode_parameters(this, argout);
126 void PseudoAxisAdapter::set_mode_parameters(const Tango::DevVarDoubleStringArray *argin)
128 _hklAdapter.pseudo_axis_set_mode_parameters(this, argin);
131 bool PseudoAxisAdapter::get_is_initialised(void)
133 return _hklAdapter.pseudo_axis_get_is_initialised(this);
136 void PseudoAxisAdapter::set_is_initialised(Tango::DevBoolean init)
138 _hklAdapter.pseudo_axis_set_is_initialised(this, init);
141 void PseudoAxisAdapter::on(void)
143 _hklAdapter.pseudo_axis_on(this);