* switch from DeviceProxy -> AttributProxy
[diffractometer.git] / src / TangoHKLAdapter.h
blob7a173b3509bd4b0db421f4be5689079f041b696c
1 #ifndef __TANGOHKLADAPTER_H__
2 #define __TANGOHKLADAPTER_H__
4 #include <map>
5 #include <vector>
6 #include <string>
7 #include <tango.h>
9 #include <Duration.h>
11 #include <hkl.h>
13 #include "AxisAdapter.h"
14 #include "PseudoAxisAdapter.h"
15 #include "PseudoAxesAdapter.h"
16 #include "Matrix.h"
18 #if ( _MSC_VER && _MSC_VER <= 1200 )
19 // Ce pragma ne devrait pas être dans ce fichier car le warning ne s'affiche
20 // que si l'on compile une version DEBUG de la librairie.
21 // Il faut utiliser l'option de compilation \wd4786 mais elle n'est présente
22 // qu'à partir de VC++7
23 # pragma warning (disable : 4786)
24 #endif
26 #define NO_SOFTWARE_LIMITS -999999
28 namespace Diffractometer_ns {
30 // forward declaration
31 class Diffractometer;
33 struct HklDiffractometer {
34 HklGeometry *geometry_r;
35 HklGeometry *geometry_w;
36 HklGeometry *geometry_r_real;
37 HklGeometry *geometry_w_real;
38 HklDetector *detector;
39 HklDetector *detector_real;
40 HklSampleList *samples;
41 HklPseudoAxisEngineList *engines_r;
42 HklPseudoAxisEngineList *engines_w;
43 HklPseudoAxisEngineList *engines_r_real;
44 HklPseudoAxisEngineList *engines_w_real;
47 struct DiffractometerConfig {
48 Tango::DevState state;
49 std::string status;
52 /**
54 * Class which associates a Diffractometer with the PseudoAxis
56 class TangoHKLAdapter
58 public :
59 bool _auto_update_from_proxies;
60 bool ready;
62 TangoHKLAdapter(Diffractometer *_device, HklGeometryType type);
64 virtual ~TangoHKLAdapter(void);
66 Diffractometer *get_device(void) {return _device;}
68 // Diffractometer Part
69 HklDiffractometer* & diffractometer(void) {return _diffractometer;}
71 void get_diffractometer_config(DiffractometerConfig &config);
74 bool get_auto_update_from_proxies(void);
75 void set_auto_update_from_proxies(bool update);
77 void connect_all_proxies(void);
79 void update(void);
81 /**********/
82 /* source */
83 /**********/
85 double & get_lambda(void) {return _lambda;}
87 void set_lambda(double lambda);
89 /************/
90 /* hkl part */
91 /************/
93 Matrix<double> & get_angles(void) {omni_mutex_lock lock(_lock); return _angles;}
95 short & get_angles_idx(void);
97 void set_angles_idx(short idx);
99 void load(void);
101 void save(void);
103 /***************/
104 /* sample part */
105 /***************/
107 char const *get_sample_name(void);
109 void set_current_sample(char const * name);
111 void get_sample_lattices(double * a, double * b, double * c,
112 double * alpha, double * beta, double * gamma,
113 double * a_star, double * b_star, double * c_star,
114 double * alpha_star, double * beta_star, double * gamma_star);
116 void get_sample_fit(bool *afit, bool *bfit, bool *cfit,
117 bool *alphafit, bool *betafit, bool *gammafit,
118 bool *uxfit, bool *uyfit, bool *uzfit);
120 Matrix<double> & get_sample_ub(void) {omni_mutex_lock lock(_lock); return _ub;}
122 double & get_sample_Ux(void) {return _ux;}
124 void set_sample_Ux(double ux);
126 double & get_sample_Uy(void) {return _uy;}
128 void set_sample_Uy(double uy);
130 double & get_sample_Uz(void) {return _uz;}
132 void set_sample_Uz(double uz);
134 void set_sample_AFit(bool fit);
135 void set_sample_BFit(bool fit);
136 void set_sample_CFit(bool fit);
137 void set_sample_AlphaFit(bool fit);
138 void set_sample_BetaFit(bool fit);
139 void set_sample_GammaFit(bool fit);
140 void set_sample_UxFit(bool fit);
141 void set_sample_UyFit(bool fit);
142 void set_sample_UzFit(bool fit);
144 void add_new_sample(std::string const & name);
146 void copy_sample_as(Tango::DevString copy_name);
148 void del_sample(void);
150 void set_lattice(const Tango::DevVarDoubleArray *argin);
152 void add_reflection(const Tango::DevVarDoubleArray *argin);
154 void del_reflection(Tango::DevShort argin);
156 Matrix<double> & get_reflections(void) {omni_mutex_lock lock(_lock); return _reflections;}
158 void set_reflections(Matrix<double> const & img);
160 double affine_sample(std::string name);
162 std::vector<std::string> get_samples_names(void);
164 void get_sample_parameter_values(Tango::DevVarDoubleStringArray *argout);
166 void set_sample_parameter_values(Tango::DevVarDoubleStringArray const *argin);
168 void compute_u(const Tango::DevVarLongArray *argin);
170 Matrix<double> & get_reflections_angles(void) {omni_mutex_lock lock(_lock); return _reflections_angles;}
172 /*************/
173 /* axes part */
174 /*************/
176 const std::vector<AxisAdapter> & get_axes(void) const {return _axes;}
178 std::vector<AxisAdapter> & get_axes(void) {return _axes;}
180 void read_axis(int idx, double & read, double & write);
182 void write_axis(AxisAdapter & adapter, double value);
184 void stop_all_axis(void);
186 /*******************/
187 /* PseudoAxis Part */
188 /*******************/
190 std::vector<std::string> pseudo_axis_get_names(void);
192 void pseudo_axis_init(PseudoAxisAdapter *buffer, bool init);
194 PseudoAxisAdapter *pseudo_axis_buffer_new(char const *name);
196 void pseudo_axis_write(PseudoAxisAdapter *buffer, double value);
198 Tango::DevString *pseudo_axis_get_mode(PseudoAxisAdapter const *buffer);
200 void pseudo_axis_set_mode(PseudoAxisAdapter *buffer, Tango::DevString const & mode);
202 void pseudo_axis_get_mode_parameters(PseudoAxisAdapter *buffer, Tango::DevVarDoubleStringArray *argout);
204 void pseudo_axis_set_mode_parameters(PseudoAxisAdapter *buffer, const Tango::DevVarDoubleStringArray *argin);
206 /*******************/
207 /* PseudoAxes Part */
208 /*******************/
210 std::vector<PseudoAxesAdapter *> & pseudo_axes(void) {return _pseudoAxesAdapters;}
212 PseudoAxesAdapter *pseudo_axes_adapter_get_by_name(std::string const & name);
214 Matrix<char *> const & get_pseudo_axes_proxies(void) {omni_mutex_lock lock(_lock); return _pseudo_axes_proxies;}
216 void pseudo_axes_write(size_t idx, Matrix<double> const & write) throw (Tango::DevFailed);
218 Tango::DevString *pseudo_axes_get_mode(size_t idx);
220 void pseudo_axes_set_mode(size_t idx, const Tango::DevString name);
222 Matrix<char *> & pseudo_axes_get_mode_parameters_names(size_t idx);
224 Matrix<double> const & pseudo_axes_get_mode_parameters(size_t idx);
226 void pseudo_axes_set_mode_parameters(size_t idx, Matrix<double> const & values);
228 void pseudo_axes_add_dynamic_attributes(size_t idx);
230 void pseudo_axes_remove_dynamic_attributes(size_t idx);
232 void pseudo_axes_init(size_t idx);
234 void pseudo_axes_create_and_start_devices(void);
236 /**********************/
237 /* Dynamic attributes */
238 /**********************/
240 void create_axes_dynamic_attributes(void);
242 void destroy_axes_dynamic_attributes(void);
244 void attach_dynamic_attributes_to_device(void);
246 void detach_dynamic_attributes_from_device(void);
248 Matrix<char *> const & get_dynamic_attribute_axes_names(void) const {return _dynamic_attribute_axes_names;}
250 protected :
252 omni_mutex _lock;
253 HklDiffractometer *_diffractometer;
254 DiffractometerConfig _diffractometerConfig;
255 std::vector<AxisAdapter> _axes;
256 std::vector<PseudoAxisAdapter *> _pseudoAxisAdapters;
257 std::vector<PseudoAxesAdapter *> _pseudoAxesAdapters;
258 Tango::AttributeProxy *_lambdaAttributeProxy;
259 bool _wrong_nb_of_axis_proxies;
261 void update_pseudo_axis_engines(void);
263 void update_lambda(void);
265 void update_angles(void);
267 void update_reflections_angles(void);
269 void update_reflections(void);
271 void update_ub(void);
273 void update_ux_uy_uz(void);
275 void update_axis_adapters(void);
277 void update_pseudo_axis_adapters_from_hkl(void);
279 void update_pseudo_axes_adapters_from_hkl(void);
281 void update_hkl_from_axis_adapters(void);
283 void update_proxies_from_axis_adapters(void);
285 void update_proxies_from_pseudo_axis_adapters(PseudoAxisAdapter *adapter);
287 void update_state_and_status(void);
289 void load_1(void);
291 /* axis part */
292 void write_axis_i(AxisAdapter & axis, double value);
294 private :
296 Diffractometer *_device;
297 HklGeometryType _type;
298 Duration duration;
299 double _lambda;
300 Matrix<double> _angles;
301 Matrix<char *> _pseudo_axes_proxies;
302 short _angles_idx;
304 // sample part
305 Matrix<double> _reflections_angles;
306 Matrix<double> _reflections;
307 Matrix<double> _ub;
308 double _ux;
309 double _uy;
310 double _uz;
311 bool _uxfit;
312 bool _uyfit;
313 bool _uzfit;
315 // dynamic attributes part
316 std::vector<Tango::Attr *> _dynamic_attribute_axes;
317 Matrix<char *> _dynamic_attribute_axes_names;
321 // given the state compute the new state using the axe state.
322 extern void compose_state(Tango::DevState & state, Tango::DevState const & axe_state);
324 #endif// _TangoHKLAdapter_H