Esempio n. 1
0
SoftSequence::SoftSequence(SeqManager *o, const std::string& name)
    :base_t(name)
    ,owner(o)
    ,hw(0)
    ,is_enabled(false)
    ,is_committed(false)
    ,is_insync(false)
    ,numStart(0u)
    ,numEnd(0u)
    ,timeScale(0u) // raw/ticks
{
    scanIoInit(&changed);
    scanIoInit(&onStart);
    scanIoInit(&onEnd);
    scanIoInit(&onErr);
}
Esempio n. 2
0
int myBoard_findIndex( const char *devicePath ) {
    int i;
    
    fprintf( stderr, "try to find %s\n", devicePath );

    for (i = 0; i < numBoard; ++i) {
        if (!strcmp( myHardwareBoardList[i].devicePath, devicePath )) {
            fprintf( stderr, "found %s at board[%d]\n", devicePath, i );
            return i;
        }
    }
    if (numBoard >= MAX_BOARD) {
        fprintf( stderr, "exceed MAX_BOARD\n" );
        return -1;
    }
    /* create new one: i==numBoard */
    fprintf( stderr, "create new %s at board[%d]\n", devicePath, i );
    strcpy( myHardwareBoardList[i].devicePath, devicePath );
    mySoftwareBoardList[i].boardLock = epicsMutexMustCreate();
    scanIoInit( &mySoftwareBoardList[i].ioScanPvt );

    myHardwareBoardList[i].analogReference = AREF_DIFF;
    mySoftwareBoardList[i].numberOfActiveAnalogInputs = MAX_CHANNEL_PER_BOARD / 2;

    if (openBoard( i )) {
        return -1;
    }

    ++numBoard;
    return i;
}
Esempio n. 3
0
static drvM6802_taskConfig* make_taskConfig(char *taskName, uint16 vme_addr)
{
	static uint16 boardcnt = 1;
	drvM6802_taskConfig *ptaskConfig = NULL;
	char task_name[60];
	int i;

	strcpy(task_name, taskName);

	ptaskConfig = (drvM6802_taskConfig*) malloc(sizeof(drvM6802_taskConfig));
	if(!ptaskConfig) return ptaskConfig;


	ptaskConfig->BoardID = boardcnt;
	ptaskConfig->vme_addr = vme_addr;
	strcpy(ptaskConfig->taskName, task_name);
	ptaskConfig->taskLock = epicsMutexCreate();
	ptaskConfig->bufferLock = epicsMutexCreate();
	scanIoInit(&ptaskConfig->ioScanPvt);
/*	ptaskConfig->masterMode = 0; */
	ptaskConfig->masterMode = ( ptaskConfig->BoardID == 1 ) ? 1 : 0;
	ptaskConfig->samplingRate = INIT_SAMPLING;
	ptaskConfig->appSampleRate = INIT_SAMPLING;
	ptaskConfig->channelMask = INIT_CH_MASK;
	ptaskConfig->clockSource = (ptaskConfig->BoardID == 1) ? 0 : 1; /* default 0 : internal clock ,  1: external*/
/*	ptaskConfig->msgFPDP	=	0; */
	ptaskConfig->cnt_DMAcallback = 0;
	ptaskConfig->nTrigPolarity = INIT_TRIG_POLARITY;
/*	ptaskConfig->pcallback = (CALLBACK*) taskCallback; */
	ptaskConfig->fT0 = 1.;
	ptaskConfig->fT1 = 2.;

	boardcnt++;

	ptaskConfig->pcontrolThreadConfig = NULL;
	ptaskConfig->pfpdpThreadConfig = NULL;


	for( i=0; i< 16 ; i++) 
		ptaskConfig->register_m6802[i] = DUMMY_DATA;

	ptaskConfig->adjTime_smplRate_Usec = 0.;
	ptaskConfig->adjTime_Gain_Usec = 0.;

	ptaskConfig->adjCount_smplRate = 0;
	ptaskConfig->adjCount_Gain = 0;


	ptaskConfig->pchannelConfig = (ELLLIST*) malloc(sizeof(ELLLIST));
	if(!ptaskConfig->pchannelConfig) return NULL;
	else ellInit(ptaskConfig->pchannelConfig);

	ptaskConfig->taskStatus = TASK_NOT_INIT;

	return ptaskConfig;

}
Esempio n. 4
0
evgSoftSeq::evgSoftSeq(const epicsUInt32 id, evgMrm* const owner):
m_lock(),
m_id(id),
m_owner(owner),
m_pReg(owner->getRegAddr()),
m_timestampInpMode(EGU),
m_trigSrc(None),
m_runMode(Single),
m_trigSrcCt(None),
m_runModeCt(Single),
m_seqRam(0),
m_seqRamMgr(owner->getSeqRamMgr()),
m_isEnabled(0),
m_isCommited(0),
m_isSynced(0),
m_numOfRuns(0) {
    m_eventCodeCt.push_back(0x7f);
    m_timestampCt.push_back(evgEndOfSeqBuf);

    scanIoInit(&ioscanpvt);
    scanIoInit(&ioScanPvtErr);
    scanIoInit(&iorunscan);
}
Esempio n. 5
0
LOCAL long init_signed_ai (struct aiRecord *prec)
{
  struct abio   *pabio;
  devPvt        *pdevPvt;
  abStatus       drvStatus;
  long	         status = 0;
  void          *drvPvt;

  if (prec->inp.type != AB_IO)
  {
    recGblRecordError (S_db_badField, (void *) prec, "init_signed_ai: Bad INP field");
    return (S_db_badField);
  }

  /* set linear conversion slope*/
  prec->eslo = (prec->eguf -prec->egul)/65535.0;
  /* pointer to the data addess structure */
  pabio = (struct abio *) &(prec->inp.value);
  drvStatus = (*pabDrv->registerCard) (pabio->link, pabio->adapter, pabio->card,
                                       typeBi, "BINARY", devCallback, &drvPvt);
  switch (drvStatus)
  {
  case abSuccess :
    pdevPvt    = (devPvt *) (*pabDrv->getUserPvt) (drvPvt);
    prec->dpvt = pdevPvt;
    break;

  case abNewCard :
    pdevPvt = calloc (1, sizeof (devPvt));
    pdevPvt->drvPvt = drvPvt;
    prec->dpvt      = pdevPvt;
    (*pabDrv->setUserPvt) (drvPvt, (void *) pdevPvt);
    scanIoInit (&pdevPvt->ioscanpvt);
    drvStatus = (*pabDrv->setNbits) (drvPvt, abBit16);
    if (drvStatus != abSuccess)
    {
      status = S_db_badField;
      recGblRecordError (status, (void *) prec, "init_signed_ai: setNbits");
    }
    break;

  default:
    status = S_db_badField;
    recGblRecordError (status, (void *)prec, "init_signed_ai: registerCard");
    break;
  }

  return (status);
}
Esempio n. 6
0
LOCAL long init_1771Il(struct aiRecord	*prec)
{
    struct abio *pabio;
    devPvt	*pdevPvt;
    abStatus 	drvStatus;
    long	status=0;
    void	*drvPvt;

    /* ai.inp must be an AB_IO */
    if (prec->inp.type != AB_IO){
    	recGblRecordError(S_db_badField,(void *)prec,
    		"devAiAb1771Il (init_record) Illegal INP field");
    	return(S_db_badField);
    }
    prec->eslo = (prec->eguf -prec->egul)/4095.0;
    /* pointer to the data addess structure */
    pabio = (struct abio *)&(prec->inp.value);
    drvStatus = (*pabDrv->registerCard)(pabio->link,pabio->adapter,
    	pabio->card,typeAi,"IL",devCallback,&drvPvt);
    switch(drvStatus) {
    case abSuccess :
        pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
        prec->dpvt = pdevPvt; 
	break;
    case abNewCard :
        pdevPvt = calloc(1,sizeof(devPvt));
        pdevPvt->drvPvt = drvPvt;
        prec->dpvt = pdevPvt; 
        (*pabDrv->setUserPvt)(drvPvt,(void *)pdevPvt);
        scanIoInit(&pdevPvt->ioscanpvt);
	pdevPvt->pinit_msg = initMsg;
        drvStatus = (*pabDrv->startScan)(drvPvt,IL_SCAN_RATE,
		pdevPvt->pinit_msg,IL_INITMSG_LENGTH,
		&pdevPvt->read_msg[0],IL_READMSG_LENGTH);
	if(drvStatus != abSuccess) {
	    status = S_db_badField;
    	    recGblRecordError(status,(void *)prec,
		"devAiAb1771Il (init_record) startScan");
	}
	break;
    default:
	status = S_db_badField;
    	recGblRecordError(status,(void *)prec,
	    "devAiAb1771Il (init_record) registerCard");
	break;
    }
    return(status);
}
Esempio n. 7
0
static long ai_init(int pass)
{
    long i;

    if (pass) return 0;

    /* Create timers */
    for (i = 0; i < TOTAL_TYPES; i++) {
        scanIoInit(&scan[i].ioscan);
        scan[i].wd = wdogCreate(scan_time, i);
        scan[i].total = 0;
        scan[i].on = 0;
        scan[i].rate_sec = parmTypes[i].scan_rate;
    }

    /* Init OSD stuff */
    scan_mutex = epicsMutexMustCreate();
    devIocStatsInitCpuUsage();
    devIocStatsInitCpuUtilization(&loadinfo);
    devIocStatsInitFDUsage();
    devIocStatsInitMemUsage();
    devIocStatsInitWorkspaceUsage();
    devIocStatsInitSuspTasks();
    devIocStatsInitIFErrors();
    /* Get initial values of a few things that don't change much */
    devIocStatsGetClusterInfo(SYS_POOL, &clustinfo[SYS_POOL]);
    devIocStatsGetClusterInfo(DATA_POOL, &clustinfo[DATA_POOL]);
    devIocStatsGetClusterUsage(SYS_POOL, &mbufnumber[SYS_POOL]);
    devIocStatsGetClusterUsage(DATA_POOL, &mbufnumber[DATA_POOL]);
    devIocStatsGetCpuUtilization(&loadinfo);
    devIocStatsGetIFErrors(&iferrors);
    devIocStatsGetFDUsage(&fdusage);

    /* Count EPICS records */
    if (pdbbase) {
        DBENTRY dbentry;
        long	  status;
        dbInitEntry(pdbbase,&dbentry);
        status = dbFirstRecordType(&dbentry);
        while (!status) {
            recordnumber += dbGetNRecords(&dbentry);
            status = dbNextRecordType(&dbentry);
        }
        dbFinishEntry(&dbentry);
    }
    return 0;
}
Esempio n. 8
0
Sim::Sim(const std::string& n)
    :name(n)
    ,stop(false)
    ,doSim(false)
    ,valid(false)
    ,level(0)
    ,worker(*this, "flame",
            epicsThreadGetStackSize(epicsThreadStackSmall),
            epicsThreadPriorityMedium)
{
    scanIoInit(&aftersim);

    memset(&last_run, 0, sizeof(last_run));
    last_duration = -1;

    worker.start();
}
Esempio n. 9
0
/* Common initialization for all record types */
static long init_record(dbCommon *rec, const DBLINK *link)
{
	DEVRTPData *pvt = calloc (sizeof (DEVRTPData), 1);
	if (! pvt)
	{
		errlogPrintf("devRTP (%s): cannot allocate DPVT\n", rec->name);
		return -1;
	}
	if (link->type != INST_IO)
	{
		errlogPrintf("devRTP (%s): INP is not INST_IO\n", rec->name);
		return -1;
	}
	scanIoInit(&pvt->ioscanpvt);
	rec->dpvt = pvt;

	return 0;
}
Esempio n. 10
0
LOCAL int get_ioint_info(void *ab1771IXPvt,int cmd, IOSCANPVT *ppvt)
{
    deviceData    *pdeviceData = (deviceData *)ab1771IXPvt;
    ab1771IXRecord *precord;
    recordPvt	  *precordPvt;
    int           signal;

    if(!pdeviceData) return(ab1771IXFatalError);
    if(!(precord = pdeviceData->precord)) return(ab1771IXFatalError);
    if(!(precordPvt = (recordPvt *)precord->dpvt)) return(ab1771IXFatalError);
    signal = pdeviceData->signal;
    if(!precordPvt->ioscanpvtInited[signal]) {
        scanIoInit(&precordPvt->ioscanpvt[signal]);
	precordPvt->ioscanpvtInited[pdeviceData->signal] = TRUE;
    }
    *ppvt = precordPvt->ioscanpvt[signal];
    return(0);
}
Esempio n. 11
0
int simRegDevConfigure(
    const char* name,
    size_t size,
    int swapEndianFlag,
    int async)
{
    regDevice* device;

    if (name == NULL)
    {
        printf("usage: simRegDevConfigure(\"name\", size, swapEndianFlag)\n");
        printf("maps allocated memory block to device \"name\"");
        printf("\"name\" must be a unique string on this IOC\n");
        return S_dev_success;
    }
    device = (regDevice*)calloc(sizeof(regDevice)+size-1,1);
    if (device == NULL)
    {
        errlogSevPrintf(errlogFatal,
            "simRegDevConfigure %s: out of memory\n",
            name);
        return errno;
    }
    device->magic = MAGIC;
    device->name = strdup(name);
    device->size = size;
    device->connected = 1;
    device->swap = swapEndianFlag;
    if (async)
    {
        int i;
        device->lock = epicsMutexCreate();
        for (i = 0; i < NUM_CALLBACK_PRIORITIES; i++)
        {
            const unsigned int prio [3] =
                {epicsThreadPriorityLow, epicsThreadPriorityMedium, epicsThreadPriorityHigh};
            device->queue[i] = epicsTimerQueueAllocate(FALSE, prio[i]);
        }
    }
    regDevRegisterDevice(name, &simRegDevSupport, device, size);
    scanIoInit(&device->ioscanpvt);
    return S_dev_success;
}
Esempio n. 12
0
static long ai_init(int pass)
{
	int i;

	if(pass) return 0;

	for(i=0;i<TOTAL_TYPES;i++)
	{
		scanIoInit(&scan[i].ioscan);
		scan[i].wd=wdCreate();
		scan[i].total=0;
		scan[i].on=0;
		scan[i].rate_sec=scan_rate_sec[i];
		scan[i].rate_tick=scan_rate_sec[i]*sysClkRateGet();
		scan[i].last_read_sec=1000000;
	}
	cpuUsageInit();
	return 0;
}
static long ai_init(int pass)
{
    long i;

    if (pass) return 0;

    /* Create timers */
    for (i = 0; i < TOTAL_TYPES; i++) {
        scanIoInit(&scan[i].ioscan);
        scan[i].wd = wdogCreate(scan_time, i);
        scan[i].total = 0;
        scan[i].on = 0;
        scan[i].rate_sec = scan_rate_sec[i];
        scan[i].last_read_sec = 1000000;
    }

    /* Init OSD stuff */
    devIocStatsInitCpuUsage();
    devIocStatsInitCpuUtilization(&loadinfo);
    devIocStatsInitFDUsage();
    devIocStatsInitMemUsage();
    devIocStatsInitWorkspaceUsage();
    devIocStatsInitSuspTasks();
    devIocStatsInitIFErrors();

    /* Count EPICS records */
    if (pdbbase) {
        DBENTRY dbentry;
        long	  status;
        dbInitEntry(pdbbase,&dbentry);
        status = dbFirstRecordType(&dbentry);
        while (!status) {
            recordnumber += dbGetNRecords(&dbentry);
            status = dbNextRecordType(&dbentry);
        }
        dbFinishEntry(&dbentry);
    }
    return 0;
}
Esempio n. 14
0
long snmp_Init(void *precord)
{            
  snmpRecord *psnmp = (snmpRecord *)precord;
  /* psnmp->dpvt = (SNMP_INFO*)gsnmpInfo; */

  printf("snmpInit()****** Message: %s, version: %s, ip: %s, name: %s, authpass: %s, privpass: %s\n",snmpinfo->msg, snmpinfo->version, snmpinfo->hostaddr, snmpinfo->username, snmpinfo->authpass, snmpinfo->privpass);

  if(recGblInitConstantLink(&psnmp->inp,DBF_DOUBLE,&psnmp->val))
    psnmp->udf = FALSE;


  devSNMPPvt *pdev = (devSNMPPvt *)malloc(sizeof (devSNMPPvt));
  if(pdev == NULL) return -1;

  pdev->mutexId = epicsMutexCreate();
  scanIoInit(&pdev->ioScanPvt);
  psnmp->dpvt = pdev;
  pdev->prec = (dbCommon*)precord;

  ellAdd(&devSNMPList, &(((devSNMPPvt*)psnmp->dpvt)->devSNMPNode));

  initialize(psnmp);
  return(0);
}
Esempio n. 15
0
static long initCommon(dbCommon *pr, DBLINK *plink,
    userCallback processCallback,interruptCallbackFloat64 interruptCallback)
{
    devPvt *pPvt;
    asynStatus status;
    asynUser *pasynUser;
    asynInterface *pasynInterface;

    pPvt = callocMustSucceed(1, sizeof(*pPvt), "devAsynFloat64::initCommon");
    pr->dpvt = pPvt;
    pPvt->pr = pr;
    /* Create asynUser */
    pasynUser = pasynManager->createAsynUser(processCallback, 0);
    pasynUser->userPvt = pPvt;
    pPvt->pasynUser = pasynUser;
    pPvt->ringBufferLock = epicsMutexCreate();
    /* Parse the link to get addr and port */
    status = pasynEpicsUtils->parseLink(pasynUser, plink,
                &pPvt->portName, &pPvt->addr,&pPvt->userParam);
    if (status != asynSuccess) {
        printf("%s devAsynFloat64::initCommon %s\n",
                     pr->name, pasynUser->errorMessage);
        goto bad;
    }
    /* Connect to device */
    status = pasynManager->connectDevice(pasynUser, pPvt->portName, pPvt->addr);
    if (status != asynSuccess) {
        printf("%s devAsynFloat64::initCommon connectDevice failed %s\n",
                     pr->name, pasynUser->errorMessage);
        goto bad;
    }
    status = pasynManager->canBlock(pPvt->pasynUser, &pPvt->canBlock);
    if (status != asynSuccess) {
        printf("%s devAsynFloat64::initCommon canBlock failed %s\n",
                     pr->name, pasynUser->errorMessage);
        goto bad;
    }
    /*call drvUserCreate*/
    pasynInterface = pasynManager->findInterface(pasynUser,asynDrvUserType,1);
    if(pasynInterface && pPvt->userParam) {
        asynDrvUser *pasynDrvUser;
        void       *drvPvt;

        pasynDrvUser = (asynDrvUser *)pasynInterface->pinterface;
        drvPvt = pasynInterface->drvPvt;
        status = pasynDrvUser->create(drvPvt,pasynUser,pPvt->userParam,0,0);
        if(status!=asynSuccess) {
            printf("%s devAsynFloat64::initCommon drvUserCreate %s\n",
                     pr->name, pasynUser->errorMessage);
            goto bad;
        }
    }
    /* Get interface asynFloat64 */
    pasynInterface = pasynManager->findInterface(pasynUser, asynFloat64Type, 1);
    if (!pasynInterface) {
        printf("%s devAsynFloat64::initCommon findInterface asynFloat64Type %s\n",
                     pr->name,pasynUser->errorMessage);
        goto bad;
    }
    pPvt->pfloat64 = pasynInterface->pinterface;
    pPvt->float64Pvt = pasynInterface->drvPvt;

    /* Initialize synchronous interface */
    status = pasynFloat64SyncIO->connect(pPvt->portName, pPvt->addr,
                 &pPvt->pasynUserSync, pPvt->userParam);
    if (status != asynSuccess) {
        printf("%s devAsynFloat64::initCommon Float64SyncIO->connect failed %s\n",
               pr->name, pPvt->pasynUserSync->errorMessage);
        goto bad;
    }

    scanIoInit(&pPvt->ioScanPvt);
    pPvt->interruptCallback = interruptCallback;

    /* If the info field "asyn:READBACK" is 1 and interruptCallback is not NULL 
     * then register for callbacks on output records */
    if (interruptCallback) {
        int enableCallbacks=0;
        const char *callbackString;
        DBENTRY *pdbentry = dbAllocEntry(pdbbase);
        status = dbFindRecord(pdbentry, pr->name);
        if (status) {
            asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR,
                "%s devAsynFloat64::initCommon error finding record\n",
                pr->name);
            goto bad;
        }
        callbackString = dbGetInfo(pdbentry, "asyn:READBACK");
        if (callbackString) enableCallbacks = atoi(callbackString);
        if (enableCallbacks) {
            status = createRingBuffer(pr);
            if (status!=asynSuccess) goto bad;
            status = pPvt->pfloat64->registerInterruptUser(
               pPvt->float64Pvt,pPvt->pasynUser,
               pPvt->interruptCallback,pPvt,&pPvt->registrarPvt);
            if(status!=asynSuccess) {
                printf("%s devAsynFloat64::initRecord error calling registerInterruptUser %s\n",
                       pr->name,pPvt->pasynUser->errorMessage);
            }
        }
    }
    return INIT_OK;
