made do_reset option work with multiple range calibrations for 60xx
authorFrank Mori Hess <fmhess@speakeasy.net>
Sun, 20 Apr 2003 22:50:40 +0000 (22:50 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Sun, 20 Apr 2003 22:50:40 +0000 (22:50 +0000)
comedi_calibrate/calib.h
comedi_calibrate/cb.c
comedi_calibrate/comedi_calibrate.c

index b3888afae22b22bf1a65d9aa729cd91ae62f9955..58852dd458b8aa552944e5c484feebe5db930e2c 100644 (file)
@@ -61,6 +61,7 @@ struct calibration_setup_struct {
        unsigned int n_caldacs;
        int (*do_cal) ( calibration_setup_t *setup );
        char *cal_save_file_path;
+       unsigned do_reset : 1;
 };
 
 extern char *devicename;
index 61ad5d712e30815c66052c049ea5e3939990358f..665b9904e7debc94a0ff11842ae474e1f4c90d70 100644 (file)
@@ -74,7 +74,7 @@ static struct board_struct boards[]={
        { "pci-das64/m2/16",    STATUS_GUESS,   setup_cb_pci_64xx },
        { "pci-das64/m3/16",    STATUS_GUESS,   setup_cb_pci_64xx },
        { "pci-das6023",        STATUS_DONE,    setup_cb_pci_60xx },
-       { "pci-das6025",        STATUS_SOME,    setup_cb_pci_60xx },
+       { "pci-das6025",        STATUS_DONE,    setup_cb_pci_60xx },
        { "pci-das6034",        STATUS_GUESS,   setup_cb_pci_60xx },
        { "pci-das6035",        STATUS_GUESS,   setup_cb_pci_60xx },
        { "pci-das4020/12",     STATUS_DONE,    setup_cb_pci_4020 },
@@ -121,6 +121,18 @@ enum calibration_source_60xx
        CS_60XX_DAC1 = 7,
 };
 
+enum cal_knobs_60xx
+{
+       DAC0_OFFSET = 0,
+       DAC0_GAIN,
+       DAC1_OFFSET,
+       DAC1_GAIN,
+       ADC_OFFSET_FINE,
+       ADC_OFFSET_COARSE,
+       ADC_GAIN_COARSE,
+       ADC_GAIN_FINE,
+};
+
 int cb_setup( calibration_setup_t *setup, const char *device_name )
 {
        unsigned int i;
@@ -904,20 +916,68 @@ static int cal_cb_pci_64xx( calibration_setup_t *setup )
        return 0;
 }
 
+static void prep_adc_caldacs_60xx( calibration_setup_t *setup, unsigned int range )
+{
+       int retval;
+
+       if( setup->do_reset )
+       {
+               reset_caldac( setup, ADC_OFFSET_COARSE );
+               reset_caldac( setup, ADC_OFFSET_FINE );
+               reset_caldac( setup, ADC_GAIN_COARSE );
+               reset_caldac( setup, ADC_GAIN_FINE );
+       }else
+       {
+               retval = comedi_apply_calibration( setup->dev, setup->ad_subdev,
+                       0, range, AREF_GROUND, setup->cal_save_file_path);
+               if( retval < 0 )
+               {
+                       reset_caldac( setup, ADC_OFFSET_COARSE );
+                       reset_caldac( setup, ADC_OFFSET_FINE );
+                       reset_caldac( setup, ADC_GAIN_COARSE );
+                       reset_caldac( setup, ADC_GAIN_FINE );
+               }
+       }
+}
+
+static void prep_dac_caldacs_60xx( calibration_setup_t *setup,
+       unsigned int channel, unsigned int range )
+{
+       int retval;
+
+       if( setup->do_reset )
+       {
+               if( channel == 0 )
+               {
+                       reset_caldac( setup, DAC0_OFFSET );
+                       reset_caldac( setup, DAC0_GAIN );
+               }else
+               {
+                       reset_caldac( setup, DAC1_OFFSET );
+                       reset_caldac( setup, DAC1_GAIN );
+               }
+       }else
+       {
+               retval = comedi_apply_calibration( setup->dev, setup->da_subdev,
+                       channel, range, AREF_GROUND, setup->cal_save_file_path);
+               if( retval < 0 )
+               {
+                       if( channel == 0 )
+                       {
+                               reset_caldac( setup, DAC0_OFFSET );
+                               reset_caldac( setup, DAC0_GAIN );
+                       }else
+                       {
+                               reset_caldac( setup, DAC1_OFFSET );
+                               reset_caldac( setup, DAC1_GAIN );
+                       }
+               }
+       }
+}
+
 static int cal_cb_pci_60xx( calibration_setup_t *setup )
 {
        saved_calibration_t *saved_cals, *current_cal;
-       enum cal_knobs_60xx
-       {
-               DAC0_OFFSET = 0,
-               DAC0_GAIN,
-               DAC1_OFFSET,
-               DAC1_GAIN,
-               ADC_OFFSET_FINE,
-               ADC_OFFSET_COARSE,
-               ADC_GAIN_COARSE,
-               ADC_GAIN_FINE,
-       };
        int i, num_ai_ranges, num_ao_ranges, num_calibrations, retval;
        int adc_offset_fine_for_ao = -1, adc_offset_coarse_for_ao = -1,
                adc_gain_fine_for_ao = -1, adc_gain_coarse_for_ao = -1;
@@ -942,10 +1002,7 @@ static int cal_cb_pci_60xx( calibration_setup_t *setup )
        current_cal = saved_cals;
        for( i = 0; i < num_ai_ranges ; i++ )
        {
-               reset_caldac( setup, ADC_OFFSET_COARSE );
-               reset_caldac( setup, ADC_OFFSET_FINE );
-               reset_caldac( setup, ADC_GAIN_COARSE );
-               reset_caldac( setup, ADC_GAIN_FINE );
+               prep_adc_caldacs_60xx( setup, i );
 
                cal_binary( setup, ai_ground_observable_index_60xx( i ), ADC_OFFSET_COARSE );
                cal_binary( setup, ai_ground_observable_index_60xx( i ), ADC_OFFSET_FINE );
@@ -979,8 +1036,7 @@ static int cal_cb_pci_60xx( calibration_setup_t *setup )
        update_caldac( setup, ADC_GAIN_COARSE, adc_gain_coarse_for_ao );
        for( i = 0; i < num_ao_ranges ; i++ )
        {
-               reset_caldac( setup, DAC0_OFFSET );
-               reset_caldac( setup, DAC0_GAIN );
+               prep_dac_caldacs_60xx( setup, 0, i );
 
                cal_binary( setup, ao_low_observable_index_60xx( setup, 0, i ), DAC0_OFFSET );
                cal_binary( setup, ao_high_observable_index_60xx( setup, 0, i ), DAC0_GAIN );
@@ -995,8 +1051,7 @@ static int cal_cb_pci_60xx( calibration_setup_t *setup )
 
                current_cal++;
 
-               reset_caldac( setup, DAC1_OFFSET );
-               reset_caldac( setup, DAC1_GAIN );
+               prep_dac_caldacs_60xx( setup, 1, i );
 
                cal_binary( setup, ao_low_observable_index_60xx( setup, 1, i ), DAC1_OFFSET );
                cal_binary( setup, ao_high_observable_index_60xx( setup, 1, i ), DAC1_GAIN );
index 3f0dace00b53ce73f4f670896639d72d1a9295f2..9dc829d773af34c1a91083c1c7ee9be56ecc182f 100644 (file)
@@ -234,6 +234,7 @@ ok:
                        (comedi_get_version_code(dev))&0xff);
        }
 
+       setup.do_reset = do_reset;
        if(do_reset)reset_caldacs( &setup );
        if(do_dump) observe( &setup );
        if(do_calibrate && setup.do_cal) setup.do_cal( &setup );