add support for 67xx boards. Doesn't work yet, due to unknown reference
[comedilib.git] / comedi_calibrate / calib.h
1 /***************************************************************************
2  *                                                                         *
3  *   This program is free software; you can redistribute it and/or modify  *
4  *   it under the terms of the GNU Lesser General Public License as        *
5  *   published by                                                          *
6  *   the Free Software Foundation; either version 2.1 of the License, or   *
7  *   (at your option) any later version.                                   *
8  *                                                                         *
9  ***************************************************************************/
10
11 #ifndef __CALIB_H_
12 #define __CALIB_H_
13
14 #include "comedilib.h"
15 #if 0
16 #include <stdio.h>
17 #include <fcntl.h>
18 #include <unistd.h>
19 #include <errno.h>
20 #include <getopt.h>
21 #include <ctype.h>
22 #include <math.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #endif
26
27 #define DPRINT(level,fmt,args...) do{if(verbose>=level)printf(fmt, ## args);}while(0)
28
29 #define N_CALDACS 64
30 #define N_OBSERVABLES 128
31 #define PREOBSERVE_DATA_LEN 10
32
33 static const int caldac_settle_usec = 100000;
34
35 typedef struct{
36         int subdev;
37         int chan;
38
39         int maxdata;
40         int current;
41
42 //      int type;
43 //      double gain;
44 }caldac_t;
45
46 typedef struct{
47         char *name;
48
49         comedi_insn preobserve_insn;
50         lsampl_t preobserve_data[ PREOBSERVE_DATA_LEN ];
51
52         comedi_insn observe_insn;
53
54         int reference_source;
55         double target;
56 }observable;
57
58 typedef struct calibration_setup_struct calibration_setup_t;
59 struct calibration_setup_struct {
60         comedi_t *dev;
61         int ad_subdev;
62         int da_subdev;
63         int eeprom_subdev;
64         int caldac_subdev;
65         int status;
66         unsigned int sv_settling_time_ns;
67         unsigned int sv_order;
68         observable observables[ N_OBSERVABLES ];
69         unsigned int n_observables;
70         caldac_t caldacs[ N_CALDACS ];
71         unsigned int n_caldacs;
72         int (*do_cal) ( calibration_setup_t *setup );
73         char *cal_save_file_path;
74         unsigned do_output : 1;
75         comedi_calibration_t *old_calibration;
76         comedi_calibration_t *new_calibration;
77         void *private_data;
78 };
79
80 extern int verbose;
81
82 enum {
83         STATUS_UNKNOWN = 0,
84         STATUS_GUESS,
85         STATUS_SOME,
86         STATUS_DONE
87 };
88
89 /* high level */
90
91 void observe( calibration_setup_t *setup );
92 int preobserve( calibration_setup_t *setup, int obs);
93 void observable_dependence( calibration_setup_t *setup, int obs);
94 void measure_observable( calibration_setup_t *setup, int obs);
95 void reset_caldac( calibration_setup_t *setup, int caldac_index );
96 void reset_caldacs( calibration_setup_t *setup);
97
98 /* drivers */
99
100 extern char ni_id[];
101 extern char cb_id[];
102 extern char cb64_id[];
103 extern char ni_labpc_id[];
104
105 int ni_setup( calibration_setup_t*, const char *device_name );
106 int cb_setup( calibration_setup_t*, const char *device_name );
107 int cb64_setup( calibration_setup_t*, const char *device_name );
108 int ni_labpc_setup( calibration_setup_t*, const char *device_name );
109
110 /* low level */
111
112 void set_target( calibration_setup_t *setup, int obs,double target);
113 void update_caldac( calibration_setup_t *setup, int caldac_index, int value );
114 void setup_caldacs( calibration_setup_t *setup, int caldac_subdev);
115 void postgain_cal( calibration_setup_t *setup, int obs1, int obs2, int dac);
116 void cal1( calibration_setup_t *setup, int obs, int dac);
117 void cal1_fine( calibration_setup_t *setup, int obs, int dac);
118 void cal_binary( calibration_setup_t *setup, int obs, int dac);
119 void cal_postgain_binary( calibration_setup_t *setup, int obs1, int obs2, int dac);
120 void cal_relative_binary( calibration_setup_t *setup, int obs1, int obs2, int dac);
121 void cal_linearity_binary( calibration_setup_t *setup, int obs1, int obs2, int obs3, int dac);
122 void peg_binary( calibration_setup_t *setup, int obs, int dac, int maximize );
123
124 /* misc and temp */
125
126 void channel_dependence(int adc,int range);
127 void caldac_dependence(int caldac);
128 void chan_cal(int adc,int caldac,int range,double target);
129 int read_eeprom( calibration_setup_t *setup, int addr);
130
131 double read_chan( calibration_setup_t *setup, int adc,int range);
132 int read_chan2( calibration_setup_t *setup, char *s,int adc,int range);
133 void set_ao(comedi_t *dev,int subdev,int chan,int range,double value);
134 void check_gain(int ad_chan,int range);
135 double check_gain_chan(int ad_chan,int range,int cdac);
136
137 int cb_actual_source_voltage( comedi_t *dev, unsigned int subdevice,
138         unsigned int eeprom_channel, float *voltage);
139
140 /* helper functions */
141
142 int get_bipolar_lowgain(comedi_t *dev,int subdev);
143 int get_bipolar_highgain(comedi_t *dev,int subdev);
144 int get_unipolar_lowgain(comedi_t *dev,int subdev);
145 int get_unipolar_highgain(comedi_t *dev,int subdev);
146 double very_low_target( comedi_t *dev, unsigned int subdevice,
147         unsigned int channel, unsigned int range );
148 int is_bipolar( comedi_t *dev, unsigned int subdevice,
149         unsigned int channel, unsigned int range );
150 int is_unipolar( comedi_t *dev, unsigned int subdevice,
151         unsigned int channel, unsigned int range );
152
153 double fractional_offset( calibration_setup_t *setup, int subdevice,
154         unsigned int channel, unsigned int range, int obs );
155 double get_tolerance( calibration_setup_t *setup, int subdevice,
156         double num_bits );
157
158 /* other */
159
160 void comedi_nanodelay(comedi_t *dev, unsigned int delay);
161
162 /* printing scientific numbers */
163
164 int sci_sprint(char *s,double x,double y);
165 int sci_sprint_alt(char *s,double x,double y);
166
167 /* linear fitting */
168
169 typedef struct {
170         int n;
171
172         double *y_data;
173         double *yerr_data;
174         double *x_data;
175
176         double x0;
177         double dx;
178         double yerr;
179
180         /* stats */
181         double s1,sx,sy,sxy,sxx;
182
183         double min,max;
184
185         /* results */
186         double ave_x;
187         double ave_y;
188         double slope;
189         double err_slope;
190         double err_ave_y;
191         double S_min;
192         double dof;
193
194 }linear_fit_t;
195 int linear_fit_monotonic(linear_fit_t *l);
196 double linear_fit_func_y(linear_fit_t *l,double x);
197 double linear_fit_func_x(linear_fit_t *l,double y);
198 double check_gain_chan_x( calibration_setup_t *setup, linear_fit_t *l,unsigned int ad_chanspec,int cdac);
199 double check_gain_chan_fine( calibration_setup_t *setup, linear_fit_t *l,unsigned int ad_chanspec,int cdac);
200 void dump_curve(linear_fit_t *l);
201
202 /* slowly varying measurements */
203
204 typedef struct{
205         comedi_t *dev;
206
207         int maxdata;
208         int order;
209         int subd;
210         unsigned int chanspec;
211         unsigned int settling_time_ns;
212
213         comedi_range *rng;
214
215         double average;
216         double stddev;
217         double error;
218 }new_sv_t;
219
220 int new_sv_measure(comedi_t *dev, new_sv_t *sv);
221 int new_sv_init(new_sv_t *sv,comedi_t *dev,int subdev,unsigned int chanspec);
222 int my_sv_init( new_sv_t *sv, const calibration_setup_t *setup, int subdev,
223         unsigned int chanspec );
224
225 /* saving calibrations to file */
226 static const int SC_ALL_CHANNELS = -1;
227 static const int SC_ALL_RANGES = -1;
228 static const int SC_ALL_AREFS = -1;
229
230 int write_calibration_file( calibration_setup_t *setup );
231 comedi_calibration_setting_t* sc_alloc_calibration_setting( calibration_setup_t *setup );
232 void sc_push_caldac( comedi_calibration_setting_t *saved_cal, caldac_t caldac );
233 void sc_push_channel( comedi_calibration_setting_t *saved_cal, int channel );
234 void sc_push_range( comedi_calibration_setting_t *saved_cal, int range );
235 void sc_push_aref( comedi_calibration_setting_t *saved_cal, int aref );
236
237 /* generic calibration support */
238 typedef struct
239 {
240         int (*adc_offset)( unsigned int channel );
241         int (*adc_offset_fine)( unsigned int channel );
242         int (*adc_postgain_offset)( unsigned int channel );
243         int (*adc_gain)( unsigned int channel );
244         int (*adc_gain_fine)( unsigned int channel );
245         int (*dac_linearity)( unsigned int channel );
246         int (*dac_linearity_fine)( unsigned int channel );
247         int (*dac_offset)( unsigned int channel );
248         int (*dac_offset_fine)( unsigned int channel );
249         int (*dac_gain)( unsigned int channel );
250         int (*dac_gain_fine)( unsigned int channel );
251         int (*adc_high_observable)( const calibration_setup_t *setup,
252                 unsigned int channel, unsigned int range );
253         int (*adc_ground_observable)( const calibration_setup_t *setup,
254                 unsigned int channel, unsigned int range );
255         int (*dac_high_observable)( const calibration_setup_t *setup,
256                 unsigned int channel, unsigned int range );
257         int (*dac_mid_observable)( const calibration_setup_t *setup,
258                 unsigned int channel, unsigned int range );
259         int (*dac_ground_observable)( const calibration_setup_t *setup,
260                 unsigned int channel, unsigned int range );
261         double adc_fractional_tolerance;
262         double dac_fractional_tolerance;
263         unsigned do_adc_unipolar_postgain : 1;
264 } generic_layout_t;
265 void init_generic_layout( generic_layout_t *layout );
266 int generic_cal_by_channel_and_range( calibration_setup_t *setup,
267         const generic_layout_t *layout  );
268 int generic_cal_by_range( calibration_setup_t *setup,
269         const generic_layout_t *layout  );
270 int generic_cal_ao(calibration_setup_t *setup,
271         const generic_layout_t *layout  );
272 void generic_do_cal( calibration_setup_t *setup,
273         comedi_calibration_setting_t *saved_cal, int observable, int caldac );
274 void generic_do_relative( calibration_setup_t *setup,
275         comedi_calibration_setting_t *saved_cal, int observable1, int observable2, int caldac );
276 void generic_do_linearity( calibration_setup_t *setup,
277         comedi_calibration_setting_t *saved_cal, int observable1, int observable2,
278         int observable3, int caldac );
279 void generic_prep_adc_caldacs( calibration_setup_t *setup,
280         const generic_layout_t *layout, unsigned int channel, unsigned int range );
281 void generic_prep_dac_caldacs( calibration_setup_t *setup,
282         const generic_layout_t *layout, unsigned int channel, unsigned int range );
283 void generic_peg( calibration_setup_t *setup, int observable, int caldac,
284         int maximize );
285
286 #endif
287