bad:
    recGblSetSevr(pr,LINK_ALARM,INVALID_ALARM);
    pr->pact=1;
    return INIT_ERROR;
}
Esempio n. 16
0
static void ntpShmInit()
{
    scanIoInit(&ntpShm.lastUpdate);
}
Esempio n. 17
0
static long initCommon(dbCommon *pr, DBLINK *plink,
    userCallback processCallback,interruptCallbackInt32 interruptCallback)
{
    devInt32Pvt *pPvt;
    asynStatus status;
    asynUser *pasynUser;
    asynInterface *pasynInterface;
    epicsUInt32 mask=0;
    int nbits;

    pPvt = callocMustSucceed(1, sizeof(*pPvt), "devAsynInt32::initCommon");
    pr->dpvt = pPvt;
    pPvt->pr = pr;
    /* Create asynUser */
    pasynUser = pasynManager->createAsynUser(processCallback, 0);
    pasynUser->userPvt = pPvt;
    pPvt->pasynUser = pasynUser;
    pPvt->mutexId = epicsMutexCreate();
 
    /* Parse the link to get addr and port */
    /* We accept 2 different link syntax (@asyn(...) and @asynMask(...)
     * If parseLink returns an error then try parseLinkMask. */
    status = pasynEpicsUtils->parseLink(pasynUser, plink, 
                &pPvt->portName, &pPvt->addr, &pPvt->userParam);
    if (status != asynSuccess) {
        status = pasynEpicsUtils->parseLinkMask(pasynUser, plink, 
                &pPvt->portName, &pPvt->addr, &mask, &pPvt->userParam);
    }
    if (status != asynSuccess) {
        printf("%s devAsynInt32::initCommon  %s\n",
                     pr->name, pasynUser->errorMessage);
        goto bad;
    }
    
    /* Parse nbits if it was specified */
    nbits = (int)mask;
    if (nbits) {
        if (nbits < 0) {
            nbits = -nbits;
            pPvt->bipolar = 1;
        }
        pPvt->signBit = (epicsInt32) ldexp(1.0, nbits-1);
        pPvt->mask = pPvt->signBit*2 - 1;
        if (pPvt->bipolar) {
            pPvt->deviceLow = ~(pPvt->mask/2)+1;
            pPvt->deviceHigh = (pPvt->mask/2);
        } else {
            pPvt->deviceLow = 0;
            pPvt->deviceHigh = pPvt->mask;
        }
    }
            
    /* Connect to device */
    status = pasynManager->connectDevice(pasynUser, pPvt->portName, pPvt->addr);
    if (status != asynSuccess) {
        printf("%s devAsynInt32::initCommon connectDevice failed %s\n",
                     pr->name, pasynUser->errorMessage);
        goto bad;
    }
    status = pasynManager->canBlock(pPvt->pasynUser, &pPvt->canBlock);
    if (status != asynSuccess) {
        printf("%s devAsynInt32::initCommon canBlock failed %s\n",
                     pr->name, pasynUser->errorMessage);
        goto bad;
    }
    /*call drvUserCreate*/
    pasynInterface = pasynManager->findInterface(pasynUser,asynDrvUserType,1);
    if(pasynInterface && pPvt->userParam) {
        asynDrvUser *pasynDrvUser;
        void       *drvPvt;

        pasynDrvUser = (asynDrvUser *)pasynInterface->pinterface;
        drvPvt = pasynInterface->drvPvt;
        status = pasynDrvUser->create(drvPvt,pasynUser,pPvt->userParam,0,0);
        if(status!=asynSuccess) {
            printf("%s devAsynInt32::initCommon drvUserCreate %s\n",
                     pr->name, pasynUser->errorMessage);
            goto bad;
        }
    }
    /* Get interface asynInt32 */
    pasynInterface = pasynManager->findInterface(pasynUser, asynInt32Type, 1);
    if (!pasynInterface) {
        printf("%s devAsynInt32::initCommon findInterface asynInt32Type %s\n",
                     pr->name,pasynUser->errorMessage);
        goto bad;
    }
    pPvt->pint32 = pasynInterface->pinterface;
    pPvt->int32Pvt = pasynInterface->drvPvt;
    scanIoInit(&pPvt->ioScanPvt);
    pPvt->interruptCallback = interruptCallback;
    /* Initialize synchronous interface */
    status = pasynInt32SyncIO->connect(pPvt->portName, pPvt->addr, 
                 &pPvt->pasynUserSync, pPvt->userParam);
    if (status != asynSuccess) {
        printf("%s devAsynInt32::initCommon Int32SyncIO->connect failed %s\n",
               pr->name, pPvt->pasynUserSync->errorMessage);
        goto bad;
    }
    return 0;
bad:
   pr->pact=1;
   return -1;
}
Esempio n. 18
0
static long initCommon(dbCommon *pr, DBLINK *plink,
    userCallback processCallback,interruptCallbackUInt32Digital interruptCallback, interruptCallbackEnum callbackEnum,
    int maxEnums, char *pFirstString, int *pFirstValue, epicsEnum16 *pFirstSeverity)
{
    devPvt *pPvt;
    asynStatus status;
    asynUser *pasynUser;
    asynInterface *pasynInterface;

    pPvt = callocMustSucceed(1, sizeof(*pPvt), "devAsynUInt32Digital::initCommon");
    pr->dpvt = pPvt;
    pPvt->pr = pr;
    /* Create asynUser */
    pasynUser = pasynManager->createAsynUser(processCallback, 0);
    pasynUser->userPvt = pPvt;
    pPvt->pasynUser = pasynUser;
    pPvt->ringBufferLock = epicsMutexCreate();
    /* Parse the link to get addr and port */
    status = pasynEpicsUtils->parseLinkMask(pasynUser, plink, 
                &pPvt->portName, &pPvt->addr, &pPvt->mask,&pPvt->userParam);
    if (status != asynSuccess) {
        printf("%s devAsynUInt32Digital::initCommon %s\n",
                     pr->name, pasynUser->errorMessage);
        goto bad;
    }
    /* Connect to device */
    status = pasynManager->connectDevice(pasynUser, pPvt->portName, pPvt->addr);
    if (status != asynSuccess) {
        printf("%s devAsynUInt32Digital::initCommon connectDevice failed %s\n",
                     pr->name, pasynUser->errorMessage);
        goto bad;
    }
    status = pasynManager->canBlock(pPvt->pasynUser, &pPvt->canBlock);
    if (status != asynSuccess) {
        printf("%s devAsynUInt32Digital::initCommon canBlock failed %s\n",
                     pr->name, pasynUser->errorMessage);
        goto bad;
    }
    /*call drvUserCreate*/
    pasynInterface = pasynManager->findInterface(pasynUser,asynDrvUserType,1);
    if(pasynInterface && pPvt->userParam) {
        asynDrvUser *pasynDrvUser;
        void       *drvPvt;

        pasynDrvUser = (asynDrvUser *)pasynInterface->pinterface;
        drvPvt = pasynInterface->drvPvt;
        status = pasynDrvUser->create(drvPvt,pasynUser,pPvt->userParam,0,0);
        if(status!=asynSuccess) {
            printf("%s devAsynUInt32Digital::initCommon drvUserCreate %s\n",
                     pr->name, pasynUser->errorMessage);
            goto bad;
        }
    }
    /* Get interface asynUInt32Digital */
    pasynInterface = pasynManager->findInterface(pasynUser, asynUInt32DigitalType, 1);
    if (!pasynInterface) {
        printf("%s devAsynUInt32Digital::initCommon "
               "findInterface asynUInt32DigitalType %s\n",
                     pr->name,pasynUser->errorMessage);
        goto bad;
    }
    pPvt->puint32 = pasynInterface->pinterface;
    pPvt->uint32Pvt = pasynInterface->drvPvt;

    /* Initialize synchronous interface */
    status = pasynUInt32DigitalSyncIO->connect(pPvt->portName, pPvt->addr,
                 &pPvt->pasynUserSync, pPvt->userParam);
    if (status != asynSuccess) {
        printf("%s devAsynUInt32Digital::initCommon UInt32DigitalSyncIO->connect failed %s\n",
               pr->name, pPvt->pasynUserSync->errorMessage);
        goto bad;
    }
    pPvt->interruptCallback = interruptCallback;
    scanIoInit(&pPvt->ioScanPvt);

    /* Initialize asynEnum interfaces */
    pasynInterface = pasynManager->findInterface(pPvt->pasynUser,asynEnumType,1);
    if (pasynInterface && (maxEnums > 0)) {
        size_t numRead;
        asynEnum *pasynEnum = pasynInterface->pinterface;
        void *registrarPvt;
        status = pasynEnumSyncIO->connect(pPvt->portName, pPvt->addr, 
                 &pPvt->pasynUserEnumSync, pPvt->userParam);
        if (status != asynSuccess) {
            printf("%s devAsynUInt32Digital::initCommon EnumSyncIO->connect failed %s\n",
                   pr->name, pPvt->pasynUserEnumSync->errorMessage);
            goto bad;
        }
        status = pasynEnumSyncIO->read(pPvt->pasynUserEnumSync,
                    pPvt->enumStrings, pPvt->enumValues, pPvt->enumSeverities, maxEnums, 
                    &numRead, pPvt->pasynUser->timeout);
        if (status == asynSuccess) {
            setEnums(pFirstString, pFirstValue, pFirstSeverity, 
                     pPvt->enumStrings, pPvt->enumValues,  pPvt->enumSeverities, numRead, maxEnums);
        }
        status = pasynEnum->registerInterruptUser(
           pasynInterface->drvPvt, pPvt->pasynUser,
           callbackEnum, pPvt, &registrarPvt);
        if(status!=asynSuccess) {
            printf("%s devAsynUInt32Digital enum registerInterruptUser %s\n",
                   pr->name,pPvt->pasynUser->errorMessage);
        }
    }
    /* If the info field "asyn:READBACK" is 1 and interruptCallback is not NULL 
     * then register for callbacks on output records */
    if (interruptCallback) {
        int enableCallbacks=0;
        const char *callbackString;
        DBENTRY *pdbentry = dbAllocEntry(pdbbase);
        status = dbFindRecord(pdbentry, pr->name);
        if (status) {
            asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR,
                "%s devAsynUInt32Digital::initCommon error finding record\n",
                pr->name);
            goto bad;
        }
        callbackString = dbGetInfo(pdbentry, "asyn:READBACK");
        if (callbackString) enableCallbacks = atoi(callbackString);
        if (enableCallbacks) {
            status = createRingBuffer(pr);
            if (status!=asynSuccess) goto bad;
            status = pPvt->puint32->registerInterruptUser(
               pPvt->uint32Pvt,pPvt->pasynUser,
               pPvt->interruptCallback,pPvt,pPvt->mask, &pPvt->registrarPvt);
            if(status!=asynSuccess) {
                printf("%s devAsynUInt32Digital::initRecord error calling registerInterruptUser %s\n",
                       pr->name,pPvt->pasynUser->errorMessage);
            }
        }
    }
    return INIT_OK;
