diff -r 7029db7ac3db -r 3b3af1ff2783 kstmApp/src/devAdcPi.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kstmApp/src/devAdcPi.c Tue Jan 19 10:54:27 2016 +0100 @@ -0,0 +1,124 @@ +/** @brief device support adcPi + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include "drvAdcPi.h" + +typedef struct { + adcPiCard* card; + int signal; +} adcPiAiPrivate; + +long adcPiInitRecordAi (aiRecord *record); +long adcPiReadAi (aiRecord *record); +long adcPiSpecialLinconvAi (aiRecord *record, int after); + +struct { + long number; + DEVSUPFUN report; + DEVSUPFUN init; + DEVSUPFUN init_record; + DEVSUPFUN get_ioint_info; + DEVSUPFUN read_ai; + DEVSUPFUN special_linconv; +} adcPiAi = { + 6, + NULL, + NULL, + adcPiInitRecordAi, + NULL, + adcPiReadAi, + adcPiSpecialLinconvAi +}; +epicsExportAddress (dset, adcPiAi); + +/** @brief init record + * + */ +long adcPiInitRecordAi (aiRecord *record) +{ + adcPiAiPrivate *priv; + epicsUInt16 initval; + adcPiCard* card; + int signal; + + if (record->inp.type != VME_IO) { + errlogSevPrintf (errlogFatal, "adcPiInitRecordAi %s: illegal INP link type\n", record->name); + return -1; + } + + card = adcPiOpen (record->inp.value.vmeio.card); + if (!card) { + errlogSevPrintf (errlogFatal, "adcPiInitRecordAi %s: invalid card number %d\n", record->name, record->inp.value.vmeio.card); + return S_dev_noDevice; + } + + signal = record->inp.value.vmeio.signal; + if (signal < 0 || signal >= ADC_PI_MAX_CHANNEL) { + errlogSevPrintf (errlogFatal, "adcPiInitRecordAi %s: invalid signal number %d\n", record->name, signal); + return S_dev_badSignalNumber; + } + + priv = (adcPiAiPrivate*) malloc (sizeof (adcPiAiPrivate)); + if (!priv) { + errlogSevPrintf (errlogFatal, "adcPiInitRecordAi %s: out of memory\n", record->name); + return S_dev_noMemory; + } + + priv->card = card; + priv->signal = signal; + record->dpvt = priv; + + // printf(" priv at @%p [%d]\n", priv, sizeof (adcPiAiPrivate) ); + + adcPiSpecialLinconvAi (record, TRUE); + adcPiGet (card, signal, &initval); + + record->rval = initval; + return 0; +} + +long adcPiReadAi (aiRecord *record) +{ + adcPiAiPrivate *priv = (adcPiAiPrivate*) record->dpvt; + int status; + + // printf("ReadAi: priv at @%p [%d]\n", priv, sizeof (adcPiAiPrivate) ); + + if (!priv) { + recGblSetSevr (record, UDF_ALARM, INVALID_ALARM); + errlogSevPrintf (errlogFatal, "adcPiReadAi %s: record not initialized correctly\n", record->name); + return -1; + } + unsigned short value; + status = adcPiGet (priv->card, priv->signal, &value); + if (status) { + errlogSevPrintf (errlogFatal, "adcPiReadAi %s: adcPiGet failes: error code 0x%x\n", record->name, status); + recGblSetSevr (record, READ_ALARM, INVALID_ALARM); + } + record->rval = value; + return status; // 2 do not convert +} + +long adcPiSpecialLinconvAi (aiRecord *record, int after) +{ + if (after) { + // printf(" In convert ....\n"); + // Check/Check ... + // MAX_CODE_12BIT / 2048 Volt + //record->eoff = ( 8191 * record->egul - -8192 * record->eguf) / (8191 - 8192); + record->eoff = 0; + record->eslo = 0.000250; // 205 uV (record->eguf - record->egul)/ (8191 - 8192); + } + return 0; +} + + +