* pogo add the AutoUpdateFromProxies attribut
[diffractometer.git] / src / TangoHKLAdapter.h
blobebdb7bbd511417eb64f818c22d01f90c60351b47
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 simulated;
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);
73 void set_simulated(bool simulated);
75 void connect_all_proxies(void);
77 void update(void);
79 /**********/
80 /* source */
81 /**********/
83 double & get_lambda(void) {return _lambda;}
85 void set_lambda(double lambda);
87 /************/
88 /* hkl part */
89 /************/
91 Matrix<double> & get_angles(void) {omni_mutex_lock lock(_lock); return _angles;}
93 short & get_angles_idx(void);
95 void set_angles_idx(short idx);
97 void load(void);
99 void save(void);
101 /***************/
102 /* sample part */
103 /***************/
105 char const *get_sample_name(void);
107 void set_current_sample(char const * name);
109 void get_sample_lattices(double * a, double * b, double * c,
110 double * alpha, double * beta, double * gamma,
111 double * a_star, double * b_star, double * c_star,
112 double * alpha_star, double * beta_star, double * gamma_star);
114 void get_sample_fit(bool *afit, bool *bfit, bool *cfit,
115 bool *alphafit, bool *betafit, bool *gammafit,
116 bool *uxfit, bool *uyfit, bool *uzfit);
118 Matrix<double> & get_sample_ub(void) {omni_mutex_lock lock(_lock); return _ub;}
120 double & get_sample_Ux(void) {return _ux;}
122 void set_sample_Ux(double ux);
124 double & get_sample_Uy(void) {return _uy;}
126 void set_sample_Uy(double uy);
128 double & get_sample_Uz(void) {return _uz;}
130 void set_sample_Uz(double uz);
132 void set_sample_AFit(bool fit);
133 void set_sample_BFit(bool fit);
134 void set_sample_CFit(bool fit);
135 void set_sample_AlphaFit(bool fit);
136 void set_sample_BetaFit(bool fit);
137 void set_sample_GammaFit(bool fit);
138 void set_sample_UxFit(bool fit);
139 void set_sample_UyFit(bool fit);
140 void set_sample_UzFit(bool fit);
142 void add_new_sample(std::string const & name);
144 void copy_sample_as(Tango::DevString copy_name);
146 void del_sample(void);
148 void set_lattice(const Tango::DevVarDoubleArray *argin);
150 void add_reflection(void);
152 void del_reflection(Tango::DevShort argin);
154 Matrix<double> & get_reflections(void) {omni_mutex_lock lock(_lock); return _reflections;}
156 void set_reflections(Matrix<double> const & img);
158 double affine_sample(std::string name);
160 std::vector<std::string> get_samples_names(void);
162 void get_sample_parameter_values(Tango::DevVarDoubleStringArray *argout);
164 void set_sample_parameter_values(Tango::DevVarDoubleStringArray const *argin);
166 void compute_u(const Tango::DevVarLongArray *argin);
168 Matrix<double> & get_reflections_angles(void) {omni_mutex_lock lock(_lock); return _reflections_angles;}
170 /*************/
171 /* axes part */
172 /*************/
174 const std::vector<AxisAdapter> & get_axes(void) const {return _axes;}
176 std::vector<AxisAdapter> & get_axes(void) {return _axes;}
178 void read_axis(int idx, double & read, double & write);
180 void write_axis(AxisAdapter & adapter, double value);
182 void stop_all_axis(void);
184 /*******************/
185 /* PseudoAxis Part */
186 /*******************/
188 std::vector<std::string> pseudo_axis_get_names(void);
190 void pseudo_axis_init(PseudoAxisAdapter *buffer, bool init);
192 PseudoAxisAdapter *pseudo_axis_buffer_new(char const *name);
194 void pseudo_axis_write(PseudoAxisAdapter *buffer, double value);
196 Tango::DevString *pseudo_axis_get_mode(PseudoAxisAdapter const *buffer);
198 void pseudo_axis_set_mode(PseudoAxisAdapter *buffer, Tango::DevString const & mode);
200 void pseudo_axis_get_mode_parameters(PseudoAxisAdapter *buffer, Tango::DevVarDoubleStringArray *argout);
202 void pseudo_axis_set_mode_parameters(PseudoAxisAdapter *buffer, const Tango::DevVarDoubleStringArray *argin);
204 /*******************/
205 /* PseudoAxes Part */
206 /*******************/
208 std::vector<PseudoAxesAdapter *> & pseudo_axes(void) {return _pseudoAxesAdapters;}
210 PseudoAxesAdapter *pseudo_axes_adapter_get_by_name(std::string const & name);
212 Matrix<char *> const & get_pseudo_axes_proxies(void) {omni_mutex_lock lock(_lock); return _pseudo_axes_proxies;}
214 void pseudo_axes_write(size_t idx, Matrix<double> const & write) throw (Tango::DevFailed);
216 Tango::DevString *pseudo_axes_get_mode(size_t idx);
218 void pseudo_axes_set_mode(size_t idx, const Tango::DevString name);
220 Matrix<char *> & pseudo_axes_get_mode_parameters_names(size_t idx);
222 Matrix<double> const & pseudo_axes_get_mode_parameters(size_t idx);
224 void pseudo_axes_set_mode_parameters(size_t idx, Matrix<double> const & values);
226 void pseudo_axes_add_dynamic_attributes(size_t idx);
228 void pseudo_axes_remove_dynamic_attributes(size_t idx);
230 void pseudo_axes_init(size_t idx);
232 void pseudo_axes_create_and_start_devices(void);
234 /**********************/
235 /* Dynamic attributes */
236 /**********************/
238 void create_axes_dynamic_attributes(void);
240 void add_dynamic_attributes_to_device(void);
242 void delete_dynamic_attributes(void);
244 Matrix<char *> const & get_dynamic_attribute_axes_names(void) const {return _dynamic_attribute_axes_names;}
246 protected :
248 omni_mutex _lock;
249 HklDiffractometer *_diffractometer;
250 DiffractometerConfig _diffractometerConfig;
251 std::vector<AxisAdapter> _axes;
252 std::vector<PseudoAxisAdapter *> _pseudoAxisAdapters;
253 std::vector<PseudoAxesAdapter *> _pseudoAxesAdapters;
254 Tango::Group *_proxies;
255 Tango::AttributeProxy *_lambdaAttributeProxy;
256 bool _wrong_nb_of_axis_proxies;
258 void update_pseudo_axis_engines(void);
260 void update_lambda(void);
262 void update_angles(void);
264 void update_reflections_angles(void);
266 void update_reflections(void);
268 void update_ub(void);
270 void update_ux_uy_uz(void);
272 void update_axis_adapters(void);
274 void update_pseudo_axis_adapters_from_hkl(void);
276 void update_pseudo_axes_adapters_from_hkl(void);
278 void update_hkl_from_axis_adapters(void);
280 void update_proxies_from_axis_adapters(void);
282 void update_proxies_from_pseudo_axis_adapters(PseudoAxisAdapter *adapter);
284 void update_state_and_status(void);
286 void load_1(void);
288 /* axis part */
289 void write_axis_i(AxisAdapter & axis, double value);
291 private :
293 Diffractometer *_device;
294 HklGeometryType _type;
295 Duration duration;
296 double _lambda;
297 Matrix<double> _angles;
298 Matrix<char *> _pseudo_axes_proxies;
299 short _angles_idx;
301 // sample part
302 Matrix<double> _reflections_angles;
303 Matrix<double> _reflections;
304 Matrix<double> _ub;
305 double _ux;
306 double _uy;
307 double _uz;
308 bool _uxfit;
309 bool _uyfit;
310 bool _uzfit;
312 // dynamic attributes part
313 std::vector<Tango::Attr *> _dynamic_attribute_axes;
314 Matrix<char *> _dynamic_attribute_axes_names;
318 // given the state compute the new state using the axe state.
319 extern void compose_state(Tango::DevState & state, Tango::DevState const & axe_state);
321 #endif// _TangoHKLAdapter_H