Example #1
0
ComediAnalogIOSoftCal::~ComediAnalogIOSoftCal()
{
        Logger(Debug, "ComediAnalogIOSoftCal::~ComediAnalogIOSoftCal()\n");
        comedi_cleanup_calibration(m_calibration);
        delete m_calibrationFile;
        closeDevice();
}
Example #2
0
void writeCalibrationSet(const CalibrationSet &calibration, const std::string &driverName,
	const std::string &boardName, const std::string &filePath)
{
	comedi_calibration_t *c_cal = static_cast<comedi_calibration_t *>(malloc(sizeof(comedi_calibration_t)));
	if(c_cal == 0) throw std::runtime_error("writeCalibrationSet: malloc failed\n");
	memset(c_cal, 0, sizeof(comedi_calibration_t));
	c_cal->driver_name = static_cast<char*>(malloc(driverName.size() + 1));
	strcpy(c_cal->driver_name, driverName.c_str());
	c_cal->board_name = static_cast<char*>(malloc(boardName.size() + 1));
	strcpy(c_cal->board_name, boardName.c_str());
	CalibrationSet::const_iterator it;
	for(it = calibration.begin(); it != calibration.end(); ++it)
	{
		const SubdeviceCalibration &subdeviceCalibration = it->second;
		std::map<std::pair<unsigned, unsigned>, Polynomial>::const_iterator jt;
		for(jt = it->second.polynomials().begin(); jt != it->second.polynomials().end(); ++jt)
		{
			comedi_calibration_setting_t *setting = sc_alloc_calibration_setting(c_cal);
			setting->subdevice = it->first;
			unsigned channel = jt->first.first;
			if(channel != SubdeviceCalibration::allChannels)
			{
				sc_push_channel(setting, channel);
			}
			unsigned range = jt->first.second;
			if(range != SubdeviceCalibration::allRanges)
			{
				sc_push_range(setting, range);
			}
			const Polynomial &polynomial = jt->second;
			comedi_polynomial_t *comediPolynomial = static_cast<comedi_polynomial_t*>(malloc(sizeof(comedi_polynomial_t)));
			assert(comediPolynomial);
			comediPolynomial->expansion_origin = polynomial.expansionOrigin;
			comediPolynomial->order = polynomial.order();
			unsigned i;
			for(i = 0; i < polynomial.coefficients.size(); ++i)
			{
				assert(i < COMEDI_MAX_NUM_POLYNOMIAL_COEFFICIENTS);
				comediPolynomial->coefficients[i] = polynomial.coefficients.at(i);
			}
			if(subdeviceCalibration.toPhys())
			{
				setting->soft_calibration.to_phys = comediPolynomial;
			}else
			{
				setting->soft_calibration.from_phys = comediPolynomial;
			}
		}
	}
	int retval = write_calibration_file(filePath.c_str(), c_cal);
	comedi_cleanup_calibration(c_cal);
	if(retval)
	{
		std::ostringstream message;
		message << __FUNCTION__ << ": write_calibration_file() failed.";
		throw std::runtime_error(message.str());
	}
}
Example #3
0
/**
 * facq_comedi_misc_get_polynomial:
 * @dev: A comedi_t device.
 * @subindex: The subdevice index.
 * @chanlist: A #FacqChanlist object.
 * @err: A #GError.
 *
 * The functions makes some magic to obtain a per channel,
 * comedi_polynomial_t array. Each polynomial can be used
 * to convert from comedi data to physical samples.
 * See <function>comedi_to_physical()</function> for more 
 * info.
 *
 * Returns: An array of comedi_polynomial_t members. Free it
 * when it's no longer needed. %NULL in case of error.
 * The array length equals the number of I/O Channels in the
 * chanlist.
 */
