* add the Matrix copy contructor
[diffractometer.git] / src / PseudoAxisAdapter.cpp
blobdf38a1dabcdf2c2818570a40079efddcaeeb84d2
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),
9 _pseudo_r(pseudo_r),
10 _pseudo_w(pseudo_w)
12 size_t len;
13 size_t i, j;
14 char const **names;
15 std::vector<AxisAdapter> &axes = hklAdapter.get_axes();
17 _ready = false;
18 _state = Tango::UNKNOWN;
19 _group = NULL;
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;
34 PseudoAxisAdapter::~PseudoAxisAdapter(void)
36 if(_group){
37 _group->remove_all();
38 delete _group;
39 _group = NULL;
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_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)
87 if(this->is_ready()){
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
98 // Launch in one time
99 try
101 _group->command_inout(AXIS_COMMAND_STOP_NAME);
102 _group->write_attribute(AXIS_ATTRIBUTE_POSITION_NAME, values, true);
104 catch(...)
106 //TODO remove this try catch when tango group will be updated
108 #endif
112 bool PseudoAxisAdapter::is_ready(void)
114 if(!_ready){
115 size_t i;
117 for(i=0; i<_axes.size(); ++i)
118 if(!_axes[i]->is_ready())
119 return _ready;
120 _ready = true;
121 //create the _group
122 _group = new Tango::Group("tmp");
123 if(_group)
124 for(i=0; i<_axes.size(); ++i)
125 _group->add(_axes[i]->get_device_name());
127 return _ready;