3 functions for setting calibration
5 Copyright (C) 2003 Frank Mori Hess <fmhess@users.sourceforge.net
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation, version 2.1
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with this library; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
28 #include <comedilib.h>
29 #include <libinternal.h>
31 static int check_cal_file( comedi_t *dev, const struct calibration_file_contents *parsed_file )
33 if( strcmp( comedi_get_driver_name( dev ), parsed_file->driver_name ) )
35 fprintf( stderr, "driver name does not match calibration file\n" );
39 if( strcmp( comedi_get_board_name( dev ), parsed_file->board_name ) )
41 fprintf( stderr, "board name does not match calibration file\n" );
48 static inline int valid_channel( const struct calibration_file_contents *parsed_file,
49 unsigned int cal_index, unsigned int channel )
53 num_channels = parsed_file->calibrations[ cal_index ].num_channels;
54 if( num_channels == 0 ) return 1;
55 for( i = 0; i < num_channels; i++ )
57 if( parsed_file->calibrations[ cal_index ].channels[ i ] == channel )
64 static inline int valid_range( const struct calibration_file_contents *parsed_file,
65 unsigned int cal_index, unsigned int range )
69 num_ranges = parsed_file->calibrations[ cal_index ].num_ranges;
70 if( num_ranges == 0 ) return 1;
71 for( i = 0; i < num_ranges; i++ )
73 if( parsed_file->calibrations[ cal_index ].ranges[ i ] == range )
80 static inline int valid_aref( const struct calibration_file_contents *parsed_file,
81 unsigned int cal_index, unsigned int aref )
85 num_arefs = parsed_file->calibrations[ cal_index ].num_arefs;
86 if( num_arefs == 0 ) return 1;
87 for( i = 0; i < num_arefs; i++ )
89 if( parsed_file->calibrations[ cal_index ].arefs[ i ] == aref )
96 static int find_calibration( const struct calibration_file_contents *parsed_file,
97 unsigned int subdev, unsigned int channel, unsigned int range, unsigned int aref )
101 num_cals = parsed_file->num_calibrations;
103 for( i = 0; i < num_cals; i++ )
105 if( parsed_file->calibrations[ i ].subdevice != subdev ) continue;
106 if( valid_range( parsed_file, i, range ) == 0 ) continue;
107 if( valid_channel( parsed_file, i, channel ) == 0 ) continue;
108 if( valid_aref( parsed_file, i, aref ) == 0 ) continue;
111 if( i == num_cals ) return -1;
116 static int set_calibration( comedi_t *dev, const struct calibration_file_contents *parsed_file,
117 unsigned int cal_index )
119 int i, retval, num_caldacs;
121 num_caldacs = parsed_file->calibrations[ cal_index ].num_caldacs;
123 for( i = 0; i < num_caldacs; i++ )
125 struct caldac_setting caldac;
127 caldac = parsed_file->calibrations[ cal_index ].caldacs[ i ];
129 retval = comedi_data_write( dev, caldac.subdevice, caldac.channel,
130 0, 0, caldac.value );
131 if( retval < 0 ) return retval;
137 EXPORT_SYMBOL(comedi_apply_calibration,0.7.20);
138 int comedi_apply_calibration( comedi_t *dev, unsigned int subdev, unsigned int channel,
139 unsigned int range, unsigned int aref, const char *cal_file_path )
141 struct stat file_stats;
142 char file_path[ 1024 ];
146 const struct calibration_file_contents *parsed_file;
150 strncpy( file_path, cal_file_path, sizeof( file_path ) );
153 if( fstat( comedi_fileno( dev ), &file_stats ) < 0 )
155 fprintf( stderr, "failed to get file stats of comedi device file\n" );
159 snprintf( file_path, sizeof( file_path ), "/etc/comedi/calibrations/%s_0x%lx",
160 comedi_get_board_name( dev ),
161 ( unsigned long ) file_stats.st_ino );
164 cal_file = fopen( file_path, "r" );
165 if( cal_file == NULL ) return -1;
167 parsed_file = parse_calibration_file( cal_file );
168 if( parsed_file == NULL ) return -1;
172 retval = check_cal_file( dev, parsed_file );
175 cleanup_calibration_parse();
179 cal_index = find_calibration( parsed_file, subdev, channel, range, aref );
182 cleanup_calibration_parse();
186 retval = set_calibration( dev, parsed_file, cal_index );
189 cleanup_calibration_parse();