bad:
    recGblSetSevr(pr,LINK_ALARM,INVALID_ALARM);
    pr->pact=1;
    return INIT_ERROR;
}
Esempio n. 19
0
LOCAL long drvTPG262_init(char *portName, char *unitName, double devTimeout, double cbTimeout, double scanInterval)
{
    static int firstTime = 1;
    drvTPG262Config*  pdrvTPG262Config = NULL;
    TPG262_read*      pTPG262_read     = NULL;
    asynUser*         pasynTPG262User  = NULL;
    asynTPG262UserData* pasynTPG262UserData = NULL;
    asynInterface*    pasynTPG262Interface = NULL;
    asynStatus        asynTPG262Status;

    char port_name[40];
    char unit_name[40];

    if(firstTime) {
        firstTime = 0;
        epicsThreadCreate("drvTPG262ScanTask",
                          epicsThreadPriorityLow,
                          epicsThreadGetStackSize(epicsThreadStackSmall),
                          (EPICSTHREADFUNC) drvTPG262_scanTask,
                          0); 
    }

    strcpy(port_name,portName); 
    strcpy(unit_name,unitName);
    
    if(!pdrvTPG262_ellList) { 
        pdrvTPG262_ellList = (ELLLIST *) malloc(sizeof(ELLLIST));
        ellInit(pdrvTPG262_ellList);
    }

    if(drvTPG262_find(port_name)) return 0;       /* driver was intialized alrady, nothing to do */
    
    pdrvTPG262Config = (drvTPG262Config*) malloc(sizeof(drvTPG262Config));
    pTPG262_read     = (TPG262_read*) malloc(sizeof(TPG262_read));
    pasynTPG262UserData = (asynTPG262UserData*) malloc(sizeof(asynTPG262UserData));
    if(!pdrvTPG262Config || !pTPG262_read || !pasynTPG262UserData) return 0;

    pdrvTPG262Config->devTimeout = devTimeout;
    pdrvTPG262Config->cbTimeout = cbTimeout;
    pdrvTPG262Config->scanInterval = scanInterval;


    strcpy(pdrvTPG262Config->port_name, port_name);
    pdrvTPG262Config->cbCount = 0;
    pdrvTPG262Config->timeoutCount = 0;
    pdrvTPG262Config->reconnCount = 0;
    pTPG262_read->unit = drvTPG262_findUnit(unit_name);
    if(pTPG262_read->unit<0) pTPG262_read->unit = 1;      /* default unit */
    pTPG262_read->unit_str = tUnitList[vUnitList[pTPG262_read->unit]];
    pTPG262_read->gst0 = TPG262GST_TIMEOUT; 
    pTPG262_read->gst1 = TPG262GST_TIMEOUT;
    pTPG262_read->prs0 = 0.;
    pTPG262_read->prs1 = 0.;
    pTPG262_read->gst_str0 = tSenStList[vSenStList[pTPG262_read->gst0]];
    pTPG262_read->gst_str1 = tSenStList[vSenStList[pTPG262_read->gst1]];
    strcpy(pTPG262_read->gid_str0, TPG262GID_UNKNOWN_STR);
    strcpy(pTPG262_read->gid_str1, TPG262GID_UNKNOWN_STR);
    strcpy(pTPG262_read->progver_str, TPG262PROGVER_UNKNOWN_STR);

    pasynTPG262UserData->pdrvTPG262Config = (void*) pdrvTPG262Config;
    pasynTPG262User = pasynManager->createAsynUser(drvTPG262_queueCallback, drvTPG262_timeoutCallback);
    pasynTPG262User->timeout = pdrvTPG262Config->devTimeout;
    pasynTPG262User->userPvt = pasynTPG262UserData;
    asynTPG262Status = pasynManager->connectDevice(pasynTPG262User, port_name, 0);
    if(asynTPG262Status != asynSuccess) {
        goto end;
    }
    pasynTPG262Interface = pasynManager->findInterface(pasynTPG262User, asynOctetType, 1);
    if(!pasynTPG262Interface){
         goto end;
    }
    pasynTPG262UserData->pasynTPG262Octet = (asynOctet*)pasynTPG262Interface->pinterface;
    pasynTPG262UserData->pdrvPvt = pasynTPG262Interface->drvPvt; 
    pdrvTPG262Config->lock = epicsMutexCreate();
    scanIoInit(&pdrvTPG262Config->ioScanPvt);
    pdrvTPG262Config->pTPG262_read = pTPG262_read;
    pdrvTPG262Config->pasynTPG262User = pasynTPG262User;
    pdrvTPG262Config->pasynTPG262UserData = pasynTPG262UserData;
    pdrvTPG262Config->status = TPG262STATUS_TIMEOUT_MASK |
                               TPG262STATUS_SETUNIT_MASK |
                               TPG262STATUS_GETGID_MASK |
                               TPG262STATUS_GETPROGVER_MASK;
    ellAdd(pdrvTPG262_ellList, &pdrvTPG262Config->node);
   
    return 0;

    end:
        /* relase allocated memory and asynInterface */
    return 0;
}
Esempio n. 20
0
void
xycom566setup(
      int id,
      int cbase,
      int dbase,
      int level,
      int vec,
      int bipol
){
  xy566 *card;
  volatile epicsUInt8  **cb;
  volatile epicsUInt16 **db;
  epicsUInt16 junk;

  if(cbase<0 || cbase>0xffff){
    printf("config (A16) out of range\n");
    return;
  }
  if(dbase<0 || dbase>0xffffff){
    printf("data (A24) out of range\n");
    return;
  }

  if(level<0 || level>7){
    printf("Level out of range (0->7)\n");
    return;
  }
  if(vec<0 || vec>0xff){
    printf("Vector out of range (0->255)\n");
    return;
  }

  card=get566(id);
  if(!!card){
    printf("ID %d already exists\n",id);
    return;
  }

  card=malloc(sizeof(xy566));
  if(!card){
    printf("Out of memory!\n");
    return;
  }

  memset(&card->dlen,0,sizeof(card->dlen));
  memset(&card->cb_irq,0,sizeof(card->cb_irq));

  card->id=id;
  card->fail=0;
  card->clk_div=0; /* stc uninitialized */
  card->use_seq_clk=0;
  ellInit(&card->seq_ctor);

  if(!bipol)
    card->nchan=32;
  else
    card->nchan=16;
  card->ivec=vec;

  card->base_addr=cbase;
  card->data_addr=dbase;

  cb=&card->base;
  db=&card->data_base;

  if(devBusToLocalAddr(atVMEA16, card->base_addr, (volatile void **)cb)){
    printf("Failed to map A16 %lx for card %x\n", (unsigned long)card->base_addr,id);
    free(card);
    return;
  }

  if(devBusToLocalAddr(atVMEA24, card->data_addr, (volatile void **)db)){
    printf("Failed to map A24 %lx for card %x\n", (unsigned long)card->data_base,id);
    free(card);
    return;
  }

  if(devReadProbe(2, card->base+U16_XY566_CSR, &junk)){
    printf("Failed to read A16 %lx for card %x\n", (unsigned long)(card->base+U16_XY566_CSR),id);
    free(card);
    return;
  }

  if(devReadProbe(2, card->data_base, &junk)){
    printf("Failed to read A24 %lx for card %x\n", (unsigned long)(card->data_base),id);
    free(card);
    return;
  }

  WRITE16(card->base, XY566_CSR, XY566_CSR_RST); /* Reset */
  /* turn on green and red to indicate init start */
  WRITE16(card->base, XY566_CSR, XY566_CSR_GRN);

  WRITE16(card->base, XY566_RAM, 0);
  WRITE8(card->base, XY566_SEQ, 0);

  card->guard=epicsMutexMustCreate();
  scanIoInit(&card->seq_irq);
  callbackSetCallback(xycom566isrcb, &card->cb_irq);
  callbackSetPriority(priorityHigh, &card->cb_irq);
  callbackSetUser(card, &card->cb_irq);

  WRITE8(card->base, XY566_VEC, vec);

  devEnableInterruptLevelVME(level);
  assert(devConnectInterruptVME(vec, xycom566isr, card)==0);

  /* Configure card
   * Mode: continuous sequence (default)
   * 16 bit conversion (default)
   * sequence controller disable (will be enabled during drvsup init)
   */
  WRITE16(card->base, XY566_CSR,
    XY566_CSR_GRN);

  ellAdd(&xy566s,&card->node);
}
Esempio n. 21
0
static long drvMK80S_init(char *portName, double devTimeout, double cbTimeout, double scanInterval)
{
    static int firstTime = 1;
    char port_name[40];

    drvMK80SConfig		*pdrvMK80SConfig	= NULL;
    MK80S_read			*pMK80S_read		= NULL;
    asynUser			*pasynMK80SUser		= NULL;
    asynMK80SUserData	*pasynMK80SUserData	= NULL;
    asynInterface		*pasynMK80SInterface= NULL;
    asynStatus			asynMK80SStatus;

    if(firstTime) {
        firstTime = 0;
        epicsThreadCreate("drvMK80SScanTask",
                          epicsThreadPriorityLow,
                          epicsThreadGetStackSize(epicsThreadStackSmall),
                          (EPICSTHREADFUNC) drvMK80S_scanTask,
                          0); 
    }

    strcpy(port_name,portName); 
    
    if(!pdrvMK80S_ellList) { 
        pdrvMK80S_ellList = (ELLLIST *) malloc(sizeof(ELLLIST));
        ellInit(pdrvMK80S_ellList);
    }

    if(!pdrvMK80SBitInputList) { 
        pdrvMK80SBitInputList = (drvMK80SInputList *) calloc(1, sizeof(drvMK80SInputList));
		pdrvMK80SBitInputList->num = 0;
    }

    if(!pdrvMK80SWordInputList) { 
        pdrvMK80SWordInputList = (drvMK80SInputList *) calloc(1, sizeof(drvMK80SInputList));
		pdrvMK80SWordInputList->num = 0;
    }

    if(drvMK80S_find(port_name)) return 0;       /* driver was intialized alrady, nothing to do */
    
    pdrvMK80SConfig = (drvMK80SConfig*) malloc(sizeof(drvMK80SConfig));
    pMK80S_read     = (MK80S_read*) malloc(sizeof(MK80S_read));
    pasynMK80SUserData = (asynMK80SUserData*) malloc(sizeof(asynMK80SUserData));
    if(!pdrvMK80SConfig || !pMK80S_read || !pasynMK80SUserData) return 0;

    pdrvMK80SConfig->devTimeout = devTimeout;
    pdrvMK80SConfig->cbTimeout = cbTimeout;
    pdrvMK80SConfig->scanInterval = scanInterval;

    strcpy(pdrvMK80SConfig->port_name, port_name);
    pdrvMK80SConfig->cbCount = 0;
    pdrvMK80SConfig->timeoutCount = 0;

	memset (pMK80S_read, 0x00, sizeof(MK80S_read));

    pasynMK80SUserData->pdrvMK80SConfig = (void*) pdrvMK80SConfig;
    pasynMK80SUser = pasynManager->createAsynUser(drvMK80S_queueCallback, drvMK80S_timeoutCallback);
    pasynMK80SUser->timeout = pdrvMK80SConfig->devTimeout;
    pasynMK80SUser->userPvt = pasynMK80SUserData;

    asynMK80SStatus = pasynManager->connectDevice(pasynMK80SUser, port_name, 0);
    if(asynMK80SStatus != asynSuccess) {
        goto end;
    }

    pasynMK80SInterface = pasynManager->findInterface(pasynMK80SUser, asynOctetType, 1);
    if(!pasynMK80SInterface){
         goto end;
    }

    pasynMK80SUserData->pasynMK80SOctet = (asynOctet*)pasynMK80SInterface->pinterface;

	// set EOS(end of string) of receive message
	pasynMK80SUserData->pasynMK80SOctet->setInputEos(pasynMK80SInterface->drvPvt, pasynMK80SUser, ETX_STR, 1);

    pasynMK80SUserData->pdrvPvt = pasynMK80SInterface->drvPvt; 
    pdrvMK80SConfig->lock = epicsMutexCreate();

    scanIoInit(&pdrvMK80SConfig->ioScanPvt);

    pdrvMK80SConfig->pMK80S_read = pMK80S_read;
    pdrvMK80SConfig->pasynMK80SUser = pasynMK80SUser;
    pdrvMK80SConfig->pasynMK80SUserData = pasynMK80SUserData;
    pdrvMK80SConfig->status = MK80SSTATUS_TIMEOUT_MASK;

    ellAdd(pdrvMK80S_ellList, &pdrvMK80SConfig->node);
   
    return 0;

end:
	/* relase allocated memory and asynInterface */

	kuDebug (kuERR, "[drvMK80S_init] init failed for %s!!!\n", port_name);

    return 0;
}
Esempio n. 22
0
evgMrm::evgMrm(const std::string& id, volatile epicsUInt8* const pReg):
mrf::ObjectInst<evgMrm>(id),
irqStop0_queued(0),
irqStop1_queued(0),
irqExtInp_queued(0),
m_syncTimestamp(false),
m_buftx(id+":BUFTX",pReg+U32_DataBufferControl, pReg+U8_DataBuffer_base),
m_id(id),
m_pReg(pReg),
m_acTrig(id+":AcTrig", pReg),
m_evtClk(id+":EvtClk", pReg),
m_softEvt(id+":SoftEvt", pReg),
m_seqRamMgr(this),
m_softSeqMgr(this) {

    try{
        for(int i = 0; i < evgNumEvtTrig; i++) {
            std::ostringstream name;
            name<<id<<":TrigEvt"<<i;
            m_trigEvt.push_back(new evgTrigEvt(name.str(), i, pReg));
        }

        for(int i = 0; i < evgNumMxc; i++) {
            std::ostringstream name;
            name<<id<<":Mxc"<<i;
            m_muxCounter.push_back(new evgMxc(name.str(), i, this));
        }

        for(int i = 0; i < evgNumDbusBit; i++) {
            std::ostringstream name;
            name<<id<<":Dbus"<<i;
            m_dbus.push_back(new evgDbus(name.str(), i, pReg));
        }

        for(int i = 0; i < evgNumFrontInp; i++) {
            std::ostringstream name;
            name<<id<<":FrontInp"<<i;
            m_input[ std::pair<epicsUInt32, InputType>(i, FrontInp) ] =
                new evgInput(name.str(), i, FrontInp, pReg + U32_FrontInMap(i));
        }

        for(int i = 0; i < evgNumUnivInp; i++) {
            std::ostringstream name;
            name<<id<<":UnivInp"<<i;
            m_input[ std::pair<epicsUInt32, InputType>(i, UnivInp) ] =
                new evgInput(name.str(), i, UnivInp, pReg + U32_UnivInMap(i));
        }

        for(int i = 0; i < evgNumRearInp; i++) {
            std::ostringstream name;
            name<<id<<":RearInp"<<i;
            m_input[ std::pair<epicsUInt32, InputType>(i, RearInp) ] =
                new evgInput(name.str(), i, RearInp, pReg + U32_RearInMap(i));
        }

        for(int i = 0; i < evgNumFrontOut; i++) {
            std::ostringstream name;
            name<<id<<":FrontOut"<<i;
            m_output[std::pair<epicsUInt32, evgOutputType>(i, FrontOut)] =
                new evgOutput(name.str(), i, FrontOut, pReg + U16_FrontOutMap(i));
        }

        for(int i = 0; i < evgNumUnivOut; i++) {
            std::ostringstream name;
            name<<id<<":UnivOut"<<i;
            m_output[std::pair<epicsUInt32, evgOutputType>(i, UnivOut)] =
                new evgOutput(name.str(), i, UnivOut, pReg + U16_UnivOutMap(i));
        }
    
        m_wdTimer = new wdTimer("Watch Dog Timer", this);
        m_timerEvent = new epicsEvent();

        init_cb(&irqStop0_cb, priorityHigh, &evgMrm::process_eos0_cb,
                                            m_seqRamMgr.getSeqRam(0));
        init_cb(&irqStop1_cb, priorityHigh, &evgMrm::process_eos1_cb,
                                            m_seqRamMgr.getSeqRam(1));
        init_cb(&irqExtInp_cb, priorityHigh, &evgMrm::process_inp_cb, this);
    
        scanIoInit(&ioScanTimestamp);
    } catch(std::exception& e) {
        errlogPrintf("Error: %s\n", e.what());
    }
}
Esempio n. 23
0
static long initCommon(dbCommon *pr, DBLINK *plink,
    userCallback processCallback,interruptCallbackFloat64 interruptCallback)
{
    devPvt *pPvt;
    asynStatus status;
    asynUser *pasynUser;
    asynInterface *pasynInterface;

    pPvt = callocMustSucceed(1, sizeof(*pPvt), "devAsynFloat64::initCommon");
    pr->dpvt = pPvt;
    pPvt->pr = pr;
    /* Create asynUser */
    pasynUser = pasynManager->createAsynUser(processCallback, 0);
    pasynUser->userPvt = pPvt;
    pPvt->pasynUser = pasynUser;
    pPvt->mutexId = epicsMutexCreate();
    /* Parse the link to get addr and port */
    status = pasynEpicsUtils->parseLink(pasynUser, plink,
                &pPvt->portName, &pPvt->addr,&pPvt->userParam);
    if (status != asynSuccess) {
        printf("%s devAsynFloat64::initCommon %s\n",
                     pr->name, pasynUser->errorMessage);
        goto bad;
    }
    /* Connect to device */
    status = pasynManager->connectDevice(pasynUser, pPvt->portName, pPvt->addr);
    if (status != asynSuccess) {
        printf("%s devAsynFloat64::initCommon connectDevice failed %s\n",
                     pr->name, pasynUser->errorMessage);
        goto bad;
    }
    status = pasynManager->canBlock(pPvt->pasynUser, &pPvt->canBlock);
    if (status != asynSuccess) {
        printf("%s devAsynFloat64::initCommon canBlock failed %s\n",
                     pr->name, pasynUser->errorMessage);
        goto bad;
    }
    /*call drvUserCreate*/
    pasynInterface = pasynManager->findInterface(pasynUser,asynDrvUserType,1);
    if(pasynInterface && pPvt->userParam) {
        asynDrvUser *pasynDrvUser;
        void       *drvPvt;

        pasynDrvUser = (asynDrvUser *)pasynInterface->pinterface;
        drvPvt = pasynInterface->drvPvt;
        status = pasynDrvUser->create(drvPvt,pasynUser,pPvt->userParam,0,0);
        if(status!=asynSuccess) {
            printf("%s devAsynFloat64::initCommon drvUserCreate %s\n",
                     pr->name, pasynUser->errorMessage);
            goto bad;
        }
    }
    /* Get interface asynFloat64 */
    pasynInterface = pasynManager->findInterface(pasynUser, asynFloat64Type, 1);
    if (!pasynInterface) {
        printf("%s devAsynFloat64::initCommon findInterface asynFloat64Type %s\n",
                     pr->name,pasynUser->errorMessage);
        goto bad;
    }
    pPvt->pfloat64 = pasynInterface->pinterface;
    pPvt->float64Pvt = pasynInterface->drvPvt;

    /* Initialize synchronous interface */
    status = pasynFloat64SyncIO->connect(pPvt->portName, pPvt->addr,
                 &pPvt->pasynUserSync, pPvt->userParam);
    if (status != asynSuccess) {
        printf("%s devAsynFloat64::initCommon Float64SyncIO->connect failed %s\n",
               pr->name, pPvt->pasynUserSync->errorMessage);
        goto bad;
    }

    scanIoInit(&pPvt->ioScanPvt);
    pPvt->interruptCallback = interruptCallback;

    return 0;
bad:
   pr->pact=1;
   return -1;
}