comedi_polynomial_t *facq_comedi_misc_get_polynomial(comedi_t *dev,guint subindex,const FacqChanlist *chanlist,GError **err)
{
	guint subd_flags = 0;
	guint i = 0, chan = 0, range = 0, aref = 0, iochans_n = 0;
	guint chanspec = 0;
	gchar *cal_filename = NULL;
	comedi_calibration_t *cc = NULL;
	GError *local_err = NULL;
	comedi_polynomial_t *p = NULL;

	g_return_val_if_fail(FACQ_IS_CHANLIST(chanlist),NULL);
	iochans_n = facq_chanlist_get_io_chans_n(chanlist);
	if(iochans_n < 1){
		g_set_error_literal(&local_err,FACQ_COMEDI_MISC_ERROR,
			FACQ_COMEDI_MISC_ERROR_FAILED,
				"Chanlist is empty");
		goto error;
	}
	cal_filename = comedi_get_default_calibration_path(dev);
	if(!cal_filename){
		g_set_error_literal(&local_err,FACQ_COMEDI_MISC_ERROR,
			FACQ_COMEDI_MISC_ERROR_FAILED,
				comedi_strerror(comedi_errno()));
		goto error;
	}
	cc = comedi_parse_calibration_file(cal_filename);
	if(!cc){
		g_set_error_literal(&local_err,FACQ_COMEDI_MISC_ERROR,
			FACQ_COMEDI_MISC_ERROR_FAILED,
				comedi_strerror(comedi_errno()));
		goto error;
	}
	g_free(cal_filename);
	subd_flags = comedi_get_subdevice_flags(dev,subindex);
	if(subd_flags < 0){
		g_set_error_literal(&local_err,FACQ_COMEDI_MISC_ERROR,
			FACQ_COMEDI_MISC_ERROR_FAILED,
				comedi_strerror(comedi_errno()));
		goto error;
	}
	for(i = 0;i < iochans_n;i++){
		chanspec = facq_chanlist_get_io_chanspec(chanlist,i);
		facq_chanlist_chanspec_to_src_values(chanspec,
						     &chan,
						     &range,
						     &aref,
						     NULL);
		if( comedi_apply_parsed_calibration(dev,subindex,
						chan,
						range,
						aref,
						cc) < 0){
			g_set_error_literal(&local_err,FACQ_COMEDI_MISC_ERROR,
				FACQ_COMEDI_MISC_ERROR_FAILED,
					comedi_strerror(comedi_errno()));
			goto error;
		}
	}
	if(subd_flags & SDF_SOFT_CALIBRATED){
		p = facq_comedi_misc_get_polynomial_soft(dev,
							 subindex,
							 chanlist,
							 cc,
							 &local_err);
		comedi_cleanup_calibration(cc);
	}
	else {
		comedi_cleanup_calibration(cc);
		p = facq_comedi_misc_get_polynomial_hard(dev,
							 subindex,
							 chanlist,
							 &local_err);
	}
	if(!p)
		goto error;

	return p;

	error:
	if(cal_filename)
		g_free(cal_filename);
	if(cc)
		comedi_cleanup_calibration(cc);
	if(local_err)
		g_propagate_error(err,local_err);
	return NULL;
}
Example #4
0
int DaqDevice::DAQcalibration(int subdev,int channel,int range_idx)
{
    int retval;
    int flags;
    comedi_calibration_t* parsed_calibration;
    comedi_polynomial_t* converter;
    comedi_conversion_direction options;

    if (COMEDI_AN_IN_SUB == subdev)
    {
	converter = &_converter_an_input[channel];
	options = COMEDI_TO_PHYSICAL;
    }
	
    else if (COMEDI_AN_OUT_SUB == subdev)
    {
	converter = &_converter_an_output[channel];
	options = COMEDI_FROM_PHYSICAL;
    }	
    else 
	return COMEDI_ERROR;

    flags = comedi_get_subdevice_flags(_dev, subdev);
    if(flags < 0)
    {
        return COMEDI_ERROR;
    }
    if(flags & SDF_SOFT_CALIBRATED) /* board uses software calibration */
    {
        char *calibration_file_path = comedi_get_default_calibration_path(_dev);

        /* parse a calibration file which was produced by the
                comedi_soft_calibrate program */
        parsed_calibration = comedi_parse_calibration_file(calibration_file_path);
        if(parsed_calibration == NULL)
        {
            return COMEDI_ERROR;
        }

        /* get the comedi_polynomial_t for the subdevice/channel/range
                we are interested in */

        retval = comedi_get_softcal_converter(subdev, channel, range_idx,
                                              options, parsed_calibration, converter);

        comedi_cleanup_calibration(parsed_calibration);
       

        if(retval < 0)
        {
            return COMEDI_ERROR;
        }
    }else /* board uses hardware calibration */
    {
        retval = comedi_get_hardcal_converter(_dev, subdev, channel, range_idx,
                                              options, converter);
        if(retval < 0)
        {
            return COMEDI_ERROR;
        }
    }

    return COMEDI_OK;
}