1 #include "TangoHKLAdapter.h"
2 #include "PseudoAxes.h"
3 #include "PseudoAxesAttrib.h"
4 #include "PseudoAxesAdapter.h"
5 #include "Diffractometer.h"
7 namespace Diffractometer_ns
10 PseudoAxesAdapter::PseudoAxesAdapter(TangoHKLAdapter
*hklAdapter
, size_t idx
):
11 _hklAdapter(hklAdapter
),
14 HklPseudoAxisEngine
*engine
;
18 engine
= _hklAdapter
->diffractometer()->engines_r
->engines
[_idx
];
19 len
= HKL_LIST_LEN(engine
->pseudoAxes
);
21 _write
.resize(len
, 1);
23 // update the _mode_names
24 len
= HKL_LIST_LEN(engine
->modes
);
25 _mode_names
.resize(len
, 1);
27 _mode_names
.data
[i
] = const_cast<char *>(engine
->modes
[i
]->name
);
29 // update the _pseudo_axis_names and create the dynamic attributes
30 len
= HKL_LIST_LEN(engine
->pseudoAxes
);
31 _pseudo_axis_names
.resize(len
, 1);
36 name
= ((HklParameter
*)(engine
->pseudoAxes
[i
]))->name
;
37 _pseudo_axis_names
.data
[i
] = const_cast<char *>(name
);
38 att
= new PseudoAxesAxisAttrib(name
, *this, i
);
39 _dynamic_attribute_pseudo_axes_axis
.push_back(att
);
42 // compute the proxy name
43 _proxy_name
= _hklAdapter
->get_device()->get_name();
44 _proxy_name
+= "-sim-";
45 _proxy_name
+= engine
->name
;
47 this->update_axes_i(engine
);
49 // update the state and status
50 _state
= Tango::STANDBY
;
56 PseudoAxesAdapter::~PseudoAxesAdapter(void)
60 for(i
=0; i
<_dynamic_attribute_pseudo_axes_axis
.size(); ++i
)
61 delete _dynamic_attribute_pseudo_axes_axis
[i
];
64 char const * PseudoAxesAdapter::get_name(void) const
66 return _hklAdapter
->diffractometer()->engines_r
->engines
[_idx
]->name
;
69 void PseudoAxesAdapter::write(Matrix
<double> const & write
) throw (Tango::DevFailed
)
71 _hklAdapter
->pseudo_axes_write(_idx
, write
);
74 void PseudoAxesAdapter::set_axis_value(size_t idx
, double value
)
76 _write
.data
[idx
] = value
;
80 Tango::DevString
*PseudoAxesAdapter::get_mode(void)
82 return _hklAdapter
->pseudo_axes_get_mode(_idx
);
85 void PseudoAxesAdapter::set_mode(const Tango::DevString name
)
87 _hklAdapter
->pseudo_axes_set_mode(_idx
, name
);
90 Tango::DevBoolean
PseudoAxesAdapter::get_initialized(void)
92 return _hklAdapter
->pseudo_axes_get_initialized(_idx
);
95 void PseudoAxesAdapter::set_initialized(const Tango::DevBoolean initialized
)
97 _hklAdapter
->pseudo_axes_set_initialized(_idx
, initialized
);
100 Matrix
<char *> & PseudoAxesAdapter::get_mode_parameters_names(void)
102 return _hklAdapter
->pseudo_axes_get_mode_parameters_names(_idx
);
105 Matrix
<double> const & PseudoAxesAdapter::get_mode_parameters(void)
107 return _hklAdapter
->pseudo_axes_get_mode_parameters(_idx
);
110 void PseudoAxesAdapter::set_mode_parameters(Matrix
<double> const & values
)
112 _hklAdapter
->pseudo_axes_set_mode_parameters(_idx
, values
);
115 void PseudoAxesAdapter::init(void)
117 _hklAdapter
->pseudo_axes_init(_idx
);
120 void PseudoAxesAdapter::add_dynamic_attributes(void)
122 _hklAdapter
->pseudo_axes_add_dynamic_attributes(_idx
);
125 void PseudoAxesAdapter::remove_dynamic_attributes(void)
127 _hklAdapter
->pseudo_axes_remove_dynamic_attributes(_idx
);
130 void PseudoAxesAdapter::load(void)
139 void PseudoAxesAdapter::update_axes_i(HklPseudoAxisEngine
*engine
)
145 // fill the _axes with the right AxisAdapters
146 std::vector
<AxisAdapter
> & axes
= _hklAdapter
->get_axes();
147 len
= HKL_LIST_LEN(engine
->mode
->axes_names
);
148 names
= engine
->mode
->axes_names
;
151 for(j
=0; j
<axes
.size(); ++j
){
152 AxisAdapter
& axis
= axes
[j
];
153 if(axis
.get_name() == names
[i
]) {
154 _axes
.push_back(&axis
);
160 void PseudoAxesAdapter::update_state_and_status_i(void)
162 std::string status_extra
;
164 _status
= "PseudoAxes status: ";
166 // now compute the state and status
167 if(!_hklAdapter
->_auto_update_from_proxies
)
168 _state
= Tango::STANDBY
;
172 _state
= Tango::STANDBY
;
173 for(i
=0;i
<_axes
.size();++i
) {
174 AxisAdapter
const * axis
= _axes
[i
];
175 ::compose_state(_state
, axis
->get_state());
176 if (axis
->get_state() != Tango::STANDBY
)
177 status_extra
+= "\n" + axis
->get_proxy_name() + " is in " + Tango::DevStateName
[axis
->get_state()];
180 _status
+= Tango::DevStateName
[_state
];
181 _status
+= status_extra
;
184 void PseudoAxesAdapter::save(void)
186 Tango::DbData mode_prop
;
187 Tango::DbData data_put
;
188 HklPseudoAxisEngine
*engine
;
191 // first erase the old mode properties
192 mode_prop
.push_back(Tango::DbDatum("Mode"));
193 _device
->get_db_device()->get_attribute_property(mode_prop
);
194 long number_of_prop
= 0;
195 mode_prop
[0] >> number_of_prop
;
196 if(number_of_prop
> 0)
197 _device
->get_db_device()->delete_attribute_property(mode_prop
);
199 // Step 2 : create the Mode properties
200 engine
= _hklAdapter
->diffractometer()->engines_r
->engines
[_idx
];
201 Tango::DbDatum
properties("Mode");
202 // Put number of properties (= nb of samples + 1)
203 len
= HKL_LIST_LEN(engine
->modes
);
204 properties
<< (long)(len
);
205 data_put
.push_back(properties
);
207 for(i
=0; i
<len
; ++i
){
208 HklPseudoAxisEngineMode
*mode
;
209 std::vector
<std::string
> lines
;
213 mode
= engine
->modes
[i
];
214 for(j
=0; j
<HKL_LIST_LEN(mode
->parameters
); ++j
){
218 name
= mode
->parameters
[j
].name
;
219 value
= hkl_parameter_get_value_unit(&mode
->parameters
[j
]);
220 snprintf(line
, 255, "%s=%f", name
, value
);
221 lines
.push_back(line
);
224 // Try to create property
226 Tango::DbDatum
property(mode
->name
);
228 data_put
.push_back(property
);
231 //update database for this property
232 _device
->get_db_device()->put_attribute_property(data_put
);
235 void PseudoAxesAdapter::load_1(void)
237 unsigned long nb_properties
;
239 // Get the Crystal Attributes properties.
240 Tango::DbData properties
;
241 properties
.push_back(Tango::DbDatum("Mode"));
242 _device
->get_db_device()->get_attribute_property(properties
);
244 // the first one is the number of properties
245 properties
[0] >> nb_properties
;
247 if (nb_properties
> 1) {
249 HklPseudoAxisEngine
*engine_r
, *engine_w
, *engine_r_real
, *engine_w_real
;
251 engine_r
= _hklAdapter
->diffractometer()->engines_r
->engines
[_idx
];
252 engine_w
= _hklAdapter
->diffractometer()->engines_w
->engines
[_idx
];
253 engine_r_real
= _hklAdapter
->diffractometer()->engines_r_real
->engines
[_idx
];
254 engine_w_real
= _hklAdapter
->diffractometer()->engines_w_real
->engines
[_idx
];
256 for(i
=1; i
<=nb_properties
; ++i
) {
257 size_t idx_m
, j
, len
;
259 std::vector
<std::string
> lines
;
261 // first find the PseudoAxisEngineMode idx from its name
262 name
= properties
[i
].name
.c_str();
263 len
= HKL_LIST_LEN(engine_r
->modes
);
264 for(idx_m
=0; idx_m
<len
; ++idx_m
)
265 if(!strcmp(name
, engine_r
->modes
[idx_m
]->name
))
267 if(idx_m
>=len
) // did not find the right mode name
270 // Extract the mode parameters from the properties
271 properties
[i
] >> lines
;
273 // extract the parameters values
274 for(j
=0; j
<lines
.size(); j
++) {
277 char *line
= strdup(lines
[j
].c_str());
279 char *key
= strtok_r(line
, "=", &last
);
281 for(idx_p
=0; idx_p
<len
; ++idx_p
)
282 if(!strcmp(key
, engine_r
->modes
[idx_m
]->parameters
[idx_p
].name
))
287 value
= atof(strtok_r(NULL
,";", &last
));
288 hkl_parameter_set_value_unit(&engine_r
->modes
[idx_m
]->parameters
[idx_p
], value
);
289 hkl_parameter_set_value_unit(&engine_w
->modes
[idx_m
]->parameters
[idx_p
], value
);
290 hkl_parameter_set_value_unit(&engine_r_real
->modes
[idx_m
]->parameters
[idx_p
], value
);
291 hkl_parameter_set_value_unit(&engine_w_real
->modes
[idx_m
]->parameters
[idx_p
], value
);
295 }// End for each property