diff --git a/Makefile b/Makefile index 5bf9e4e..1ee8bf4 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,9 @@ ifneq ($(EPICS_LIBCOM_ONLY),YES) DIRS += testOutputReadbackApp testOutputReadbackApp_DEPEND_DIRS = asyn iocBoot_DEPEND_DIRS += testOutputReadbackApp + DIRS += testOutputCallbackApp + testOutputCallbackApp_DEPEND_DIRS = asyn + iocBoot_DEPEND_DIRS += testOutputCallbackApp DIRS += testUsbtmcApp testUsbtmcApp_DEPEND_DIRS = asyn iocBoot_DEPEND_DIRS += testUsbtmcApp diff --git a/asyn/asynDriver/asynDriver.h b/asyn/asynDriver/asynDriver.h index 7f887b1..208a8b7 100644 --- a/asyn/asynDriver/asynDriver.h +++ b/asyn/asynDriver/asynDriver.h @@ -23,7 +23,7 @@ /* Version number names similar to those provide by base * These macros are always numeric */ #define ASYN_VERSION 4 -#define ASYN_REVISION 32 +#define ASYN_REVISION 33 #define ASYN_MODIFICATION 0 #ifdef __cplusplus diff --git a/asyn/asynDriver/asynManager.c b/asyn/asynDriver/asynManager.c index b638965..d4ec258 100644 --- a/asyn/asynDriver/asynManager.c +++ b/asyn/asynDriver/asynManager.c @@ -186,6 +186,13 @@ struct device { int addr; }; +typedef enum portConnectStatus { + portConnectSuccess, + portConnectDevice, + portConnectFindInterface, + portConnectDriver +} portConnectStatus; + struct port { ELLNODE node; /*For asynBase.asynPortList*/ char *portName; @@ -197,6 +204,8 @@ struct port { int attributes; /* The following are for autoConnect*/ asynUser *pasynUser; + double secondsBetweenPortConnect; + portConnectStatus previousConnectStatus; /* The following are for asynLockPortNotify */ asynLockPortNotify *pasynLockPortNotify; void *lockPortNotifyPvt; @@ -216,8 +225,7 @@ struct port { epicsTimeStamp timeStamp; timeStampCallback timeStampSource; void *timeStampPvt; - double secondsBetweenPortConnect; - }; +}; typedef struct queueLockPortPvt { epicsEventId queueLockPortEvent; @@ -452,6 +460,18 @@ static void tracePvtFree(tracePvt *ptracePvt) free(ptracePvt->traceBuffer); } +static void reportConnectStatus(port *pport, portConnectStatus status, const char *fmt, ...) +{ + va_list args; + + if (pport->previousConnectStatus != status) { + pport->previousConnectStatus = status; + va_start(args, fmt); + pasynTrace->vprint(pport->pasynUser, ASYN_TRACE_ERROR, fmt, args); + va_end(args); + } +} + static void asynInit(void) { int i; @@ -716,14 +736,14 @@ static void connectAttempt(dpCommon *pdpCommon) addr = (pdevice ? pdevice->addr : -1); status = pasynManager->connectDevice(pasynUser,pport->portName,addr); if(status!=asynSuccess) { - asynPrint(pasynUser,ASYN_TRACE_ERROR, + reportConnectStatus(pport, portConnectDevice, "%s %d autoConnect connectDevice failed.\n", pport->portName,addr); return; } pasynInterface = pasynManager->findInterface(pasynUser,asynCommonType,TRUE); if(!pasynInterface) { - asynPrint(pasynUser,ASYN_TRACE_ERROR, + reportConnectStatus(pport, portConnectFindInterface, "%s %d autoConnect findInterface for asynCommon failed.\n", pport->portName,addr); goto disconnect; @@ -738,16 +758,19 @@ static void connectAttempt(dpCommon *pdpCommon) epicsMutexMustLock(pport->synchronousLock); status = pasynCommon->connect(drvPvt,pasynUser); epicsMutexUnlock(pport->synchronousLock); - } - if(status!=asynSuccess) { - asynPrint(pasynUser,ASYN_TRACE_ERROR, - "%s %s %d autoConnect could not connect\n", - pasynUser->errorMessage,pport->portName,addr); + if (status != asynSuccess) { + reportConnectStatus(pport, portConnectDriver, + "%s %d autoConnect could not connect\n", pport->portName, addr); + } else { + reportConnectStatus(pport, portConnectSuccess, + "%s %d port is now connected\n", + pport->portName, addr); + } } disconnect: status = pasynManager->disconnect(pasynUser); if(status!=asynSuccess) { - asynPrint(pasynUser,ASYN_TRACE_ERROR, + asynPrint(pasynUser, ASYN_TRACE_ERROR, "%s %d autoConnect disconnect failed.\n", pport->portName,addr); } @@ -1954,6 +1977,7 @@ static asynStatus registerPort(const char *portName, pport->timeStampSource = defaultTimeStampSource; dpCommonInit(pport,0,autoConnect); pport->pasynUser = createAsynUser(0,0); + pport->previousConnectStatus = portConnectSuccess; pport->queueLockPortTimeout = DEFAULT_QUEUE_LOCK_PORT_TIMEOUT; ellInit(&pport->deviceList); ellInit(&pport->interfaceList); diff --git a/asyn/asynPortClient/asynPortClient.h b/asyn/asynPortClient/asynPortClient.h index 0ab5033..50cc121 100644 --- a/asyn/asynPortClient/asynPortClient.h +++ b/asyn/asynPortClient/asynPortClient.h @@ -121,7 +121,7 @@ class epicsShareClass asynUInt32DigitalClient : public asynPortClient { asynUInt32DigitalClient(const char *portName, int addr, const char *drvInfo, double timeout=DEFAULT_TIMEOUT) : asynPortClient(portName, addr, asynUInt32DigitalType, drvInfo, timeout) { pInterface_ = (asynUInt32Digital *)pasynInterface_->pinterface; - if (pasynInt32SyncIO->connect(portName, addr, &pasynUserSyncIO_, drvInfo)) + if (pasynUInt32DigitalSyncIO->connect(portName, addr, &pasynUserSyncIO_, drvInfo)) throw std::runtime_error(std::string("pasynInt32SyncIO->connect failed")); }; /** Destructor for asynInt32Client class. Disconnects from port, frees resources. */ diff --git a/asyn/asynPortDriver/asynPortDriver.cpp b/asyn/asynPortDriver/asynPortDriver.cpp index 13e4921..6384606 100644 --- a/asyn/asynPortDriver/asynPortDriver.cpp +++ b/asyn/asynPortDriver/asynPortDriver.cpp @@ -89,7 +89,6 @@ class paramList { }; /** Constructor for paramList class. - * \param[in] nValues Number of parameters in the list. * \param[in] pPort Pointer to asynPortDriver port for this paramList. */ paramList::paramList(asynPortDriver *pPort) : pasynPortDriver(pPort) @@ -3231,8 +3230,6 @@ static asynDrvUser ifaceDrvUser = { Often it is 1 (which is the minimum), but some drivers, for example a 16-channel D/A or A/D would support values > 1. This controls the number of parameter tables that are created. - * \param[in] paramTableSize The number of parameters that this driver supports. - This controls the size of the parameter tables. * \param[in] interfaceMask Bit mask defining the asyn interfaces that this driver supports. The bit mask values are defined in asynPortDriver.h, e.g. asynInt32Mask. * \param[in] interruptMask Bit mask definining the asyn interfaces that can generate interrupts (callbacks). diff --git a/asyn/devEpics/devAsynFloat64.c b/asyn/devEpics/devAsynFloat64.c index e039e59..f663b4c 100644 --- a/asyn/devEpics/devAsynFloat64.c +++ b/asyn/devEpics/devAsynFloat64.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,8 @@ #define DEFAULT_RING_BUFFER_SIZE 10 +static const char *driverName = "devAsynFloat64"; + typedef struct ringBufferElement { epicsFloat64 value; epicsTimeStamp time; @@ -74,7 +77,10 @@ typedef struct devPvt{ epicsFloat64 sum; interruptCallbackFloat64 interruptCallback; int numAverage; - CALLBACK callback; + CALLBACK processCallback; + CALLBACK outputCallback; + int newOutputCallbackValue; + int numDeferredOutputCallbacks; IOSCANPVT ioScanPvt; char *portName; char *userParam; @@ -88,6 +94,8 @@ static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt); static long createRingBuffer(dbCommon *pr); static void processCallbackInput(asynUser *pasynUser); static void processCallbackOutput(asynUser *pasynUser); +static void outputCallbackCallback(CALLBACK *pcb); +static int getCallbackValue(devPvt *pPvt); static void interruptCallbackInput(void *drvPvt, asynUser *pasynUser, epicsFloat64 value); static void interruptCallbackOutput(void *drvPvt, asynUser *pasynUser, @@ -130,8 +138,9 @@ static long initCommon(dbCommon *pr, DBLINK *plink, asynStatus status; asynUser *pasynUser; asynInterface *pasynInterface; + static const char *functionName="initCommon"; - pPvt = callocMustSucceed(1, sizeof(*pPvt), "devAsynFloat64::initCommon"); + pPvt = callocMustSucceed(1, sizeof(*pPvt), "%s::%s"); pr->dpvt = pPvt; pPvt->pr = pr; /* Create asynUser */ @@ -143,21 +152,21 @@ static long initCommon(dbCommon *pr, DBLINK *plink, status = pasynEpicsUtils->parseLink(pasynUser, plink, &pPvt->portName, &pPvt->addr,&pPvt->userParam); if (status != asynSuccess) { - printf("%s devAsynFloat64::initCommon %s\n", - pr->name, pasynUser->errorMessage); + printf("%s %s::%s %s\n", + pr->name, driverName, functionName,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); + printf("%s %s::%s connectDevice failed %s\n", + pr->name, driverName, functionName,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); + printf("%s %s::%s canBlock failed %s\n", + pr->name, driverName, functionName,pasynUser->errorMessage); goto bad; } /*call drvUserCreate*/ @@ -170,16 +179,16 @@ static long initCommon(dbCommon *pr, DBLINK *plink, 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); + printf("%s %s::%s drvUserCreate %s\n", + pr->name, driverName, functionName,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); + printf("%s %s::%s findInterface asynFloat64Type %s\n", + pr->name, driverName, functionName,pasynUser->errorMessage); goto bad; } pPvt->pfloat64 = pasynInterface->pinterface; @@ -189,8 +198,8 @@ static long initCommon(dbCommon *pr, DBLINK *plink, 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); + printf("%s %s::%s Float64SyncIO->connect failed %s\n", + pr->name, driverName, functionName,pPvt->pasynUserSync->errorMessage); goto bad; } @@ -206,8 +215,8 @@ static long initCommon(dbCommon *pr, DBLINK *plink, status = dbFindRecord(pdbentry, pr->name); if (status) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynFloat64::initCommon error finding record\n", - pr->name); + "%s %s::%s error finding record\n", + pr->name, driverName, functionName); goto bad; } callbackString = dbGetInfo(pdbentry, "asyn:READBACK"); @@ -219,9 +228,13 @@ static long initCommon(dbCommon *pr, DBLINK *plink, 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); + printf("%s %s::initRecord error calling registerInterruptUser %s\n", + pr->name, driverName,pPvt->pasynUser->errorMessage); } + /* Initialize the interrupt callback */ + callbackSetCallback(outputCallbackCallback, &pPvt->outputCallback); + callbackSetPriority(pr->prio, &pPvt->outputCallback); + callbackSetUser(pPvt, &pPvt->outputCallback); } } return INIT_OK; @@ -236,6 +249,7 @@ static long createRingBuffer(dbCommon *pr) devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; const char *sizeString; + static const char *functionName="createRingBuffer"; if (!pPvt->ringBuffer) { DBENTRY *pdbentry = dbAllocEntry(pdbbase); @@ -243,13 +257,13 @@ static long createRingBuffer(dbCommon *pr) status = dbFindRecord(pdbentry, pr->name); if (status) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynFloat64::createRingBufffer error finding record\n", - pr->name); + "%s %s::%s error finding record\n", + pr->name, driverName, functionName); return -1; } sizeString = dbGetInfo(pdbentry, "asyn:FIFO"); if (sizeString) pPvt->ringSize = atoi(sizeString); - pPvt->ringBuffer = callocMustSucceed(pPvt->ringSize+1, sizeof *pPvt->ringBuffer, "devAsynFloat64::createRingBuffer"); + pPvt->ringBuffer = callocMustSucceed(pPvt->ringSize+1, sizeof *pPvt->ringBuffer, "%s::createRingBuffer"); } return asynSuccess; } @@ -259,6 +273,7 @@ static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt) { devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; + static const char *functionName="getIoIntInfo"; /* If initCommon failed then pPvt->pfloat64 is NULL, return error */ if (!pPvt->pfloat64) return -1; @@ -266,25 +281,25 @@ static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt) if (cmd == 0) { /* Add to scan list. Register interrupts, create ring buffer */ asynPrint(pPvt->pasynUser, ASYN_TRACE_FLOW, - "%s devAsynFloat64::getIoIntInfo registering interrupt\n", - pr->name); + "%s %s::%s registering interrupt\n", + pr->name, driverName, functionName); createRingBuffer(pr); status = pPvt->pfloat64->registerInterruptUser( pPvt->float64Pvt,pPvt->pasynUser, pPvt->interruptCallback,pPvt,&pPvt->registrarPvt); if(status!=asynSuccess) { - printf("%s devAsynFloat64 registerInterruptUser %s\n", - pr->name,pPvt->pasynUser->errorMessage); + printf("%s %s::%s registerInterruptUser %s\n", + pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } } else { asynPrint(pPvt->pasynUser, ASYN_TRACE_FLOW, - "%s devAsynFloat64::getIoIntInfo cancelling interrupt\n", - pr->name); + "%s %s::%s cancelling interrupt\n", + pr->name, driverName, functionName); status = pPvt->pfloat64->cancelInterruptUser(pPvt->float64Pvt, pPvt->pasynUser,pPvt->registrarPvt); if(status!=asynSuccess) { - printf("%s devAsynFloat64 cancelInterruptUser %s\n", - pr->name,pPvt->pasynUser->errorMessage); + printf("%s %s::%s cancelInterruptUser %s\n", + pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } } *iopvt = pPvt->ioScanPvt; @@ -295,6 +310,7 @@ static void processCallbackInput(asynUser *pasynUser) { devPvt *pPvt = (devPvt *)pasynUser->userPvt; dbCommon *pr = (dbCommon *)pPvt->pr; + static const char *functionName="processCallbackInput"; pPvt->result.status = pPvt->pfloat64->read(pPvt->float64Pvt, pPvt->pasynUser, &pPvt->result.value); pPvt->result.time = pPvt->pasynUser->timestamp; @@ -302,19 +318,20 @@ static void processCallbackInput(asynUser *pasynUser) pPvt->result.alarmSeverity = pPvt->pasynUser->alarmSeverity; if (pPvt->result.status == asynSuccess) { asynPrint(pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynFloat64 process value=%f\n",pr->name,pPvt->result.value); + "%s %s::%s process value=%f\n",pr->name, driverName, functionName,pPvt->result.value); } else { asynPrint(pasynUser, ASYN_TRACE_ERROR, - "%s devAsynFloat64 process read error %s\n", - pr->name, pasynUser->errorMessage); + "%s %s::%s process read error %s\n", + pr->name, driverName, functionName,pasynUser->errorMessage); } - if(pr->pact) callbackRequestProcessCallback(&pPvt->callback,pr->prio,pr); + if(pr->pact) callbackRequestProcessCallback(&pPvt->processCallback,pr->prio,pr); } static void processCallbackOutput(asynUser *pasynUser) { devPvt *pPvt = (devPvt *)pasynUser->userPvt; dbCommon *pr = pPvt->pr; + static const char *functionName="processCallbackOutput"; pPvt->result.status = pPvt->pfloat64->write(pPvt->float64Pvt, pPvt->pasynUser,pPvt->result.value); pPvt->result.time = pPvt->pasynUser->timestamp; @@ -322,13 +339,13 @@ static void processCallbackOutput(asynUser *pasynUser) pPvt->result.alarmSeverity = pPvt->pasynUser->alarmSeverity; if(pPvt->result.status == asynSuccess) { asynPrint(pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynFloat64 process val %f\n",pr->name,pPvt->result.value); + "%s %s::%s process val %f\n",pr->name, driverName, functionName,pPvt->result.value); } else { asynPrint(pasynUser, ASYN_TRACE_ERROR, - "%s devAsynFloat64 pPvt->result.status=%d, process error %s\n", - pr->name, pPvt->result.status, pasynUser->errorMessage); + "%s %s::%s pPvt->result.status=%d, process error %s\n", + pr->name, driverName, functionName,pPvt->result.status, pasynUser->errorMessage); } - if(pr->pact) callbackRequestProcessCallback(&pPvt->callback,pr->prio,pr); + if(pr->pact) callbackRequestProcessCallback(&pPvt->processCallback,pr->prio,pr); } static void interruptCallbackInput(void *drvPvt, asynUser *pasynUser, @@ -337,10 +354,11 @@ static void interruptCallbackInput(void *drvPvt, asynUser *pasynUser, devPvt *pPvt = (devPvt *)drvPvt; dbCommon *pr = pPvt->pr; ringBufferElement *rp; + static const char *functionName="interruptCallbackInput"; asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynFloat64::interruptCallbackInput new value=%f\n", - pr->name, value); + "%s %s::%s new value=%f\n", + pr->name, driverName, functionName,value); /* There is a problem. A driver could be calling us with a value after * this record has registered for callbacks but before EPICS has set interruptAccept, * which means that scanIoRequest will return immediately. @@ -383,11 +401,13 @@ static void interruptCallbackOutput(void *drvPvt, asynUser *pasynUser, devPvt *pPvt = (devPvt *)drvPvt; dbCommon *pr = pPvt->pr; ringBufferElement *rp; + static const char *functionName="interruptCallbackOutput"; asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynFloat64::interruptCallbackOutput new value=%f\n", - pr->name, value); + "%s %s::%s new value=%f\n", + pr->name, driverName, functionName,value); if (!interruptAccept) return; + dbScanLock(pr); epicsMutexLock(pPvt->ringBufferLock); rp = &pPvt->ringBuffer[pPvt->ringHead]; rp->value = value; @@ -400,9 +420,40 @@ static void interruptCallbackOutput(void *drvPvt, asynUser *pasynUser, pPvt->ringTail = (pPvt->ringTail==pPvt->ringSize) ? 0 : pPvt->ringTail+1; pPvt->ringBufferOverflows++; } else { - scanOnce(pr); + /* If PACT is true then this callback was received during asynchronous record processing + * Must defer calling callbackRequest until end of record processing */ + if (pr->pact) { + pPvt->numDeferredOutputCallbacks++; + } else { + callbackRequest(&pPvt->outputCallback); + } } epicsMutexUnlock(pPvt->ringBufferLock); + dbScanUnlock(pr); +} + +static void outputCallbackCallback(CALLBACK *pcb) +{ + devPvt *pPvt; + static const char *functionName="outputCallbackCallback"; + + callbackGetUser(pPvt, pcb); + { + dbCommon *pr = pPvt->pr; + dbScanLock(pr); + pPvt->newOutputCallbackValue = 1; + dbProcess(pr); + if (pPvt->newOutputCallbackValue != 0) { + /* We called dbProcess but the record did not process, perhaps because PACT was 1 + * Need to remove ring buffer element */ + asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, + "%s %s::%s warning dbProcess did not process record, PACT=%d\n", + pr->name, driverName, functionName,pr->pact); + getCallbackValue(pPvt); + pPvt->newOutputCallbackValue = 0; + } + dbScanUnlock(pr); + } } static void interruptCallbackAverage(void *drvPvt, asynUser *pasynUser, @@ -410,10 +461,11 @@ static void interruptCallbackAverage(void *drvPvt, asynUser *pasynUser, { devPvt *pPvt = (devPvt *)drvPvt; dbCommon *pr = pPvt->pr; + static const char *functionName="interruptCallbackAverage"; asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynFloat64::interruptCallbackAverage new value=%f\n", - pr->name, value); + "%s %s::%s new value=%f\n", + pr->name, driverName, functionName,value); epicsMutexLock(pPvt->ringBufferLock); pPvt->numAverage++; pPvt->sum += value; @@ -426,19 +478,21 @@ static void interruptCallbackAverage(void *drvPvt, asynUser *pasynUser, static int getCallbackValue(devPvt *pPvt) { int ret = 0; + static const char *functionName="getCallbackValue"; + epicsMutexLock(pPvt->ringBufferLock); if (pPvt->ringTail != pPvt->ringHead) { if (pPvt->ringBufferOverflows > 0) { asynPrint(pPvt->pasynUser, ASYN_TRACE_WARNING, - "%s devAsynFloat64 getCallbackValue error, %d ring buffer overflows\n", - pPvt->pr->name, pPvt->ringBufferOverflows); + "%s %s::%s error, %d ring buffer overflows\n", + pPvt->pr->name, driverName, functionName,pPvt->ringBufferOverflows); pPvt->ringBufferOverflows = 0; } pPvt->result = pPvt->ringBuffer[pPvt->ringTail]; pPvt->ringTail = (pPvt->ringTail==pPvt->ringSize) ? 0 : pPvt->ringTail+1; asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynFloat64::getCallbackValue from ringBuffer value=%f\n", - pPvt->pr->name,pPvt->result.value); + "%s %s::%s from ringBuffer value=%f\n", + pPvt->pr->name, driverName, functionName, pPvt->result.value); ret = 1; } epicsMutexUnlock(pPvt->ringBufferLock); @@ -447,17 +501,19 @@ static int getCallbackValue(devPvt *pPvt) static void reportQueueRequestStatus(devPvt *pPvt, asynStatus status) { + static const char *functionName="reportQueueRequestStatus"; + if (status != asynSuccess) pPvt->result.status = status; if (pPvt->previousQueueRequestStatus != status) { pPvt->previousQueueRequestStatus = status; if (status == asynSuccess) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynFloat64 queueRequest status returned to normal\n", - pPvt->pr->name); + "%s %s::%s queueRequest status returned to normal\n", + pPvt->pr->name, driverName, functionName); } else { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynFloat64 queueRequest %s\n", - pPvt->pr->name,pPvt->pasynUser->errorMessage); + "%s %s::%s queueRequest error %s\n", + pPvt->pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } } } @@ -490,8 +546,16 @@ static long processAi(aiRecord *pr) INVALID_ALARM, &pPvt->result.alarmSeverity); recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); if(pPvt->result.status==asynSuccess) { - pr->val = pPvt->result.value; - pr->udf=0; + epicsFloat64 val64 = pPvt->result.value; + /* ASLO/AOFF conversion */ + if (pr->aslo != 0.0) val64 *= pr->aslo; + val64 += pr->aoff; + /* Smoothing */ + if (pr->smoo == 0.0 || pr->udf || !finite(pr->val)) + pr->val = val64; + else + pr->val = pr->val * pr->smoo + val64 * (1.0 - pr->smoo); + pr->udf = 0; return 2; } else { @@ -514,7 +578,11 @@ static long initAo(aoRecord *pao) status = pasynFloat64SyncIO->read(pPvt->pasynUserSync, &value,pPvt->pasynUser->timeout); if (status == asynSuccess) { - pao->val = value; + epicsFloat64 val64 = value; + /* ASLO/AOFF conversion */ + if (pao->aslo != 0.0) val64 *= pao->aslo; + val64 += pao->aoff; + pao->val = val64; pao->udf = 0; } pasynFloat64SyncIO->disconnect(pPvt->pasynUserSync); @@ -526,13 +594,20 @@ static long processAo(aoRecord *pr) devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; - if (getCallbackValue(pPvt)) { + if (pPvt->newOutputCallbackValue && getCallbackValue(pPvt)) { if (pPvt->result.status == asynSuccess) { - pr->val = pPvt->result.value; + epicsFloat64 val64 = pPvt->result.value; + /* ASLO/AOFF conversion */ + if (pr->aslo != 0.0) val64 *= pr->aslo; + val64 += pr->aoff; + pr->val = val64; pr->udf = 0; } } else if(pr->pact == 0) { - pPvt->result.value = pr->oval; + /* ASLO/AOFF conversion */ + epicsFloat64 val64 = pr->oval - pr->aoff; + if (pr->aslo != 0.0) val64 /= pr->aslo; + pPvt->result.value = val64; if(pPvt->canBlock) pr->pact = 1; status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; @@ -543,6 +618,11 @@ static long processAo(aoRecord *pr) WRITE_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); + if (pPvt->numDeferredOutputCallbacks > 0) { + callbackRequest(&pPvt->outputCallback); + pPvt->numDeferredOutputCallbacks--; + } + pPvt->newOutputCallbackValue = 0; if(pPvt->result.status == asynSuccess) { return 0; } @@ -556,6 +636,7 @@ static long initAiAverage(aiRecord *pai) { int status; devPvt *pPvt; + static const char *functionName="initAiAverage"; status = initCommon((dbCommon *)pai,&pai->inp, 0,interruptCallbackAverage); @@ -565,8 +646,8 @@ static long initAiAverage(aiRecord *pai) pPvt->float64Pvt,pPvt->pasynUser, pPvt->interruptCallback,pPvt,&pPvt->registrarPvt); if(status!=asynSuccess) { - printf("%s devAsynFloat64 registerInterruptUser %s\n", - pai->name,pPvt->pasynUser->errorMessage); + printf("%s %s::%s registerInterruptUser %s\n", + pai->name,driverName, functionName,pPvt->pasynUser->errorMessage); } return INIT_OK; } @@ -575,6 +656,7 @@ static long processAiAverage(aiRecord *pai) { devPvt *pPvt = (devPvt *)pai->dpvt; double dval; + static const char *functionName="processAiAverage"; epicsMutexLock(pPvt->ringBufferLock); if (pPvt->numAverage == 0) { @@ -592,11 +674,18 @@ static long processAiAverage(aiRecord *pai) INVALID_ALARM, &pPvt->result.alarmSeverity); recGblSetSevr(pai, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); if (pPvt->result.status == asynSuccess) { - pai->val = dval; + /* ASLO/AOFF conversion */ + if (pai->aslo != 0.0) dval *= pai->aslo; + dval += pai->aoff; + /* Smoothing */ + if (pai->smoo == 0.0 || pai->udf || !finite(pai->val)) + pai->val = dval; + else + pai->val = pai->val * pai->smoo + dval * (1.0 - pai->smoo); pai->udf = 0; asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynFloat64::callbackAiAverage val=%f\n", - pai->name, pai->val); + "%s %s::%s val=%f\n", + pai->name, driverName, functionName,pai->val); return 2; } else { diff --git a/asyn/devEpics/devAsynInt32.c b/asyn/devEpics/devAsynInt32.c index d4c3359..52a1dac 100644 --- a/asyn/devEpics/devAsynInt32.c +++ b/asyn/devEpics/devAsynInt32.c @@ -64,6 +64,8 @@ #define MAX_ENUM_STATES 16 #define MAX_ENUM_STRING_SIZE 26 +static const char *driverName = "devAsynInt32"; + typedef struct ringBufferElement { epicsInt32 value; epicsTimeStamp time; @@ -72,7 +74,7 @@ typedef struct ringBufferElement { epicsAlarmSeverity alarmSeverity; } ringBufferElement; -typedef struct devInt32Pvt{ +typedef struct devPvt{ dbCommon *pr; asynUser *pasynUser; asynUser *pasynUserSync; @@ -96,7 +98,10 @@ typedef struct devInt32Pvt{ int bipolar; epicsInt32 mask; epicsInt32 signBit; - CALLBACK callback; + CALLBACK processCallback; + CALLBACK outputCallback; + int newOutputCallbackValue; + int numDeferredOutputCallbacks; IOSCANPVT ioScanPvt; char *portName; char *userParam; @@ -105,7 +110,7 @@ typedef struct devInt32Pvt{ int enumValues[MAX_ENUM_STATES]; int enumSeverities[MAX_ENUM_STATES]; asynStatus previousQueueRequestStatus; -}devInt32Pvt; +}devPvt; static void setEnums(char *outStrings, int *outVals, epicsEnum16 *outSeverities, char *inStrings[], int *inVals, int *inSeverities, @@ -116,6 +121,8 @@ static long convertAi(aiRecord *pai, int pass); static long convertAo(aoRecord *pao, int pass); static void processCallbackInput(asynUser *pasynUser); static void processCallbackOutput(asynUser *pasynUser); +static void outputCallbackCallback(CALLBACK *pcb); +static int getCallbackValue(devPvt *pPvt); static void interruptCallbackInput(void *drvPvt, asynUser *pasynUser, epicsInt32 value); static void interruptCallbackOutput(void *drvPvt, asynUser *pasynUser, @@ -185,12 +192,13 @@ static long initCommon(dbCommon *pr, DBLINK *plink, userCallback processCallback,interruptCallbackInt32 interruptCallback, interruptCallbackEnum callbackEnum, int maxEnums, char *pFirstString, int *pFirstValue, epicsEnum16 *pFirstSeverity) { - devInt32Pvt *pPvt; + devPvt *pPvt; asynStatus status; asynUser *pasynUser; asynInterface *pasynInterface; epicsUInt32 mask=0; int nbits; + static const char *functionName="initCommon"; pPvt = callocMustSucceed(1, sizeof(*pPvt), "devAsynInt32::initCommon"); pr->dpvt = pPvt; @@ -211,8 +219,8 @@ static long initCommon(dbCommon *pr, DBLINK *plink, &pPvt->portName, &pPvt->addr, &mask, &pPvt->userParam); } if (status != asynSuccess) { - printf("%s devAsynInt32::initCommon %s\n", - pr->name, pasynUser->errorMessage); + printf("%s %s::%s %s\n", + pr->name, driverName, functionName, pasynUser->errorMessage); goto bad; } @@ -237,14 +245,14 @@ static long initCommon(dbCommon *pr, DBLINK *plink, /* 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); + printf("%s %s::%s connectDevice failed %s\n", + pr->name, driverName, functionName, 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); + printf("%s %s::%s canBlock failed %s\n", + pr->name, driverName, functionName, pasynUser->errorMessage); goto bad; } /*call drvUserCreate*/ @@ -257,16 +265,16 @@ static long initCommon(dbCommon *pr, DBLINK *plink, 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); + printf("%s %s::%s drvUserCreate %s\n", + pr->name, driverName, functionName, 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); + printf("%s %s::%s findInterface asynInt32Type %s\n", + pr->name, driverName, functionName,pasynUser->errorMessage); goto bad; } pPvt->pint32 = pasynInterface->pinterface; @@ -277,8 +285,8 @@ static long initCommon(dbCommon *pr, DBLINK *plink, 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); + printf("%s %s::%s Int32SyncIO->connect failed %s\n", + pr->name, driverName, functionName, pPvt->pasynUserSync->errorMessage); goto bad; } /* Initialize asynEnum interfaces */ @@ -290,8 +298,8 @@ static long initCommon(dbCommon *pr, DBLINK *plink, status = pasynEnumSyncIO->connect(pPvt->portName, pPvt->addr, &pPvt->pasynUserEnumSync, pPvt->userParam); if (status != asynSuccess) { - printf("%s devAsynInt32::initCommon EnumSyncIO->connect failed %s\n", - pr->name, pPvt->pasynUserEnumSync->errorMessage); + printf("%s %s::%s EnumSyncIO->connect failed %s\n", + pr->name, driverName, functionName, pPvt->pasynUserEnumSync->errorMessage); goto bad; } status = pasynEnumSyncIO->read(pPvt->pasynUserEnumSync, @@ -305,8 +313,8 @@ static long initCommon(dbCommon *pr, DBLINK *plink, pasynInterface->drvPvt, pPvt->pasynUser, callbackEnum, pPvt, ®istrarPvt); if(status!=asynSuccess) { - printf("%s devAsynInt32 enum registerInterruptUser %s\n", - pr->name,pPvt->pasynUser->errorMessage); + printf("%s %s::%s enum registerInterruptUser %s\n", + pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } } /* If the info field "asyn:READBACK" is 1 and interruptCallback is not NULL @@ -318,8 +326,8 @@ static long initCommon(dbCommon *pr, DBLINK *plink, status = dbFindRecord(pdbentry, pr->name); if (status) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynInt32::initCommon error finding record\n", - pr->name); + "%s %s::%s error finding record\n", + pr->name, driverName, functionName); goto bad; } callbackString = dbGetInfo(pdbentry, "asyn:READBACK"); @@ -330,10 +338,14 @@ static long initCommon(dbCommon *pr, DBLINK *plink, status = pPvt->pint32->registerInterruptUser( pPvt->int32Pvt,pPvt->pasynUser, pPvt->interruptCallback,pPvt,&pPvt->registrarPvt); - if(status!=asynSuccess) { - printf("%s devAsynInt32::initRecord error calling registerInterruptUser %s\n", - pr->name,pPvt->pasynUser->errorMessage); + if (status!=asynSuccess) { + printf("%s %s::%s error calling registerInterruptUser %s\n", + pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } + /* Initialize the interrupt callback */ + callbackSetCallback(outputCallbackCallback, &pPvt->outputCallback); + callbackSetPriority(pr->prio, &pPvt->outputCallback); + callbackSetUser(pPvt, &pPvt->outputCallback); } } return INIT_OK; @@ -345,9 +357,10 @@ static long initCommon(dbCommon *pr, DBLINK *plink, static long createRingBuffer(dbCommon *pr) { - devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; + devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; const char *sizeString; + static const char *functionName="createRingBuffer"; if (!pPvt->ringBuffer) { DBENTRY *pdbentry = dbAllocEntry(pdbbase); @@ -355,8 +368,8 @@ static long createRingBuffer(dbCommon *pr) status = dbFindRecord(pdbentry, pr->name); if (status) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynInt32::createRingBufffer error finding record\n", - pr->name); + "%s %s::%s error finding record\n", + pr->name, driverName, functionName); return -1; } sizeString = dbGetInfo(pdbentry, "asyn:FIFO"); @@ -368,8 +381,9 @@ static long createRingBuffer(dbCommon *pr) static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt) { - devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; + devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; + static const char *functionName="getIoIntInfo"; /* If initCommon failed then pPvt->pint32 is NULL, return error */ if (!pPvt->pint32) return -1; @@ -377,25 +391,25 @@ static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt) if (cmd == 0) { /* Add to scan list. Register interrupts */ asynPrint(pPvt->pasynUser, ASYN_TRACE_FLOW, - "%s devAsynInt32::getIoIntInfo registering interrupt\n", - pr->name); + "%s %s::%s registering interrupt\n", + pr->name, driverName, functionName); status = createRingBuffer(pr); status = pPvt->pint32->registerInterruptUser( pPvt->int32Pvt,pPvt->pasynUser, pPvt->interruptCallback,pPvt,&pPvt->registrarPvt); if(status!=asynSuccess) { - printf("%s devAsynInt32 registerInterruptUser %s\n", - pr->name,pPvt->pasynUser->errorMessage); + printf("%s %s::%s registerInterruptUser %s\n", + pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } } else { asynPrint(pPvt->pasynUser, ASYN_TRACE_FLOW, - "%s devAsynInt32::getIoIntInfo cancelling interrupt\n", - pr->name); + "%s %s::%s cancelling interrupt\n", + pr->name, driverName, functionName); status = pPvt->pint32->cancelInterruptUser(pPvt->int32Pvt, pPvt->pasynUser,pPvt->registrarPvt); if(status!=asynSuccess) { - printf("%s devAsynInt32 cancelInterruptUser %s\n", - pr->name,pPvt->pasynUser->errorMessage); + printf("%s %s::%s cancelInterruptUser %s\n", + pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } } *iopvt = pPvt->ioScanPvt; @@ -421,7 +435,7 @@ static void setEnums(char *outStrings, int *outVals, epicsEnum16 *outSeverities, static long convertAi(aiRecord *precord, int pass) { - devInt32Pvt *pPvt = (devInt32Pvt *)precord->dpvt; + devPvt *pPvt = (devPvt *)precord->dpvt; double eguf,egul,deviceHigh,deviceLow; if (pass==0) return 0; @@ -440,7 +454,7 @@ static long convertAi(aiRecord *precord, int pass) static long convertAo(aoRecord *precord, int pass) { - devInt32Pvt *pPvt = (devInt32Pvt *)precord->dpvt; + devPvt *pPvt = (devPvt *)precord->dpvt; double eguf,egul,deviceHigh,deviceLow; if (pass==0) return 0; @@ -459,8 +473,9 @@ static long convertAo(aoRecord *precord, int pass) static void processCallbackInput(asynUser *pasynUser) { - devInt32Pvt *pPvt = (devInt32Pvt *)pasynUser->userPvt; + devPvt *pPvt = (devPvt *)pasynUser->userPvt; dbCommon *pr = (dbCommon *)pPvt->pr; + static const char *functionName="processCallbackInput"; pPvt->result.status = pPvt->pint32->read(pPvt->int32Pvt, pPvt->pasynUser, &pPvt->result.value); pPvt->result.time = pPvt->pasynUser->timestamp; @@ -472,19 +487,20 @@ static void processCallbackInput(asynUser *pasynUser) } if (pPvt->result.status == asynSuccess) { asynPrint(pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynInt32 process value=%d\n",pr->name,pPvt->result.value); + "%s %s::%s process value=%d\n",pr->name, driverName, functionName,pPvt->result.value); } else { asynPrint(pasynUser, ASYN_TRACE_ERROR, - "%s devAsynInt32 process read error %s\n", - pr->name, pasynUser->errorMessage); + "%s %s::%s process read error %s\n", + pr->name, driverName, functionName, pasynUser->errorMessage); } - if(pr->pact) callbackRequestProcessCallback(&pPvt->callback,pr->prio,pr); + if(pr->pact) callbackRequestProcessCallback(&pPvt->processCallback,pr->prio,pr); } static void processCallbackOutput(asynUser *pasynUser) { - devInt32Pvt *pPvt = (devInt32Pvt *)pasynUser->userPvt; + devPvt *pPvt = (devPvt *)pasynUser->userPvt; dbCommon *pr = pPvt->pr; + static const char *functionName="processCallbackOutput"; pPvt->result.status = pPvt->pint32->write(pPvt->int32Pvt, pPvt->pasynUser,pPvt->result.value); pPvt->result.time = pPvt->pasynUser->timestamp; @@ -492,29 +508,30 @@ static void processCallbackOutput(asynUser *pasynUser) pPvt->result.alarmSeverity = pPvt->pasynUser->alarmSeverity; if(pPvt->result.status == asynSuccess) { asynPrint(pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynInt32 process value %d\n",pr->name,pPvt->result.value); + "%s %s::%s process value %d\n",pr->name, driverName, functionName,pPvt->result.value); } else { asynPrint(pasynUser, ASYN_TRACE_ERROR, - "%s devAsynInt32 process error %s\n", - pr->name, pasynUser->errorMessage); + "%s %s::%s process error %s\n", + pr->name, driverName, functionName, pasynUser->errorMessage); } - if(pr->pact) callbackRequestProcessCallback(&pPvt->callback,pr->prio,pr); + if(pr->pact) callbackRequestProcessCallback(&pPvt->processCallback,pr->prio,pr); } static void interruptCallbackInput(void *drvPvt, asynUser *pasynUser, epicsInt32 value) { - devInt32Pvt *pPvt = (devInt32Pvt *)drvPvt; + devPvt *pPvt = (devPvt *)drvPvt; dbCommon *pr = pPvt->pr; ringBufferElement *rp; + static const char *functionName="interruptCallbackOutput"; if (pPvt->mask) { value &= pPvt->mask; if (pPvt->bipolar && (value & pPvt->signBit)) value |= ~pPvt->mask; } asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynInt32::interruptCallbackInput new value=%d\n", - pr->name, value); + "%s %s::%s new value=%d\n", + pr->name, driverName, functionName, value); /* There is a problem. A driver could be calling us with a value after * this record has registered for callbacks but before EPICS has set interruptAccept, * which means that scanIoRequest will return immediately. @@ -554,18 +571,22 @@ static void interruptCallbackInput(void *drvPvt, asynUser *pasynUser, static void interruptCallbackOutput(void *drvPvt, asynUser *pasynUser, epicsInt32 value) { - devInt32Pvt *pPvt = (devInt32Pvt *)drvPvt; + devPvt *pPvt = (devPvt *)drvPvt; dbCommon *pr = pPvt->pr; ringBufferElement *rp; + static const char *functionName="interruptCallbackOutput"; if (pPvt->mask) { value &= pPvt->mask; if (pPvt->bipolar && (value & pPvt->signBit)) value |= ~pPvt->mask; } asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynInt32::interruptCallbackOutput new value=%d\n", - pr->name, value); + "%s %s::%s new value=%d\n", + pr->name, driverName, functionName, value); if (!interruptAccept) return; + /* We need the scan lock because we look at PACT and pPvt->numDeferredOutputCallbacks + * Must take scan lock before ring buffer lock */ + dbScanLock(pr); epicsMutexLock(pPvt->ringBufferLock); rp = &pPvt->ringBuffer[pPvt->ringHead]; rp->value = value; @@ -578,24 +599,56 @@ static void interruptCallbackOutput(void *drvPvt, asynUser *pasynUser, pPvt->ringTail = (pPvt->ringTail==pPvt->ringSize) ? 0 : pPvt->ringTail+1; pPvt->ringBufferOverflows++; } else { - scanOnce(pr); + /* If PACT is true then this callback was received during asynchronous record processing + * Must defer calling callbackRequest until end of record processing */ + if (pr->pact) { + pPvt->numDeferredOutputCallbacks++; + } else { + callbackRequest(&pPvt->outputCallback); + } } epicsMutexUnlock(pPvt->ringBufferLock); + dbScanUnlock(pr); +} + +static void outputCallbackCallback(CALLBACK *pcb) +{ + static const char *functionName="outputCallbackCallback"; + + devPvt *pPvt; + callbackGetUser(pPvt, pcb); + { + dbCommon *pr = pPvt->pr; + dbScanLock(pr); + pPvt->newOutputCallbackValue = 1; + dbProcess(pr); + if (pPvt->newOutputCallbackValue != 0) { + /* We called dbProcess but the record did not process, perhaps because PACT was 1 + * Need to remove ring buffer element */ + asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, + "%s %s::%s warning dbProcess did not process record, PACT=%d\n", + pr->name, driverName, functionName,pr->pact); + getCallbackValue(pPvt); + pPvt->newOutputCallbackValue = 0; + } + dbScanUnlock(pr); + } } static void interruptCallbackAverage(void *drvPvt, asynUser *pasynUser, epicsInt32 value) { - devInt32Pvt *pPvt = (devInt32Pvt *)drvPvt; + devPvt *pPvt = (devPvt *)drvPvt; aiRecord *pai = (aiRecord *)pPvt->pr; + static const char *functionName="interruptCallbackAverage"; if (pPvt->mask) { value &= pPvt->mask; if (pPvt->bipolar && (value & pPvt->signBit)) value |= ~pPvt->mask; } asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynInt32::interruptCallbackAverage new value=%d\n", - pai->name, value); + "%s %s::%s new value=%d\n", + pai->name, driverName, functionName, value); epicsMutexLock(pPvt->ringBufferLock); pPvt->numAverage++; pPvt->sum += (double)value; @@ -608,7 +661,7 @@ static void interruptCallbackAverage(void *drvPvt, asynUser *pasynUser, static void interruptCallbackEnumMbbi(void *drvPvt, asynUser *pasynUser, char *strings[], int values[], int severities[],size_t nElements) { - devInt32Pvt *pPvt = (devInt32Pvt *)drvPvt; + devPvt *pPvt = (devPvt *)drvPvt; mbbiRecord *pr = (mbbiRecord *)pPvt->pr; if (!interruptAccept) return; @@ -622,7 +675,7 @@ static void interruptCallbackEnumMbbi(void *drvPvt, asynUser *pasynUser, static void interruptCallbackEnumMbbo(void *drvPvt, asynUser *pasynUser, char *strings[], int values[], int severities[], size_t nElements) { - devInt32Pvt *pPvt = (devInt32Pvt *)drvPvt; + devPvt *pPvt = (devPvt *)drvPvt; mbboRecord *pr = (mbboRecord *)pPvt->pr; if (!interruptAccept) return; @@ -636,7 +689,7 @@ static void interruptCallbackEnumMbbo(void *drvPvt, asynUser *pasynUser, static void interruptCallbackEnumBi(void *drvPvt, asynUser *pasynUser, char *strings[], int values[], int severities[], size_t nElements) { - devInt32Pvt *pPvt = (devInt32Pvt *)drvPvt; + devPvt *pPvt = (devPvt *)drvPvt; biRecord *pr = (biRecord *)pPvt->pr; if (!interruptAccept) return; @@ -650,7 +703,7 @@ static void interruptCallbackEnumBi(void *drvPvt, asynUser *pasynUser, static void interruptCallbackEnumBo(void *drvPvt, asynUser *pasynUser, char *strings[], int values[], int severities[], size_t nElements) { - devInt32Pvt *pPvt = (devInt32Pvt *)drvPvt; + devPvt *pPvt = (devPvt *)drvPvt; boRecord *pr = (boRecord *)pPvt->pr; if (!interruptAccept) return; @@ -661,42 +714,45 @@ static void interruptCallbackEnumBo(void *drvPvt, asynUser *pasynUser, dbScanUnlock((dbCommon*)pr); } - -static int getCallbackValue(devInt32Pvt *pPvt) +static int getCallbackValue(devPvt *pPvt) { int ret = 0; + static const char *functionName="getCallbackValue"; + epicsMutexLock(pPvt->ringBufferLock); if (pPvt->ringTail != pPvt->ringHead) { if (pPvt->ringBufferOverflows > 0) { asynPrint(pPvt->pasynUser, ASYN_TRACE_WARNING, - "%s devAsynInt32 getCallbackValue warning, %d ring buffer overflows\n", - pPvt->pr->name, pPvt->ringBufferOverflows); + "%s %s::%s warning, %d ring buffer overflows\n", + pPvt->pr->name, driverName, functionName, pPvt->ringBufferOverflows); pPvt->ringBufferOverflows = 0; } pPvt->result = pPvt->ringBuffer[pPvt->ringTail]; pPvt->ringTail = (pPvt->ringTail==pPvt->ringSize) ? 0 : pPvt->ringTail+1; asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynInt32::getCallbackValue from ringBuffer value=%d\n", - pPvt->pr->name,pPvt->result.value); + "%s %s::%s from ringBuffer value=%d\n", + pPvt->pr->name, driverName, functionName,pPvt->result.value); ret = 1; } epicsMutexUnlock(pPvt->ringBufferLock); return ret; } -static void reportQueueRequestStatus(devInt32Pvt *pPvt, asynStatus status) +static void reportQueueRequestStatus(devPvt *pPvt, asynStatus status) { + static const char *functionName="reportQueueRequestStatus"; + if (status != asynSuccess) pPvt->result.status = status; if (pPvt->previousQueueRequestStatus != status) { pPvt->previousQueueRequestStatus = status; if (status == asynSuccess) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynInt32 queueRequest status returned to normal\n", - pPvt->pr->name); + "%s %s::%s queueRequest status returned to normal\n", + pPvt->pr->name, driverName, functionName); } else { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynInt32 queueRequest %s\n", - pPvt->pr->name,pPvt->pasynUser->errorMessage); + "%s %s::%s queueRequest error %s\n", + pPvt->pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } } } @@ -704,7 +760,7 @@ static void reportQueueRequestStatus(devInt32Pvt *pPvt, asynStatus status) static long initAi(aiRecord *pr) { - devInt32Pvt *pPvt; + devPvt *pPvt; int status; status = initCommon((dbCommon *)pr,&pr->inp, @@ -723,7 +779,7 @@ static long initAi(aiRecord *pr) } static long processAi(aiRecord *pr) { - devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; + devPvt *pPvt = (devPvt *)pr->dpvt; int status; if(!getCallbackValue(pPvt) && !pr->pact) { @@ -750,8 +806,9 @@ static long processAi(aiRecord *pr) static long initAiAverage(aiRecord *pr) { - devInt32Pvt *pPvt; + devPvt *pPvt; int status; + static const char *functionName="initAiAverage"; status = initCommon((dbCommon *)pr, &pr->inp, NULL, interruptCallbackAverage, NULL, @@ -762,8 +819,8 @@ static long initAiAverage(aiRecord *pr) pPvt->int32Pvt,pPvt->pasynUser, interruptCallbackAverage,pPvt,&pPvt->registrarPvt); if(status!=asynSuccess) { - printf("%s devAsynInt32 registerInterruptUser %s\n", - pr->name,pPvt->pasynUser->errorMessage); + printf("%s %s::%s registerInterruptUser %s\n", + pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } /* Don't call getBounds if we already have non-zero values from * parseLinkMask */ @@ -777,8 +834,9 @@ static long initAiAverage(aiRecord *pr) static long processAiAverage(aiRecord *pr) { - devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; + devPvt *pPvt = (devPvt *)pr->dpvt; double rval; + static const char *functionName="processAiAverage"; epicsMutexLock(pPvt->ringBufferLock); if (pPvt->numAverage == 0) { @@ -794,7 +852,7 @@ static long processAiAverage(aiRecord *pr) pPvt->sum = 0.; epicsMutexUnlock(pPvt->ringBufferLock); asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynInt32::processAiInt32Average rval=%d, status=%d\n",pr->name, pr->rval, pPvt->result.status); + "%s %s::%s rval=%d, status=%d\n",pr->name, driverName, functionName, pr->rval, pPvt->result.status); pasynEpicsUtils->asynStatusToEpicsAlarm(pPvt->result.status, READ_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); @@ -812,10 +870,10 @@ static long processAiAverage(aiRecord *pr) static long initAo(aoRecord *pao) { - devInt32Pvt *pPvt; + devPvt *pPvt; int status; epicsInt32 value; - + status = initCommon((dbCommon *)pao,&pao->out, processCallbackOutput,interruptCallbackOutput, NULL, 0, NULL, NULL, NULL); @@ -844,11 +902,12 @@ static long initAo(aoRecord *pao) static long processAo(aoRecord *pr) { - devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; + devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; double value; + static const char *functionName="processAo"; - if (getCallbackValue(pPvt)) { + if (pPvt->newOutputCallbackValue && getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { pr->rval = pPvt->result.value; @@ -865,8 +924,8 @@ static long processAo(aoRecord *pr) if(cvtRawToEngBpt(&value,pr->linr,pr->init, (void *)&pr->pbrk,&pr->lbrk)!=0) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynInt32 cvtRawToEngBpt failed\n", - pr->name); + "%s %s::%s cvtRawToEngBpt failed\n", + pr->name, driverName, functionName); (void)recGblSetSevr(pr, WRITE_ALARM, INVALID_ALARM); return -1; } @@ -886,6 +945,11 @@ static long processAo(aoRecord *pr) WRITE_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); (void)recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); + if (pPvt->numDeferredOutputCallbacks > 0) { + callbackRequest(&pPvt->outputCallback); + pPvt->numDeferredOutputCallbacks--; + } + pPvt->newOutputCallbackValue = 0; if(pPvt->result.status == asynSuccess) { return 0; } @@ -908,7 +972,7 @@ static long initLi(longinRecord *pr) static long processLi(longinRecord *pr) { - devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; + devPvt *pPvt = (devPvt *)pr->dpvt; int status; if(!getCallbackValue(pPvt) && !pr->pact) { @@ -936,7 +1000,7 @@ static long processLi(longinRecord *pr) static long initLo(longoutRecord *pr) { - devInt32Pvt *pPvt; + devPvt *pPvt; int status; epicsInt32 value; @@ -957,10 +1021,10 @@ static long initLo(longoutRecord *pr) static long processLo(longoutRecord *pr) { - devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; + devPvt *pPvt = (devPvt *)pr->dpvt; int status; - if (getCallbackValue(pPvt)) { + if (pPvt->newOutputCallbackValue && getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { pr->val = pPvt->result.value; @@ -978,6 +1042,11 @@ static long processLo(longoutRecord *pr) WRITE_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); (void)recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); + if (pPvt->numDeferredOutputCallbacks > 0) { + callbackRequest(&pPvt->outputCallback); + pPvt->numDeferredOutputCallbacks--; + } + pPvt->newOutputCallbackValue = 0; if(pPvt->result.status == asynSuccess) { return 0; } @@ -1000,7 +1069,7 @@ static long initBi(biRecord *pr) static long processBi(biRecord *pr) { - devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; + devPvt *pPvt = (devPvt *)pr->dpvt; int status; if(!getCallbackValue(pPvt) && !pr->pact) { @@ -1028,7 +1097,7 @@ static long processBi(biRecord *pr) static long initBo(boRecord *pr) { - devInt32Pvt *pPvt; + devPvt *pPvt; int status; epicsInt32 value; @@ -1049,10 +1118,10 @@ static long initBo(boRecord *pr) static long processBo(boRecord *pr) { - devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; + devPvt *pPvt = (devPvt *)pr->dpvt; int status; - if(getCallbackValue(pPvt)) { + if(pPvt->newOutputCallbackValue && getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { pr->rval = pPvt->result.value; @@ -1071,6 +1140,11 @@ static long processBo(boRecord *pr) WRITE_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); (void)recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); + if (pPvt->numDeferredOutputCallbacks > 0) { + callbackRequest(&pPvt->outputCallback); + pPvt->numDeferredOutputCallbacks--; + } + pPvt->newOutputCallbackValue = 0; if(pPvt->result.status == asynSuccess) { return 0; } else { @@ -1078,6 +1152,7 @@ static long processBo(boRecord *pr) return -1; } } + static long initMbbi(mbbiRecord *pr) { @@ -1094,7 +1169,7 @@ static long initMbbi(mbbiRecord *pr) static long processMbbi(mbbiRecord *pr) { - devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; + devPvt *pPvt = (devPvt *)pr->dpvt; int status; if(!getCallbackValue(pPvt) && !pr->pact) { @@ -1122,7 +1197,7 @@ static long processMbbi(mbbiRecord *pr) static long initMbbo(mbboRecord *pr) { - devInt32Pvt *pPvt; + devPvt *pPvt; int status; epicsInt32 value; @@ -1144,10 +1219,10 @@ static long initMbbo(mbboRecord *pr) } static long processMbbo(mbboRecord *pr) { - devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; + devPvt *pPvt = (devPvt *)pr->dpvt; int status; - if(getCallbackValue(pPvt)) { + if(pPvt->newOutputCallbackValue && getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { unsigned long rval = pPvt->result.value & pr->mask; @@ -1184,6 +1259,11 @@ static long processMbbo(mbboRecord *pr) WRITE_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); (void)recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); + if (pPvt->numDeferredOutputCallbacks > 0) { + callbackRequest(&pPvt->outputCallback); + pPvt->numDeferredOutputCallbacks--; + } + pPvt->newOutputCallbackValue = 0; if(pPvt->result.status == asynSuccess) { return 0; } diff --git a/asyn/devEpics/devAsynOctet.c b/asyn/devEpics/devAsynOctet.c index 2a6913f..2bd6ad0 100644 --- a/asyn/devEpics/devAsynOctet.c +++ b/asyn/devEpics/devAsynOctet.c @@ -104,7 +104,10 @@ typedef struct devPvt { /* Following for writeRead */ DBADDR dbAddr; /* Following are for I/O Intr*/ - CALLBACK callback; + CALLBACK processCallback; + CALLBACK outputCallback; + int newOutputCallbackValue; + int numDeferredOutputCallbacks; IOSCANPVT ioScanPvt; void *registrarPvt; int gotValue; @@ -116,6 +119,7 @@ static long initCommon(dbCommon *precord, DBLINK *plink, userCallback callback, int isOutput, int isWaveform, int useDrvUser, char *pValue, size_t valSize); static long createRingBuffer(dbCommon *pr); static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt); +static void outputCallbackCallback(CALLBACK *pcb); static void interruptCallback(void *drvPvt, asynUser *pasynUser, char *value, size_t len, int eomReason); static int initDrvUser(devPvt *pPvt); @@ -197,6 +201,7 @@ static long initCommon(dbCommon *precord, DBLINK *plink, userCallback callback, asynOctet *poctet; char *buffer; waveformRecord *pwf = (waveformRecord *)precord; + static const char *functionName="initCommon"; pPvt = callocMustSucceed(1,sizeof(*pPvt),"devAsynOctet::initCommon"); precord->dpvt = pPvt; @@ -213,22 +218,22 @@ static long initCommon(dbCommon *precord, DBLINK *plink, userCallback callback, status = pasynEpicsUtils->parseLink(pasynUser, plink, &pPvt->portName, &pPvt->addr,&pPvt->userParam); if (status != asynSuccess) { - printf("%s %s::initCommon error in link %s\n", - precord->name, driverName, pasynUser->errorMessage); + printf("%s %s::%s error in link %s\n", + precord->name, driverName, functionName, pasynUser->errorMessage); goto bad; } /* Connect to device */ status = pasynManager->connectDevice(pasynUser, pPvt->portName, pPvt->addr); if (status != asynSuccess) { - printf("%s %s::initCommon connectDevice failed %s\n", - precord->name, driverName, pasynUser->errorMessage); + printf("%s %s::%s connectDevice failed %s\n", + precord->name, driverName, functionName, pasynUser->errorMessage); goto bad; } pasynInterface = pasynManager->findInterface(pasynUser,asynOctetType,1); if(!pasynInterface) { - printf("%s %s::initCommon interface %s not found\n", - precord->name, driverName, asynOctetType); + printf("%s %s::%s interface %s not found\n", + precord->name, driverName, functionName, asynOctetType); goto bad; } pPvt->poctet = poctet = pasynInterface->pinterface; @@ -274,8 +279,8 @@ static long initCommon(dbCommon *precord, DBLINK *plink, userCallback callback, status = dbFindRecord(pdbentry, precord->name); if (status) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynOctet::initCommon error finding record\n", - precord->name); + "%s %s::%s error finding record\n", + precord->name, driverName, functionName); goto bad; } readbackString = dbGetInfo(pdbentry, "asyn:READBACK"); @@ -287,9 +292,13 @@ static long initCommon(dbCommon *precord, DBLINK *plink, userCallback callback, pPvt->octetPvt, pPvt->pasynUser, pPvt->interruptCallback, pPvt, &pPvt->registrarPvt); if(status != asynSuccess) { - printf("%s devAsynOctet::initCommon error calling registerInterruptUser %s\n", - precord->name, pPvt->pasynUser->errorMessage); + printf("%s %s::%s error calling registerInterruptUser %s\n", + precord->name, driverName, functionName, pPvt->pasynUser->errorMessage); } + /* Initialize the interrupt callback */ + callbackSetCallback(outputCallbackCallback, &pPvt->outputCallback); + callbackSetPriority(precord->prio, &pPvt->outputCallback); + callbackSetUser(pPvt, &pPvt->outputCallback); } initialReadbackString = dbGetInfo(pdbentry, "asyn:INITIAL_READBACK"); @@ -299,8 +308,8 @@ static long initCommon(dbCommon *precord, DBLINK *plink, userCallback callback, status = pasynOctetSyncIO->connect(pPvt->portName, pPvt->addr, &pasynUserSync, pPvt->userParam); if (status != asynSuccess) { - printf("%s devAsynOctet::initCommon octetSyncIO->connect failed %s\n", - precord->name, pasynUserSync->errorMessage); + printf("%s %s::%s octetSyncIO->connect failed %s\n", + precord->name, driverName, functionName, pasynUserSync->errorMessage); goto bad; } buffer = malloc(valSize); @@ -333,14 +342,15 @@ static long createRingBuffer(dbCommon *pr) asynStatus status; int i; const char *sizeString; + static const char *functionName="createRingBuffer"; if (!pPvt->ringBuffer) { DBENTRY *pdbentry = dbAllocEntry(pdbbase); status = dbFindRecord(pdbentry, pr->name); if (status) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s %s::createRingBufffer error finding record\n", - pr->name, driverName); + "%s %s::%s error finding record\n", + pr->name, driverName, functionName); return -1; } pPvt->ringSize = DEFAULT_RING_BUFFER_SIZE; @@ -364,6 +374,7 @@ static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt) { devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; + static const char *functionName="getIoIntInfo"; /* If initCommon failed then pPvt->poctet is NULL, return error */ if (!pPvt->poctet) return -1; @@ -371,25 +382,25 @@ static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt) if (cmd == 0) { /* Add to scan list. Register interrupts */ asynPrint(pPvt->pasynUser, ASYN_TRACE_FLOW, - "%s %s::getIoIntInfo registering interrupt\n", - pr->name, driverName); + "%s %s::%s registering interrupt\n", + pr->name, driverName, functionName); createRingBuffer(pr); status = pPvt->poctet->registerInterruptUser( pPvt->octetPvt,pPvt->pasynUser, pPvt->interruptCallback,pPvt,&pPvt->registrarPvt); if(status!=asynSuccess) { - printf("%s %s::getIoIntInfo error calling registerInterruptUser %s\n", - pr->name, driverName, pPvt->pasynUser->errorMessage); + printf("%s %s::%s error calling registerInterruptUser %s\n", + pr->name, driverName, functionName, pPvt->pasynUser->errorMessage); } } else { asynPrint(pPvt->pasynUser, ASYN_TRACE_FLOW, - "%s %s::getIoIntInfo cancelling interrupt\n", - pr->name, driverName); + "%s %s::%s cancelling interrupt\n", + pr->name, driverName, functionName); status = pPvt->poctet->cancelInterruptUser(pPvt->octetPvt, pPvt->pasynUser,pPvt->registrarPvt); if(status!=asynSuccess) { - printf("%s %s::getIoIntInfo error calling cancelInterruptUser %s\n", - pr->name, driverName, pPvt->pasynUser->errorMessage); + printf("%s %s::%s error calling cancelInterruptUser %s\n", + pr->name, driverName, functionName, pPvt->pasynUser->errorMessage); } } *iopvt = pPvt->ioScanPvt; @@ -399,12 +410,14 @@ static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt) static int getRingBufferValue(devPvt *pPvt) { int ret = 0; + static const char *functionName="getRingBufferValue"; + epicsMutexLock(pPvt->ringBufferLock); if (pPvt->ringTail != pPvt->ringHead) { if (pPvt->ringBufferOverflows > 0) { asynPrint(pPvt->pasynUser, ASYN_TRACE_WARNING, - "%s %s::getRingBufferValue error, %d ring buffer overflows\n", - pPvt->precord->name, driverName, pPvt->ringBufferOverflows); + "%s %s::%s error, %d ring buffer overflows\n", + pPvt->precord->name, driverName, functionName, pPvt->ringBufferOverflows); pPvt->ringBufferOverflows = 0; } pPvt->result = pPvt->ringBuffer[pPvt->ringTail]; @@ -420,15 +433,16 @@ static void interruptCallback(void *drvPvt, asynUser *pasynUser, { devPvt *pPvt = (devPvt *)drvPvt; dbCommon *pr = pPvt->precord; + static const char *functionName="interruptCallback"; + dbScanLock(pr); asynPrintIO(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, (char *)value, len*sizeof(char), - "%s %s::interruptCallbackInput ringSize=%d, len=%d, callback data:", - pr->name, driverName, pPvt->ringSize, (int)len); + "%s %s::%s ringSize=%d, len=%d, callback data:", + pr->name, driverName, functionName, pPvt->ringSize, (int)len); if (len >= pPvt->valSize) len = pPvt->valSize-1; if (pPvt->ringSize == 0) { /* Not using a ring buffer */ - dbScanLock(pr); pr->time = pasynUser->timestamp; if (pasynUser->auxStatus == asynSuccess) { memcpy(pPvt->pValue, value, len); @@ -440,11 +454,17 @@ static void interruptCallback(void *drvPvt, asynUser *pasynUser, pPvt->result.time = pasynUser->timestamp; pPvt->result.alarmStatus = pasynUser->alarmStatus; pPvt->result.alarmSeverity = pasynUser->alarmSeverity; - dbScanUnlock(pPvt->precord); - if (pPvt->isOutput) - scanOnce(pPvt->precord); - else + if (pPvt->isOutput) { + /* If PACT is true then this callback was received during asynchronous record processing + * Must defer calling callbackRequest until end of record processing */ + if (pr->pact) { + pPvt->numDeferredOutputCallbacks++; + } else { + callbackRequest(&pPvt->outputCallback); + } + } else { scanIoRequest(pPvt->ioScanPvt); + } } else { /* Using a ring buffer */ ringBufferElement *rp; @@ -473,15 +493,48 @@ static void interruptCallback(void *drvPvt, asynUser *pasynUser, } else { /* We only need to request the record to process if we added a new * element to the ring buffer, not if we just replaced an element. */ - if (pPvt->isOutput) - scanOnce(pPvt->precord); - else + if (pPvt->isOutput) { + /* If PACT is true then this callback was received during asynchronous record processing + * Must defer calling callbackRequest until end of record processing */ + if (pr->pact) { + pPvt->numDeferredOutputCallbacks++; + } else { + callbackRequest(&pPvt->outputCallback); + } + } else { scanIoRequest(pPvt->ioScanPvt); + } } epicsMutexUnlock(pPvt->ringBufferLock); } + dbScanUnlock(pr); } +static void outputCallbackCallback(CALLBACK *pcb) +{ + devPvt *pPvt; + static const char *functionName="outputCallbackCallback"; + + callbackGetUser(pPvt, pcb); + { + dbCommon *pr = pPvt->precord; + dbScanLock(pr); + pPvt->newOutputCallbackValue = 1; + dbProcess(pr); + if (pPvt->newOutputCallbackValue != 0) { + /* We called dbProcess but the record did not process, perhaps because PACT was 1 + * Need to remove ring buffer element */ + asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, + "%s %s::%s warning dbProcess did not process record, PACT=%d\n", + pr->name, driverName, functionName, pr->pact); + if (pPvt->ringSize > 0) { + getRingBufferValue(pPvt); + } + pPvt->newOutputCallbackValue = 0; + } + dbScanUnlock(pr); + } +} static int initDrvUser(devPvt *pPvt) { @@ -489,6 +542,7 @@ static int initDrvUser(devPvt *pPvt) asynStatus status; asynInterface *pasynInterface; dbCommon *precord = pPvt->precord; + static const char *functionName="initDrvUser"; /*call drvUserCreate*/ pasynInterface = pasynManager->findInterface(pasynUser,asynDrvUserType,1); @@ -501,8 +555,8 @@ static int initDrvUser(devPvt *pPvt) status = pasynDrvUser->create(drvPvt,pasynUser,pPvt->userParam,0,0); if(status!=asynSuccess) { precord->pact=1; - printf("%s %s::initDrvUser drvUserCreate failed %s\n", - precord->name, driverName, pasynUser->errorMessage); + printf("%s %s::%s drvUserCreate failed %s\n", + precord->name, driverName, functionName, pasynUser->errorMessage); recGblSetSevr(precord,LINK_ALARM,INVALID_ALARM); return INIT_ERROR; } @@ -514,15 +568,16 @@ static int initCmdBuffer(devPvt *pPvt) { size_t len; dbCommon *precord = pPvt->precord; + static const char *functionName="initCmdBuffer"; len = strlen(pPvt->userParam); if(len<=0) { - printf("%s no userParam\n",precord->name); + printf("%s %s::%s no userParam\n",precord->name, driverName, functionName); precord->pact = 1; recGblSetSevr(precord,LINK_ALARM,INVALID_ALARM); return INIT_ERROR; } - pPvt->buffer = callocMustSucceed(len,sizeof(char),"devAsynOctet"); + pPvt->buffer = callocMustSucceed(len,sizeof(char),"devAsynOctet::initCmdBuffer"); dbTranslateEscape(pPvt->buffer,pPvt->userParam); pPvt->bufSize = len; pPvt->bufLen = strlen(pPvt->buffer); @@ -533,11 +588,12 @@ static int initDbAddr(devPvt *pPvt) { char *userParam; dbCommon *precord = pPvt->precord; + static const char *functionName="initDbAddr"; userParam = pPvt->userParam; if(dbNameToAddr(userParam,&pPvt->dbAddr)) { - printf("%s %s::initDbAddr record %s not present\n", - precord->name, driverName, userParam); + printf("%s %s::%s record %s not present\n", + precord->name, driverName, functionName, userParam); precord->pact = 1; recGblSetSevr(precord,LINK_ALARM,INVALID_ALARM); return INIT_ERROR; @@ -552,6 +608,7 @@ static asynStatus writeIt(asynUser *pasynUser,const char *message,size_t nbytes) asynOctet *poctet = pPvt->poctet; void *octetPvt = pPvt->octetPvt; size_t nbytesTransfered; + static const char *functionName="writeIt"; pPvt->result.status = poctet->write(octetPvt,pasynUser,message,nbytes,&nbytesTransfered); pPvt->result.time = pPvt->pasynUser->timestamp; @@ -559,19 +616,19 @@ static asynStatus writeIt(asynUser *pasynUser,const char *message,size_t nbytes) pPvt->result.alarmSeverity = pPvt->pasynUser->alarmSeverity; if(pPvt->result.status!=asynSuccess) { asynPrint(pasynUser,ASYN_TRACE_ERROR, - "%s %s::writeIt failed %s\n", - precord->name, driverName, pasynUser->errorMessage); + "%s %s::%s failed %s\n", + precord->name, driverName, functionName, pasynUser->errorMessage); return pPvt->result.status; } if(nbytes != nbytesTransfered) { asynPrint(pasynUser,ASYN_TRACE_ERROR, - "%s %s::writeIt requested %lu but sent %lu bytes\n", - precord->name, driverName, (unsigned long)nbytes, (unsigned long)nbytesTransfered); + "%s %s::%s requested %lu but sent %lu bytes\n", + precord->name, driverName, functionName, (unsigned long)nbytes, (unsigned long)nbytesTransfered); recGblSetSevr(precord, WRITE_ALARM, MINOR_ALARM); return asynError; } asynPrintIO(pasynUser,ASYN_TRACEIO_DEVICE,message,nbytes, - "%s %s::writeIt\n",precord->name, driverName); + "%s %s::%s\n",precord->name, driverName, functionName); return pPvt->result.status; } @@ -583,6 +640,7 @@ static asynStatus readIt(asynUser *pasynUser,char *message, asynOctet *poctet = pPvt->poctet; void *octetPvt = pPvt->octetPvt; int eomReason; + static const char *functionName="readIt"; pPvt->result.status = poctet->read(octetPvt,pasynUser,message,maxBytes, nBytesRead,&eomReason); @@ -591,27 +649,29 @@ static asynStatus readIt(asynUser *pasynUser,char *message, pPvt->result.alarmSeverity = pPvt->pasynUser->alarmSeverity; if(pPvt->result.status!=asynSuccess) { asynPrint(pasynUser,ASYN_TRACE_ERROR, - "%s %s::readIt failed %s\n", - precord->name, driverName, pasynUser->errorMessage); + "%s %s::%s failed %s\n", + precord->name, driverName, functionName, pasynUser->errorMessage); return pPvt->result.status; } asynPrintIO(pasynUser,ASYN_TRACEIO_DEVICE,message,*nBytesRead, - "%s %s::readIt eomReason %d\n",precord->name, driverName, eomReason); + "%s %s::%s eomReason %d\n",precord->name, driverName, functionName, eomReason); return pPvt->result.status; } static void reportQueueRequestStatus(devPvt *pPvt, asynStatus status) { + static const char *functionName="reportQueueRequestStatus"; + if (pPvt->previousQueueRequestStatus != status) { pPvt->previousQueueRequestStatus = status; if (status == asynSuccess) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynOctet queueRequest status returned to normal\n", - pPvt->precord->name); + "%s %s::%s queueRequest status returned to normal\n", + pPvt->precord->name, driverName, functionName); } else { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynOctet queueRequest %s\n", - pPvt->precord->name,pPvt->pasynUser->errorMessage); + "%s %s::%s queueRequest error %s\n", + pPvt->precord->name, driverName, functionName,pPvt->pasynUser->errorMessage); } } } @@ -620,20 +680,29 @@ static long processCommon(dbCommon *precord) devPvt *pPvt = (devPvt *)precord->dpvt; waveformRecord *pwf = (waveformRecord *)precord; int gotCallbackData; - - if (pPvt->ringSize == 0) { - gotCallbackData = pPvt->gotValue; + asynStatus status; + static const char *functionName="processCommon"; + + if (pPvt->isOutput) { + if (pPvt->ringSize == 0) { + gotCallbackData = pPvt->newOutputCallbackValue; + } else { + gotCallbackData = pPvt->newOutputCallbackValue && getRingBufferValue(pPvt); + } } else { - gotCallbackData = getRingBufferValue(pPvt); + if (pPvt->ringSize == 0) { + gotCallbackData = pPvt->gotValue; + } else { + gotCallbackData = getRingBufferValue(pPvt); + } } if (!gotCallbackData && precord->pact == 0) { if(pPvt->canBlock) precord->pact = 1; - pPvt->result.status = pasynManager->queueRequest( - pPvt->pasynUser, asynQueuePriorityMedium, 0.0); - if((pPvt->result.status==asynSuccess) && pPvt->canBlock) return 0; + status = pasynManager->queueRequest(pPvt->pasynUser, asynQueuePriorityMedium, 0.0); + if((status == asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) precord->pact = 0; - reportQueueRequestStatus(pPvt, pPvt->result.status); + reportQueueRequestStatus(pPvt, status); } if (gotCallbackData) { int len; @@ -643,9 +712,8 @@ static long processCommon(dbCommon *precord) if (pPvt->isWaveform && (pPvt->result.status == asynSuccess)) pwf->nord = pPvt->nord; if (pPvt->gotValue) { asynPrint(pPvt->pasynUser, ASYN_TRACE_WARNING, - "%s %s::processCommon, " - "warning: multiple interrupt callbacks between processing\n", - precord->name, driverName); + "%s %s::%s warning: multiple interrupt callbacks between processing\n", + precord->name, driverName, functionName); } } else { /* Copy data from ring buffer */ @@ -663,14 +731,19 @@ static long processCommon(dbCommon *precord) len = strlen(pPvt->pValue); asynPrintIO(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, pPvt->pValue, len, - "%s %s::processCommon len=%d, data:", - precord->name, driverName, len); + "%s %s::%s len=%d, data:", + precord->name, driverName, functionName, len); } pasynEpicsUtils->asynStatusToEpicsAlarm(pPvt->result.status, pPvt->isOutput ? WRITE_ALARM : READ_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); - recGblSetSevr(precord, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); + (void)recGblSetSevr(precord, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); + if (pPvt->numDeferredOutputCallbacks > 0) { + callbackRequest(&pPvt->outputCallback); + pPvt->numDeferredOutputCallbacks--; + } + pPvt->newOutputCallbackValue = 0; if (pPvt->result.status == asynSuccess) { pPvt->precord->udf = 0; return 0; @@ -684,7 +757,7 @@ static void finish(dbCommon *pr) { devPvt *pPvt = (devPvt *)pr->dpvt; - if(pr->pact) callbackRequestProcessCallback(&pPvt->callback,pr->prio,pr); + if(pr->pact) callbackRequestProcessCallback(&pPvt->processCallback,pr->prio,pr); } static long initSiCmdResponse(stringinRecord *psi) @@ -866,12 +939,13 @@ static void callbackWfWriteRead(asynUser *pasynUser) char raw[MAX_STRING_SIZE+1]; char translate[MAX_STRING_SIZE+1]; char *pbuf = (char *)pwf->bptr; + static const char *functionName="callbackWfWriteRead"; dbStatus = dbGet(&pPvt->dbAddr, DBR_STRING, raw, 0, 0, 0); raw[MAX_STRING_SIZE] = 0; if(dbStatus) { asynPrint(pasynUser,ASYN_TRACE_ERROR, - "%s dbGet failed\n",pwf->name); + "%s %s::%s dbGet failed\n",pwf->name, driverName, functionName); recGblSetSevr(pwf,READ_ALARM,INVALID_ALARM); finish((dbCommon *)pwf); return; diff --git a/asyn/devEpics/devAsynUInt32Digital.c b/asyn/devEpics/devAsynUInt32Digital.c index f7f54d6..4dc0444 100644 --- a/asyn/devEpics/devAsynUInt32Digital.c +++ b/asyn/devEpics/devAsynUInt32Digital.c @@ -61,6 +61,8 @@ #define MAX_ENUM_STATES 16 #define MAX_ENUM_STRING_SIZE 26 +static const char *driverName = "devAsynUInt32Digital"; + typedef struct ringBufferElement { epicsUInt32 value; epicsTimeStamp time; @@ -87,7 +89,10 @@ typedef struct devPvt{ int ringBufferOverflows; ringBufferElement result; interruptCallbackUInt32Digital interruptCallback; - CALLBACK callback; + CALLBACK processCallback; + CALLBACK outputCallback; + int newOutputCallbackValue; + int numDeferredOutputCallbacks; IOSCANPVT ioScanPvt; char *portName; char *userParam; @@ -107,6 +112,8 @@ static long createRingBuffer(dbCommon *pr); static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt); static void processCallbackInput(asynUser *pasynUser); static void processCallbackOutput(asynUser *pasynUser); +static void outputCallbackCallback(CALLBACK *pcb); +static int getCallbackValue(devPvt *pPvt); static void interruptCallbackInput(void *drvPvt, asynUser *pasynUser, epicsUInt32 value); static void interruptCallbackOutput(void *drvPvt, asynUser *pasynUser, @@ -174,6 +181,7 @@ static long initCommon(dbCommon *pr, DBLINK *plink, asynStatus status; asynUser *pasynUser; asynInterface *pasynInterface; + static const char *functionName="initCommon"; pPvt = callocMustSucceed(1, sizeof(*pPvt), "devAsynUInt32Digital::initCommon"); pr->dpvt = pPvt; @@ -187,21 +195,21 @@ static long initCommon(dbCommon *pr, DBLINK *plink, 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); + printf("%s %s::%s %s\n", + pr->name, driverName, functionName, 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); + printf("%s %s::%s connectDevice failed %s\n", + pr->name, driverName, functionName, 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); + printf("%s %s::%s canBlock failed %s\n", + pr->name, driverName, functionName, pasynUser->errorMessage); goto bad; } /*call drvUserCreate*/ @@ -214,17 +222,16 @@ static long initCommon(dbCommon *pr, DBLINK *plink, 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); + printf("%s %s::%s drvUserCreate %s\n", + pr->name, driverName, functionName, 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); + printf("%s %s::%s findInterface asynUInt32DigitalType %s\n", + pr->name, driverName, functionName,pasynUser->errorMessage); goto bad; } pPvt->puint32 = pasynInterface->pinterface; @@ -234,8 +241,8 @@ static long initCommon(dbCommon *pr, DBLINK *plink, 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); + printf("%s %s::%s UInt32DigitalSyncIO->connect failed %s\n", + pr->name, driverName, functionName, pPvt->pasynUserSync->errorMessage); goto bad; } pPvt->interruptCallback = interruptCallback; @@ -250,8 +257,8 @@ static long initCommon(dbCommon *pr, DBLINK *plink, 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); + printf("%s %s::%s EnumSyncIO->connect failed %s\n", + pr->name, driverName, functionName, pPvt->pasynUserEnumSync->errorMessage); goto bad; } status = pasynEnumSyncIO->read(pPvt->pasynUserEnumSync, @@ -265,8 +272,8 @@ static long initCommon(dbCommon *pr, DBLINK *plink, pasynInterface->drvPvt, pPvt->pasynUser, callbackEnum, pPvt, ®istrarPvt); if(status!=asynSuccess) { - printf("%s devAsynUInt32Digital enum registerInterruptUser %s\n", - pr->name,pPvt->pasynUser->errorMessage); + printf("%s %s::%s enum registerInterruptUser %s\n", + pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } } /* If the info field "asyn:READBACK" is 1 and interruptCallback is not NULL @@ -278,8 +285,8 @@ static long initCommon(dbCommon *pr, DBLINK *plink, status = dbFindRecord(pdbentry, pr->name); if (status) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynUInt32Digital::initCommon error finding record\n", - pr->name); + "%s %s::%s error finding record\n", + pr->name, driverName, functionName); goto bad; } callbackString = dbGetInfo(pdbentry, "asyn:READBACK"); @@ -291,9 +298,13 @@ static long initCommon(dbCommon *pr, DBLINK *plink, 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); + printf("%s %s::%s error calling registerInterruptUser %s\n", + pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } + /* Initialize the interrupt callback */ + callbackSetCallback(outputCallbackCallback, &pPvt->outputCallback); + callbackSetPriority(pr->prio, &pPvt->outputCallback); + callbackSetUser(pPvt, &pPvt->outputCallback); } } return INIT_OK; @@ -308,6 +319,7 @@ static long createRingBuffer(dbCommon *pr) devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; const char *sizeString; + static const char *functionName="createRingBuffer"; if (!pPvt->ringBuffer) { DBENTRY *pdbentry = dbAllocEntry(pdbbase); @@ -315,13 +327,13 @@ static long createRingBuffer(dbCommon *pr) status = dbFindRecord(pdbentry, pr->name); if (status) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynUInt32Digital::createRingBufffer error finding record\n", - pr->name); + "%s %s::%s error finding record\n", + pr->name, driverName, functionName); return -1; } sizeString = dbGetInfo(pdbentry, "asyn:FIFO"); if (sizeString) pPvt->ringSize = atoi(sizeString); - pPvt->ringBuffer = callocMustSucceed(pPvt->ringSize+1, sizeof *pPvt->ringBuffer, "devAsynUInt32Digital::createRingBuffer"); + pPvt->ringBuffer = callocMustSucceed(pPvt->ringSize+1, sizeof *pPvt->ringBuffer, "%s::createRingBuffer"); } return asynSuccess; } @@ -331,6 +343,7 @@ static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt) { devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; + static const char *functionName="getIoIntInfo"; /* If initCommon failed then pPvt->puint32 is NULL, return error */ if (!pPvt->puint32) return -1; @@ -338,25 +351,25 @@ static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt) if (cmd == 0) { /* Add to scan list. Register interrupts */ asynPrint(pPvt->pasynUser, ASYN_TRACE_FLOW, - "%s devAsynUInt32Digital::getIoIntInfo registering interrupt\n", - pr->name); + "%s %s::%s registering interrupt\n", + pr->name, driverName, functionName); createRingBuffer(pr); status = pPvt->puint32->registerInterruptUser( pPvt->uint32Pvt,pPvt->pasynUser, pPvt->interruptCallback,pPvt,pPvt->mask,&pPvt->registrarPvt); if(status!=asynSuccess) { - printf("%s devAsynUInt32Digital registerInterruptUser %s\n", - pr->name,pPvt->pasynUser->errorMessage); + printf("%s %s::%s registerInterruptUser %s\n", + pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } } else { asynPrint(pPvt->pasynUser, ASYN_TRACE_FLOW, - "%s devAsynUInt32Digital::getIoIntInfo cancelling interrupt\n", - pr->name); + "%s %s::%s cancelling interrupt\n", + pr->name, driverName, functionName); status = pPvt->puint32->cancelInterruptUser(pPvt->uint32Pvt, pPvt->pasynUser,pPvt->registrarPvt); if(status!=asynSuccess) { - printf("%s devAsynUInt32Digital cancelInterruptUser %s\n", - pr->name,pPvt->pasynUser->errorMessage); + printf("%s %s::%s cancelInterruptUser %s\n", + pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } } *iopvt = pPvt->ioScanPvt; @@ -384,6 +397,7 @@ static void processCallbackInput(asynUser *pasynUser) { devPvt *pPvt = (devPvt *)pasynUser->userPvt; dbCommon *pr = (dbCommon *)pPvt->pr; + static const char *functionName="processCallbackInput"; pPvt->result.status = pPvt->puint32->read(pPvt->uint32Pvt, pPvt->pasynUser, &pPvt->result.value,pPvt->mask); @@ -392,20 +406,21 @@ static void processCallbackInput(asynUser *pasynUser) pPvt->result.alarmSeverity = pPvt->pasynUser->alarmSeverity; if (pPvt->result.status == asynSuccess) { asynPrint(pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynUInt32Digital::process value=%u\n", - pr->name,pPvt->result.value); + "%s %s::%s value=%u\n", + pr->name, driverName, functionName,pPvt->result.value); } else { asynPrint(pasynUser, ASYN_TRACE_ERROR, - "%s devAsynUInt32Digital::process read error %s\n", - pr->name, pasynUser->errorMessage); + "%s %s::%s read error %s\n", + pr->name, driverName, functionName, pasynUser->errorMessage); } - if(pr->pact) callbackRequestProcessCallback(&pPvt->callback,pr->prio,pr); + if(pr->pact) callbackRequestProcessCallback(&pPvt->processCallback,pr->prio,pr); } static void processCallbackOutput(asynUser *pasynUser) { devPvt *pPvt = (devPvt *)pasynUser->userPvt; dbCommon *pr = pPvt->pr; + static const char *functionName="processCallbackOutput"; pPvt->result.status = pPvt->puint32->write(pPvt->uint32Pvt, pPvt->pasynUser, pPvt->result.value,pPvt->mask); @@ -414,13 +429,13 @@ static void processCallbackOutput(asynUser *pasynUser) pPvt->result.alarmSeverity = pPvt->pasynUser->alarmSeverity; if(pPvt->result.status == asynSuccess) { asynPrint(pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynUInt32Digital process value %u\n",pr->name,pPvt->result.value); + "%s %s::%s process value %u\n",pr->name, driverName, functionName,pPvt->result.value); } else { asynPrint(pasynUser, ASYN_TRACE_ERROR, - "%s devAsynUInt32Digital process error %s\n", - pr->name, pasynUser->errorMessage); + "%s %s::%s process error %s\n", + pr->name, driverName, functionName, pasynUser->errorMessage); } - if(pr->pact) callbackRequestProcessCallback(&pPvt->callback,pr->prio,pr); + if(pr->pact) callbackRequestProcessCallback(&pPvt->processCallback,pr->prio,pr); } static void interruptCallbackInput(void *drvPvt, asynUser *pasynUser, @@ -429,10 +444,11 @@ static void interruptCallbackInput(void *drvPvt, asynUser *pasynUser, devPvt *pPvt = (devPvt *)drvPvt; dbCommon *pr = pPvt->pr; ringBufferElement *rp; + static const char *functionName="interruptCallbackInput"; asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynUInt32Digital::interruptCallbackInput new value=%u\n", - pr->name, value); + "%s %s::%s new value=%u\n", + pr->name, driverName, functionName, value); /* There is a problem. A driver could be calling us with a value after * this record has registered for callbacks but before EPICS has set interruptAccept, * which means that scanIoRequest will return immediately. @@ -475,11 +491,13 @@ static void interruptCallbackOutput(void *drvPvt, asynUser *pasynUser, devPvt *pPvt = (devPvt *)drvPvt; dbCommon *pr = pPvt->pr; ringBufferElement *rp; + static const char *functionName="interruptCallbackOutput"; asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynUInt32Digital::interruptCallbackOutput new value=%u\n", - pr->name, value); + "%s %s::%s new value=%u\n", + pr->name, driverName, functionName, value); if (!interruptAccept) return; + dbScanLock(pr); epicsMutexLock(pPvt->ringBufferLock); rp = &pPvt->ringBuffer[pPvt->ringHead]; rp->value = value; @@ -492,9 +510,40 @@ static void interruptCallbackOutput(void *drvPvt, asynUser *pasynUser, pPvt->ringTail = (pPvt->ringTail==pPvt->ringSize) ? 0 : pPvt->ringTail+1; pPvt->ringBufferOverflows++; } else { - scanOnce(pr); - } + /* If PACT is true then this callback was received during asynchronous record processing + * Must defer calling callbackRequest until end of record processing */ + if (pr->pact) { + pPvt->numDeferredOutputCallbacks++; + } else { + callbackRequest(&pPvt->outputCallback); + } + } epicsMutexUnlock(pPvt->ringBufferLock); + dbScanUnlock(pr); +} + +static void outputCallbackCallback(CALLBACK *pcb) +{ + devPvt *pPvt; + static const char *functionName="outputCallbackCallback"; + + callbackGetUser(pPvt, pcb); + { + dbCommon *pr = pPvt->pr; + dbScanLock(pr); + pPvt->newOutputCallbackValue = 1; + dbProcess(pr); + if (pPvt->newOutputCallbackValue != 0) { + /* We called dbProcess but the record did not process, perhaps because PACT was 1 + * Need to remove ring buffer element */ + asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, + "%s %s::%s warning dbProcess did not process record, PACT=%d\n", + pr->name, driverName, functionName,pr->pact); + getCallbackValue(pPvt); + pPvt->newOutputCallbackValue = 0; + } + dbScanUnlock(pr); + } } static void interruptCallbackEnumMbbi(void *drvPvt, asynUser *pasynUser, @@ -556,20 +605,21 @@ static void interruptCallbackEnumBo(void *drvPvt, asynUser *pasynUser, static int getCallbackValue(devPvt *pPvt) { int ret = 0; + static const char *functionName="getCallbackValue"; epicsMutexLock(pPvt->ringBufferLock); if (pPvt->ringTail != pPvt->ringHead) { if (pPvt->ringBufferOverflows > 0) { asynPrint(pPvt->pasynUser, ASYN_TRACE_WARNING, - "%s devAsynInt32 getCallbackValue warning, %d ring buffer overflows\n", - pPvt->pr->name, pPvt->ringBufferOverflows); + "%s %s::%s warning, %d ring buffer overflows\n", + pPvt->pr->name, driverName, functionName, pPvt->ringBufferOverflows); pPvt->ringBufferOverflows = 0; } pPvt->result = pPvt->ringBuffer[pPvt->ringTail]; pPvt->ringTail = (pPvt->ringTail==pPvt->ringSize) ? 0 : pPvt->ringTail+1; asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, - "%s devAsynInt32::getCallbackValue from ringBuffer value=%d\n", - pPvt->pr->name,pPvt->result.value); + "%s %s::%s from ringBuffer value=%d\n", + pPvt->pr->name, driverName, functionName,pPvt->result.value); ret = 1; } epicsMutexUnlock(pPvt->ringBufferLock); @@ -589,17 +639,19 @@ static int computeShift(epicsUInt32 mask) static void reportQueueRequestStatus(devPvt *pPvt, asynStatus status) { + static const char *functionName="reportQueueRequestStatus"; + if (status != asynSuccess) pPvt->result.status = status; if (pPvt->previousQueueRequestStatus != status) { pPvt->previousQueueRequestStatus = status; if (status == asynSuccess) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynUInt32Digital queueRequest status returned to normal\n", - pPvt->pr->name); + "%s %s::%s queueRequest status returned to normal\n", + pPvt->pr->name, driverName, functionName); } else { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, - "%s devAsynUInt32Digital queueRequest %s\n", - pPvt->pr->name,pPvt->pasynUser->errorMessage); + "%s %s::%s queueRequest error %s\n", + pPvt->pr->name, driverName, functionName,pPvt->pasynUser->errorMessage); } } } @@ -674,7 +726,7 @@ static long processBo(boRecord *pr) devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; - if(getCallbackValue(pPvt)) { + if(pPvt->newOutputCallbackValue && getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { pr->rval = pPvt->result.value & pr->mask; @@ -693,6 +745,11 @@ static long processBo(boRecord *pr) WRITE_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); + if (pPvt->numDeferredOutputCallbacks > 0) { + callbackRequest(&pPvt->outputCallback); + pPvt->numDeferredOutputCallbacks--; + } + pPvt->newOutputCallbackValue = 0; if(pPvt->result.status == asynSuccess) { return 0; } @@ -767,7 +824,7 @@ static long processLo(longoutRecord *pr) devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; - if(getCallbackValue(pPvt)) { + if(pPvt->newOutputCallbackValue && getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { pr->val = pPvt->result.value & pPvt->mask; @@ -785,6 +842,11 @@ static long processLo(longoutRecord *pr) WRITE_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); + if (pPvt->numDeferredOutputCallbacks > 0) { + callbackRequest(&pPvt->outputCallback); + pPvt->numDeferredOutputCallbacks--; + } + pPvt->newOutputCallbackValue = 0; if(pPvt->result.status == asynSuccess) { return 0; } @@ -863,7 +925,7 @@ static long processMbbo(mbboRecord *pr) devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; - if (getCallbackValue(pPvt)) { + if (pPvt->newOutputCallbackValue && getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { unsigned long rval = pPvt->result.value & pr->mask; @@ -899,6 +961,11 @@ static long processMbbo(mbboRecord *pr) WRITE_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); + if (pPvt->numDeferredOutputCallbacks > 0) { + callbackRequest(&pPvt->outputCallback); + pPvt->numDeferredOutputCallbacks--; + } + pPvt->newOutputCallbackValue = 0; if(pPvt->result.status == asynSuccess) { return 0; } @@ -988,7 +1055,7 @@ static long processMbboDirect(mbboDirectRecord *pr) devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; - if (getCallbackValue(pPvt)) { + if (pPvt->newOutputCallbackValue && getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { epicsUInt32 rval = pPvt->result.value & pr->mask; @@ -1017,6 +1084,11 @@ static long processMbboDirect(mbboDirectRecord *pr) WRITE_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); + if (pPvt->numDeferredOutputCallbacks > 0) { + callbackRequest(&pPvt->outputCallback); + pPvt->numDeferredOutputCallbacks--; + } + pPvt->newOutputCallbackValue = 0; if(pPvt->result.status == asynSuccess) { return 0; } diff --git a/asyn/drvAsynSerial/drvAsynIPServerPort.c b/asyn/drvAsynSerial/drvAsynIPServerPort.c index be42385..633607e 100644 --- a/asyn/drvAsynSerial/drvAsynIPServerPort.c +++ b/asyn/drvAsynSerial/drvAsynIPServerPort.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -57,7 +58,6 @@ typedef struct { char *portName; char *serverInfo; int maxClients; - int numClients; int socketType; int priority; int noAutoConnect; @@ -88,7 +88,7 @@ static void connectionListener(void *drvPvt); static void report(void *drvPvt, FILE *fp, int details); static asynStatus connectIt(void *drvPvt, asynUser *pasynUser); static asynStatus disconnect(void *drvPvt, asynUser *pasynUser); -static void ttyCleanup(ttyController_t *tty); +static void ttyCleanup(void *tty); int drvAsynIPServerPortConfigure(const char *portName, const char *serverInfo, unsigned int maxClients, @@ -155,7 +155,7 @@ static void closeConnection(asynUser *pasynUser, ttyController_t *tty) asynPrint(pasynUser, ASYN_TRACE_FLOW, "drvAsynIPServerPort: close %s connection on port %d.\n", tty->portName, tty->portNumber); epicsSocketDestroy(tty->fd); - tty->fd = -1; + tty->fd = INVALID_SOCKET; pasynManager->exceptionDisconnect(pasynUser); } } @@ -257,15 +257,22 @@ static asynStatus writeIt(void *drvPvt, asynUser *pasynUser, static void report(void *drvPvt, FILE *fp, int details) { ttyController_t *tty = (ttyController_t *)drvPvt; + portList_t *pl; + int connected; + int i; assert(tty); fprintf(fp, "Port %s: %sonnected\n", tty->portName, tty->fd >= 0 ? "C" : "Disc"); if (details >= 1) { - fprintf(fp, " fd: %d\n", tty->fd); - fprintf(fp, " Max. clients: %d\n", tty->maxClients); - fprintf(fp, " Num. clients: %d\n", tty->numClients); + fprintf(fp, " fd: %d\n", tty->fd); + fprintf(fp, " Max. clients: %d\n", tty->maxClients); + for (i=0; imaxClients; i++) { + pl = &tty->portList[i]; + pasynManager->isConnected(pl->pasynUser, &connected); + fprintf(fp, " Client %d name:%s fd: %d connected:%d\n", i, pl->portName, pl->fd, connected); + } } } @@ -283,7 +290,6 @@ static void connectionListener(void *drvPvt) interruptNode *pnode; asynOctetInterrupt *pinterrupt; asynUser *pasynUser; - int len; asynStatus status; int i; portList_t *pl, *p; @@ -326,21 +332,9 @@ static void connectionListener(void *drvPvt) tty->fd, strerror(errno)); continue; } - - /* See if any clients have registered for callbacks. If not, close the connection */ - pasynManager->interruptStart(tty->octetCallbackPvt, &pclientList); - pnode = (interruptNode *) ellFirst(pclientList); - pasynManager->interruptEnd(tty->octetCallbackPvt); - if (!pnode) { - /* There are no registered clients to handle connections on this port */ - epicsSocketDestroy(clientFd); - asynPrint(pasynUser, ASYN_TRACE_ERROR, - "drvAsynIPServerPort: no registered clients to handle connections %s\n", tty->serverInfo); - continue; - } - /* Search for a port we have already created which is now disconnected */ + /* Search for a port which is disconnected */ pl = NULL; - for (i = 0, p = &tty->portList[0]; i < tty->numClients; i++, p++) { + for (i = 0, p = &tty->portList[0]; i < tty->maxClients; i++, p++) { pasynManager->isConnected(p->pasynUser, &connected); if (!connected) { pl = p; @@ -348,42 +342,14 @@ static void connectionListener(void *drvPvt) } } if (pl == NULL) { - /* Have we exceeded maxClients? */ - if (tty->numClients >= tty->maxClients) { - asynPrint(pasynUser, ASYN_TRACE_ERROR, - "drvAsynIPServerPort: %s: too many clients\n", tty->portName); - epicsSocketDestroy(clientFd); - continue; - } - /* Create a new asyn port with a unique name */ - len = (int)strlen(tty->portName) + 10; /* Room for port name + ":" + numClients */ - pl = &tty->portList[tty->numClients]; - pl->portName = callocMustSucceed(1, len, "drvAsynIPServerPort:connectionListener"); - pl->fd = clientFd; - tty->numClients++; - epicsSnprintf(pl->portName, len, "%s:%d", tty->portName, tty->numClients); - /* Must create port with noAutoConnect, we manually connect with the file descriptor */ - status = drvAsynIPPortConfigure(pl->portName, - tty->serverInfo, - tty->priority, - 1, /* noAutoConnect */ - tty->noProcessEos); - if (status) { - asynPrint(pasynUser, ASYN_TRACE_ERROR, - "drvAsynIPServerPort: unable to create port %s\n", pl->portName); - continue; - } - status = pasynCommonSyncIO->connect(pl->portName, -1, &pl->pasynUser, NULL); - if (status != asynSuccess) { - asynPrint(pasynUser, ASYN_TRACE_ERROR, - "%s drvAsynIPServerPort: error calling " - "pasynCommonSyncIO->connect %s\n", - pl->portName, pl->pasynUser->errorMessage); - continue; - } + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "drvAsynIPServerPort: %s: too many clients\n", tty->portName); + epicsSocketDestroy(clientFd); + continue; } /* Set the existing port to use the new file descriptor */ pl->pasynUser->reason = clientFd; + pl->fd = clientFd; status = pasynCommonSyncIO->connectDevice(pl->pasynUser); if (status != asynSuccess) { asynPrint(pasynUser, ASYN_TRACE_ERROR, @@ -415,11 +381,12 @@ static void connectionListener(void *drvPvt) int createServerSocket(ttyController_t *tty) { int i; struct sockaddr_in serverAddr; + int oneVal=1; assert(tty); /* * Create the socket */ - if (tty->fd == -1) { + if (tty->fd == INVALID_SOCKET) { if ((tty->fd = (int)epicsSocketCreate(PF_INET, tty->socketType, 0)) < 0) { printf("Can't create socket: %s", strerror(SOCKERRNO)); return -1; @@ -433,11 +400,16 @@ int createServerSocket(ttyController_t *tty) { /* For Port reuse, multiple IOCs */ epicsSocketEnableAddressUseForDatagramFanout(tty->fd); } - + if (setsockopt(tty->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&oneVal, sizeof(int))) { + printf("Error calling setsockopt %s: %s\n", tty->serverInfo, strerror(errno)); + epicsSocketDestroy(tty->fd); + tty->fd = INVALID_SOCKET; + return -1; + } if (bind(tty->fd, (struct sockaddr *) &serverAddr, sizeof (serverAddr)) < 0) { printf("Error in binding %s: %s\n", tty->serverInfo, strerror(errno)); epicsSocketDestroy(tty->fd); - tty->fd = -1; + tty->fd = INVALID_SOCKET; return -1; } @@ -450,7 +422,7 @@ int createServerSocket(ttyController_t *tty) { printf("Error calling listen() on %s: %s\n", tty->serverInfo, strerror(errno)); epicsSocketDestroy(tty->fd); - tty->fd = -1; + tty->fd = INVALID_SOCKET; return -1; } } else { @@ -497,14 +469,17 @@ static asynStatus disconnect(void *drvPvt, asynUser *pasynUser) /* * Clean up a ttyController */ -static void ttyCleanup(ttyController_t *tty) +static void ttyCleanup(void *pPvt) { - if (tty) { - if (tty->fd >= 0) - epicsSocketDestroy(tty->fd); - free(tty->portName); - free(tty); + ttyController_t *tty = (ttyController_t*) pPvt; + + if (!tty) return; + if (tty->fd >= 0) { + asynPrint(tty->pasynUser, ASYN_TRACE_FLOW, "drvAsynIPServerPort:ttyCleanup %s: shutdown socket %d\n", tty->portName, tty->fd); + epicsSocketDestroy(tty->fd); } + free(tty->portName); + free(tty); } /* @@ -518,6 +493,9 @@ int drvAsynIPServerPortConfigure(const char *portName, int noProcessEos) { ttyController_t *tty; asynStatus status; + int i; + int len; + portList_t *pl; char protocol[6]; char *cp; @@ -550,7 +528,7 @@ int drvAsynIPServerPortConfigure(const char *portName, */ tty = (ttyController_t *) callocMustSucceed(1, sizeof (ttyController_t), "drvAsynIPServerPortConfigure()"); - tty->fd = -1; + tty->fd = INVALID_SOCKET; tty->maxClients = maxClients; tty->portName = epicsStrDup(portName); tty->serverInfo = epicsStrDup(serverInfo); @@ -664,12 +642,46 @@ int drvAsynIPServerPortConfigure(const char *portName, return -1; } + /* Create drvAsynIPPort drivers for maxClients ports */ + for (i=0; imaxClients; i++) { + /* Create a new asyn port with a unique name */ + len = (int)strlen(tty->portName) + 10; /* Room for port name + ":" + i */ + pl = &tty->portList[i]; + pl->portName = callocMustSucceed(1, len, "drvAsynIPServerPortConfigure"); + pl->fd = INVALID_SOCKET; + epicsSnprintf(pl->portName, len, "%s:%d", tty->portName, i); + /* Must create port with noAutoConnect, we manually connect with the file descriptor */ + status = drvAsynIPPortConfigure(pl->portName, + tty->serverInfo, + tty->priority, + 1, /* noAutoConnect */ + tty->noProcessEos); + if (status) { + asynPrint(tty->pasynUser, ASYN_TRACE_ERROR, + "drvAsynIPServerPort: unable to create port %s\n", pl->portName); + continue; + } + status = pasynCommonSyncIO->connect(pl->portName, -1, &pl->pasynUser, NULL); + if (status != asynSuccess) { + asynPrint(tty->pasynUser, ASYN_TRACE_ERROR, + "%s drvAsynIPServerPort: error calling " + "pasynCommonSyncIO->connect %s\n", + pl->portName, pl->pasynUser->errorMessage); + continue; + } + } + /* Start a thread listening on this port */ epicsThreadCreate(tty->portName, epicsThreadPriorityLow, epicsThreadGetStackSize(epicsThreadStackSmall), (EPICSTHREADFUNC) connectionListener, tty); + /* + * Register for socket cleanup + */ + epicsAtExit(ttyCleanup, tty); + return 0; } diff --git a/asyn/vxi11/drvVxi11.c b/asyn/vxi11/drvVxi11.c index 1339d4f..28a0200 100644 --- a/asyn/vxi11/drvVxi11.c +++ b/asyn/vxi11/drvVxi11.c @@ -20,6 +20,7 @@ #include #include #include +#include /* epics includes */ #include @@ -67,6 +68,18 @@ typedef struct linkPrimary { devLink primary; devLink secondary[NUM_GPIB_ADDRESSES]; }linkPrimary; +typedef enum vxiConnectStatus { + vxiConnectSuccess, + vxiConnectDevice, + vxiConnectAlreadyConnected, + vxiConnectInitRpc, + vxiConnectResolveName, + vxiConnectClientCreate, + vxiConnectReadBusAddress, + vxiConnectReadSystemController, + vxiConnectReadControllerInCharge, + vxiConnectNotController +} vxiConnectStatus; /****************************************************************************** * This structure is used to hold the hardware-specific information for a * single GPIB link. There is one for each gateway. @@ -100,6 +113,7 @@ typedef struct vxiPort { char *srqThreadName; epicsInterruptibleSyscallContext *srqInterrupt; int srqEnabled; + vxiConnectStatus previousConnectStatus; }vxiPort; /* Local routines */ @@ -457,7 +471,7 @@ static int vxiWriteCmd(vxiPort * pvxiPort,asynUser *pasynUser, /****************************************************************************** * Check the bus status. Parameter can be a number from 1 to 8 to - * indicate the information requested (see VXI_BSTAT_XXXX in drvLanGpib.h) + * indicate the information requested (see VXI_BSTAT_XXXX in vxi11.h) * or it can be 0 meaning all (exept the bus address) which will then be * combined into a bitfield according to the bit numbers+1 (1 corresponds to * bit 0, etc.). @@ -848,6 +862,18 @@ static void vxiSrqThread(void *arg) epicsEventSignal(pvxiPort->srqThreadDone); } +static void reportConnectStatus(vxiPort *pvxiPort, vxiConnectStatus status, const char* fmt, ...) +{ + va_list args; + + if (pvxiPort->previousConnectStatus != status) { + pvxiPort->previousConnectStatus = status; + va_start(args, fmt); + pasynTrace->vprint(pvxiPort->pasynUser, ASYN_TRACE_ERROR, fmt, args); + va_end(args); + } +} + static asynStatus vxiConnectPort(vxiPort *pvxiPort,asynUser *pasynUser) { int isController; @@ -864,21 +890,20 @@ static asynStatus vxiConnectPort(vxiPort *pvxiPort,asynUser *pasynUser) pvxiPort->pasynUser = pasynManager->createAsynUser(0,0); pvxiPort->pasynUser->timeout = pvxiPort->defTimeout; status = pasynManager->connectDevice( - pvxiPort->pasynUser,pvxiPort->portName,-1); - if (status!=asynSuccess) - asynPrint(pasynUser, ASYN_TRACE_ERROR, - "vxiConnectPort: connectDevice failed %s\n",pvxiPort->pasynUser->errorMessage); + pvxiPort->pasynUser, pvxiPort->portName,-1); + reportConnectStatus(pvxiPort, vxiConnectDevice, + "vxiConnectPort: connectDevice failed %s\n", pvxiPort->pasynUser->errorMessage); } if(pvxiPort->server.connected) { - asynPrint(pasynUser,ASYN_TRACE_ERROR, - "%s vxiConnectPort but already connected\n",pvxiPort->portName); + reportConnectStatus(pvxiPort, vxiConnectAlreadyConnected, + "%s vxiConnectPort but already connected\n", pvxiPort->portName); return asynError; } asynPrint(pasynUser,ASYN_TRACE_FLOW, "%s vxiConnectPort\n",pvxiPort->portName); if(!pvxiPort->rpcTaskInitCalled) { if(rpcTaskInit() == -1) { - asynPrint(pasynUser,ASYN_TRACE_ERROR, + reportConnectStatus(pvxiPort, vxiConnectInitRpc, "%s Can't init RPC\n",pvxiPort->portName); return asynError; } @@ -894,14 +919,16 @@ static asynStatus vxiConnectPort(vxiPort *pvxiPort,asynUser *pasynUser) vxiServer.sin_family = AF_INET; vxiServer.sin_port = htons(0); if (hostToIPAddr(pvxiPort->hostName, &vxiServer.sin_addr) < 0) { - asynPrint(pasynUser,ASYN_TRACE_ERROR,"%s can't get IP address of %s\n", - pvxiPort->portName, pvxiPort->hostName); + reportConnectStatus(pvxiPort, vxiConnectResolveName, + "%s can't get IP address of %s\n", + pvxiPort->portName, pvxiPort->hostName); return asynError; } pvxiPort->rpcClient = clnttcp_create(&vxiServer, DEVICE_CORE, DEVICE_CORE_VERSION, &sock, 0, 0); if(!pvxiPort->rpcClient) { - asynPrint(pasynUser,ASYN_TRACE_ERROR,"%s vxiConnectPort error %s\n", + reportConnectStatus(pvxiPort, vxiConnectClientCreate, + "%s vxiConnectPort error %s\n", pvxiPort->portName, clnt_spcreateerror(pvxiPort->hostName)); return asynError; } @@ -916,8 +943,8 @@ static asynStatus vxiConnectPort(vxiPort *pvxiPort,asynUser *pasynUser) status = vxiBusStatus(pvxiPort, VXI_BSTAT_BUS_ADDRESS,pvxiPort->defTimeout,&pvxiPort->ctrlAddr); if(status!=asynSuccess) { - asynPrint(pasynUser,ASYN_TRACE_ERROR, - "%s vxiConnectPort cannot read bus status initialization aborted\n", + reportConnectStatus(pvxiPort, vxiConnectReadBusAddress, + "%s vxiConnectPort cannot read bus status initialization aborted\n", pvxiPort->portName); if (pvxiPort->server.connected) vxiDisconnectPort(pvxiPort); @@ -930,7 +957,7 @@ static asynStatus vxiConnectPort(vxiPort *pvxiPort,asynUser *pasynUser) status = vxiBusStatus(pvxiPort, VXI_BSTAT_SYSTEM_CONTROLLER, pvxiPort->defTimeout,&isController); if(status!=asynSuccess) { - asynPrint(pasynUser,ASYN_TRACE_ERROR, + reportConnectStatus(pvxiPort, vxiConnectReadSystemController, "%s vxiConnectPort vxiBusStatus error initialization aborted\n", pvxiPort->portName); if (pvxiPort->server.connected) @@ -941,7 +968,7 @@ static asynStatus vxiConnectPort(vxiPort *pvxiPort,asynUser *pasynUser) status = vxiBusStatus(pvxiPort, VXI_BSTAT_CONTROLLER_IN_CHARGE, pvxiPort->defTimeout,&isController); if(status!=asynSuccess) { - asynPrint(pasynUser,ASYN_TRACE_ERROR, + reportConnectStatus(pvxiPort, vxiConnectReadControllerInCharge, "%s vxiConnectPort vxiBusStatus error initialization aborted\n", pvxiPort->portName); if (pvxiPort->server.connected) @@ -949,7 +976,7 @@ static asynStatus vxiConnectPort(vxiPort *pvxiPort,asynUser *pasynUser) return asynError; } if(isController == 0) { - asynPrint(pasynUser,ASYN_TRACE_ERROR, + reportConnectStatus(pvxiPort, vxiConnectNotController, "%s vxiConnectPort neither system controller nor " "controller in charge -- initialization aborted\n", pvxiPort->portName); @@ -961,6 +988,8 @@ static asynStatus vxiConnectPort(vxiPort *pvxiPort,asynUser *pasynUser) } if (pvxiPort->hasSRQ) vxiCreateIrqChannel(pvxiPort,pasynUser); pasynManager->exceptionConnect(pvxiPort->pasynUser); + reportConnectStatus(pvxiPort, vxiConnectSuccess, + "%s is now connected\n", pvxiPort->portName); return asynSuccess; } @@ -1728,6 +1757,7 @@ int vxi11Configure(char *dn, char *hostName, int flags, printf("registerPort failed\n"); return 0; } + pvxiPort->previousConnectStatus = vxiConnectSuccess; /* pvxiPort->pasynUser may have been created already by a connection callback to vxiConnectPort */ if (!pvxiPort->pasynUser) { pvxiPort->pasynUser = pasynManager->createAsynUser(0,0); diff --git a/configure/RELEASE b/configure/RELEASE index 76a87f4..b206bff 100644 --- a/configure/RELEASE +++ b/configure/RELEASE @@ -8,8 +8,8 @@ SUPPORT=/corvette/home/epics/devel IPAC=$(SUPPORT)/ipac-2-14 # SEQ is required for testIPServer -SNCSEQ=$(SUPPORT)/seq-2-2-4 +SNCSEQ=$(SUPPORT)/seq-2-2-5 # EPICS_BASE 3.14.6 or later is required -EPICS_BASE=/corvette/usr/local/epics-devel/base-3.15.5 +EPICS_BASE=/corvette/usr/local/epics-devel/base-7.0.1 -include $(TOP)/../configure/EPICS_BASE.$(EPICS_HOST_ARCH) diff --git a/debian/changelog b/debian/changelog index 0ab96f4..73c6a03 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,16 @@ +asyn (4.33-2) unstable; urgency=medium + + * Add patch that fixes uninitialized variable + + -- Martin Konrad Wed, 07 Feb 2018 18:38:47 -0500 + +asyn (4.33-1) unstable; urgency=medium + + * New upstream version 4.33 + * Bump up library version to 4.33 + + -- Martin Konrad Wed, 07 Feb 2018 16:53:58 -0500 + asyn (4.32-1) unstable; urgency=medium * New upstream version 4.32 diff --git a/debian/control b/debian/control index 43c3f10..62a5e07 100644 --- a/debian/control +++ b/debian/control @@ -17,7 +17,7 @@ Vcs-Browser: https://github.com/epicsdeb/asyn Package: epics-asyn-dev Architecture: any -Depends: libasyn4.32 (= ${binary:Version}), +Depends: libasyn4.33 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, ${epics:Depends}, Conflicts: epics-synapps, epics-synapps-dev, @@ -30,7 +30,7 @@ Description: Facility for interfacing to low level communication drivers . This package contains headers and libraries needed at build time. -Package: libasyn4.32 +Package: libasyn4.33 Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, Description: Facility for interfacing to low level communication drivers diff --git a/debian/patches/0001-configure-RELEASE.patch b/debian/patches/0001-configure-RELEASE.patch index 1858730..16dcaac 100644 --- a/debian/patches/0001-configure-RELEASE.patch +++ b/debian/patches/0001-configure-RELEASE.patch @@ -7,7 +7,7 @@ Subject: configure/RELEASE 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/configure/RELEASE b/configure/RELEASE -index 76a87f4..c8858f8 100644 +index b206bff..c8858f8 100644 --- a/configure/RELEASE +++ b/configure/RELEASE @@ -1,15 +1,13 @@ @@ -23,10 +23,10 @@ index 76a87f4..c8858f8 100644 +#IPAC=$(EPICS_BASE) # SEQ is required for testIPServer --SNCSEQ=$(SUPPORT)/seq-2-2-4 +-SNCSEQ=$(SUPPORT)/seq-2-2-5 +#SNCSEQ=$(EPICS_BASE) # EPICS_BASE 3.14.6 or later is required --EPICS_BASE=/corvette/usr/local/epics-devel/base-3.15.5 +-EPICS_BASE=/corvette/usr/local/epics-devel/base-7.0.1 --include $(TOP)/../configure/EPICS_BASE.$(EPICS_HOST_ARCH) +EPICS_BASE=/usr/lib/epics diff --git a/debian/patches/0002-prevent-generated-docs-from-being-cleaned.patch b/debian/patches/0002-prevent-generated-docs-from-being-cleaned.patch index e26aaa2..d1c3a48 100644 --- a/debian/patches/0002-prevent-generated-docs-from-being-cleaned.patch +++ b/debian/patches/0002-prevent-generated-docs-from-being-cleaned.patch @@ -7,10 +7,10 @@ Subject: prevent generated docs from being cleaned 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile -index 5bf9e4e..40b8b90 100644 +index 1ee8bf4..f2bbc8c 100644 --- a/Makefile +++ b/Makefile -@@ -58,3 +58,5 @@ DIRS += testAsynPortClientApp +@@ -61,3 +61,5 @@ DIRS += testAsynPortClientApp testAsynPortClientApp_DEPEND_DIRS = asyn include $(TOP)/configure/RULES_TOP diff --git a/debian/patches/0003-Don-t-build-test.patch b/debian/patches/0003-Don-t-build-test.patch index 9966e24..749bae9 100644 --- a/debian/patches/0003-Don-t-build-test.patch +++ b/debian/patches/0003-Don-t-build-test.patch @@ -10,10 +10,10 @@ to build. 1 file changed, 48 deletions(-) diff --git a/Makefile b/Makefile -index 40b8b90..290eaab 100644 +index f2bbc8c..f2dff97 100644 --- a/Makefile +++ b/Makefile -@@ -9,54 +9,6 @@ asyn_DEPEND_DIRS = configure +@@ -9,57 +9,9 @@ asyn_DEPEND_DIRS = configure DIRS += asyn/asynPortDriver/unittest asyn/asynPortDriver/unittest_DEPEND_DIRS = asyn @@ -56,6 +56,9 @@ index 40b8b90..290eaab 100644 - DIRS += testOutputReadbackApp - testOutputReadbackApp_DEPEND_DIRS = asyn - iocBoot_DEPEND_DIRS += testOutputReadbackApp + DIRS += testOutputCallbackApp + testOutputCallbackApp_DEPEND_DIRS = asyn + iocBoot_DEPEND_DIRS += testOutputCallbackApp - DIRS += testUsbtmcApp - testUsbtmcApp_DEPEND_DIRS = asyn - iocBoot_DEPEND_DIRS += testUsbtmcApp diff --git a/debian/patches/0005-Fix-uninitialized-value-in-paramVal.patch b/debian/patches/0005-Fix-uninitialized-value-in-paramVal.patch new file mode 100644 index 0000000..41a96ee --- /dev/null +++ b/debian/patches/0005-Fix-uninitialized-value-in-paramVal.patch @@ -0,0 +1,21 @@ +From: Martin Konrad +Date: Wed, 7 Feb 2018 10:49:28 -0500 +Subject: Fix uninitialized value in paramVal + +This fixes issue #70. +--- + asyn/asynPortDriver/paramVal.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/asyn/asynPortDriver/paramVal.cpp b/asyn/asynPortDriver/paramVal.cpp +index 10ec8b8..25312c9 100644 +--- a/asyn/asynPortDriver/paramVal.cpp ++++ b/asyn/asynPortDriver/paramVal.cpp +@@ -40,6 +40,7 @@ paramVal::paramVal(const char *name, asynParamType type): + type(type), status_(asynSuccess), alarmStatus_(0), alarmSeverity_(0), + valueDefined(false), valueChanged(false){ + this->name = epicsStrDup(name); ++ memset(&this->data, 0, sizeof(this->data)); + } + + paramVal::~paramVal(){ diff --git a/debian/patches/series b/debian/patches/series index 7b923d6..0458507 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -2,3 +2,4 @@ 0002-prevent-generated-docs-from-being-cleaned.patch 0003-Don-t-build-test.patch 0004-Enable-support-for-USB-test-and-measurement-TMC-devi.patch +0005-Fix-uninitialized-value-in-paramVal.patch diff --git a/documentation/Doxyfile b/documentation/Doxyfile index 9058b04..c781f9a 100755 --- a/documentation/Doxyfile +++ b/documentation/Doxyfile @@ -31,7 +31,7 @@ PROJECT_NAME = asyn # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = 4-32 +PROJECT_NUMBER = 4-33 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. diff --git a/documentation/KnownProblems.html b/documentation/KnownProblems.html old mode 100755 new mode 100644 diff --git a/documentation/README.md b/documentation/README.md new file mode 100644 index 0000000..30e75f5 --- /dev/null +++ b/documentation/README.md @@ -0,0 +1,5 @@ +# HTML documentation + +* [Home page](http://www.aps.anl.gov/epics/modules/soft/asyn/) +* [Documentation](http://htmlpreview.github.com/?https://github.com/epics-modules/asyn/blob/master/documentation/asynDriver.html) +* [Release notes](http://htmlpreview.github.com/?https://github.com/epics-modules/asyn/blob/master/documentation/RELEASE_NOTES.html) diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html old mode 100755 new mode 100644 index 521c15d..11808c6 --- a/documentation/RELEASE_NOTES.html +++ b/documentation/RELEASE_NOTES.html @@ -7,8 +7,143 @@

- asynDriver: Asynchronous Driver Support - Release Notes

+ asynDriver: Release Notes
+
+
+

+ Release 4-33

+

+ January 27, 2018

+
+

+ devAsynFloat64.c

+
    +
  • Added support for ASLO/AOFF scaling and SMOO value smoothing to the float64 device + support for ai and ao records. SMOO only applies to ai records. devAsynFloat64 directly + writes to the record's VAL/OVAL fields, so the conversion routines in the record + that use RVAL/VAL don't work.
  • +
+

+ devAsynInt32.c, devAsynUInt32Digital.c, devAsynFloat64.c, devAsynOctet.c

+
    +
  • Fixed a problem with output records that have the asyn:READBACK info tag, i.e. + output records that update on callbacks from the driver. Previously it did not correctly + distinguish between record processing due to a driver callback (in which case it + should not call the driver) and normal record processing (in which case the driver + should be called). A new test application, testOutputCallbackApp, was added to test + this. It allows testing all combinations of the following 6 settings for all 4 of + these device support files: +
      +
    1. Synchronous driver, i.e. ASYN_CANBLOCK not set.
    2. +
    3. Asynchronous driver, i.e. ASYN_CANBLOCK is set.
    4. +
    5. Driver callback is done in the write() operation.
    6. +
    7. Driver callback is done in a separate thread. The callbacks are triggered with + the TriggerCallbacks record.
    8. +
    9. Single callback is done in each operation.
    10. +
    11. Multiple callbacks are done in each operation. The NumCallbacks record selects + the number of callbacks.
    12. +
    + The callback values are the following. For the longout records (asynInt32 and asynUInt32Digital) + and the ao record (asynFloat64) the callback value is N+1 where N the current record + value. Thus if one writes 10 to the longout record and NumCallbacks is 5 it will + immediately do callbacks with the values 11, 12, 13, 14, 15. For the bo record the + value toggles between 0 and 1 for each callback. For the stringout record the value + is a string with the format "Value=N". N increments by 1 on each callback as for + the longout records. For each output record there is a corresponding input record + with SCAN=I/O Intr. If the test is working correctly the output records should always + have the same values as the input records.
  • +
+

+ devAsynOctet.c

+
    +
  • Fixed bug where the record alarm status was not set correctly if a write or read + failed with a synchronous driver.
  • +
+

+ asynManager.c

+
    +
  • Improved error messages from autoconnect attempts. Messages are now printed only + when the autoconnect status changes, rather than each time there is a failure. Thanks + to Ben Franksen for this.
  • +
+

+ drvAsynIPServerPort.c

+
    +
  • Changed the logic so it creates maxClients drvAsynIPPort drivers at initialization + rather than on-demand when clients connect. This makes it possible to use these + ports before iocInit, which is much more useful. They can be used in input and output + links in EPICS records, for example. This change should be backwards compatible, + since it was transparent when the ports were created.
  • +
  • The first drvAsynIPPort created is now named PORT_NAME:0 rather than PORT_NAME:1, + where PORT_NAME is the name of the drvAsynIPServer port created by this driver. + This might break backwards compatibility, but clients were normally getting the + name from a callback, so probably not.
  • +
  • Set the socket option SO_REUSEADDR when creating the listening socket. Previously + if a client was connected and the IOC exited it could not be restarted again immediately. + One needed to wait for the operating system to time out the connection. This change + allows the IOC to be run again with the same listening port immediately, without + waiting for the operating system timeout.
  • +
  • Added an exit handler to close the listen socket and delete the private structure. +
  • +
  • Improved the report() function so it shows all the drvAsynIPPort drivers that + were created.
  • +
+

+ testIPServerApp

+
    +
  • Added a new datbase testIPServer1.db for testing the enhancements to drvAsynIPServerPort. + It contains a stringin record and a stringout record that use the drvAsynIPPort + created by drvAsynIPServerPort.
  • +
  • Added a new startup script, iocBoot/ioctestIPServer/st.cmd.testIPServer1 which + creates a drvAsynIPServerPort called P5001 on localhost:5001. It loads the testIPServer1.db + database connected to the drvAsynIPPort created by P5001, called P5001:0. One can + telnet to port 5001 on the IOC computer. All text typed in the telnet session will + go into the stringin record. Text written to the stringout record will appear in + the telnet session.
  • +
+

+ drvVXI11.c

+
    +
  • Improved error messages from connection attempts. Messages are now printed only + when the connection status changes, rather than each time there is a connection + failure. Thanks to Ben Franksen for this.
  • +
+

+ testErrorsApp

+
    +
  • Previously the user-defined alarm status and severity were only set on callbacks, + i.e. input records with SCAN=I/O Intr and output records with info tag asyn:READBACK=1. + Now all calls to the read() and write() methods in each interface also return the + user-defined alarm status and severity in pasynUser.
  • +
+

+ asynPortClient

+
    +
  • Fixed typo in constructor for asynUInt32DigitalClient, it was calling asynInt32SyncIO->connect + rather than asynUInt32DigitalClient->connect.
  • +
+

+ OPI screens

+
    +
  • Added new opi/Makefile. This automatically converts all opi/medm/*.adl files into + corresponding files in edm/autoconvert, caqtdm/autoconvert, and boy/autoconvert. + It uses new RULES_OPI and CONFIG_SITE.linux-x86_64 files in synApps/support/configure + directory. The upper-level edm, caqtdm, and boy directories should be used only + for manually tweaked files.
  • +
  • The medm adl files were improved to make the autoconverted files work better. + The size of text graphics and text update widgets were set to the actual text size, + and text update widgets were set to the correct datatype, e.g. string type for enum + PVs.
  • +
+

+ Documentation

+
    +
  • asynDriver.html has been improved. All level 3 headings are now links in the Contents + at the start of the file. This makes it much easier to find a particular topic and + jump to it quickly. Many of the test applications are now documented, including + medm screen shots to show how they work.
  • +

diff --git a/documentation/asynDriver.html b/documentation/asynDriver.html old mode 100755 new mode 100644 index e4629d9..2c9c26a --- a/documentation/asynDriver.html +++ b/documentation/asynDriver.html @@ -4,90 +4,202 @@ asynDriver +

- asynDriver: Asynchronous Driver Support

+ asynDriver: EPICS Driver Support

- Release 4-32

+ Release 4-33

Mark Rivers, Eric Norum, and Marty Kraimer

- September 14, 2017

-

+ January 27, 2018

+

Other Contributers

Gasper Jansa (cosyLab) - linuxGpib support.


-
-

- License Agreement

-
+

+ License Agreement

This product is available via the open source license described at the end of this document.


-
-

- Contents

-
- +

+ Contents

+
-
-

- Purpose

-
+

+ Purpose

asynDriver is a general purpose facility for interfacing device specific code to low level drivers. asynDriver allows non-blocking device support that works @@ -158,10 +270,8 @@


-
-

- Status

-
+

+ Status

This version provides

    @@ -206,10 +316,8 @@

    original motivation for the development of asynPortDriver.


-
-

- Acknowledgments

-
+

+ Acknowledgments

The idea of creating asynDriver resulted from many years of experience with writing device support for serial and GPIB devices. The following individuals have been @@ -263,11 +371,9 @@

at difficult code!!!
-
-

- Overview of asynDriver

-
-

+

+ Overview of asynDriver

+

Definitions

asynDriver is a software layer between device specific code and drivers that communicate @@ -380,7 +486,7 @@

asynManager uses the Operating System Independent features of EPICS base. It is, however, independent of record/device support. Thus, it can be used by other code, e.g. a sequence program.

-

+

Standard Interfaces

These are interfaces provided by asynManager or interfaces implemented by all or @@ -410,7 +516,7 @@

asynDrvUser is an interface for communicating information from device support to a driver without the device support knowing any details about what is passed.

-

+

Generic Interfaces

In addition to asynCommon and optionally @@ -453,7 +559,7 @@

asynOption methods for device configuration using key/value pairs.

-

+

asynManager

asynManager is an interface and associated code. It is the "heart" of asynDriver @@ -663,7 +769,7 @@

exist above a single port,addr.

-

+

Multiple Device vs Single Device Port Drivers

When a low level driver calls registerPort, it declares if it handles multiple devices. @@ -683,7 +789,7 @@

access to the port prevents access to all addresses on the port.

-

+

Connection Management

asynManager keeps track of the following states:

@@ -712,7 +818,7 @@

Low level drivers must call pasynManager:exceptionConnect whenever they connect to a port or port,addr and exceptionDisconnect whenever they disconnect.

-

+

Protecting a Thread from Blocking

The methods asynManager:report and asynCommon:report can be called by any thread, @@ -726,7 +832,7 @@

Interface methods registerInterruptUser and cancelInterruptUser must never block. The registerInterruptUser callback must not block because it could be called by a non blocking driver.

-

+

portThread

If a driver calls asynManager:registerPort with the ASYN_CANBLOCK attributes bit @@ -768,11 +874,9 @@

The actual code is more complicated because it unlocks before it calls code outside asynManager. This means that the queues can be modified and exceptions may occur.


-
-

- Theory of Operation

-
-

+

+ Theory of Operation

+

Initialization

During initialization, port drivers register each communication port as well as @@ -806,7 +910,7 @@

calls findInterface to locate the interfaces with which it calls the driver. For example:

     pasynInterface = pasynManager->findInterface(pasynUser,asynOctetType,1);
-

+

Requesting access to a port

User code can request access to a port by two methods:

@@ -822,7 +926,7 @@

not block, e.g. synchronous device support for EPICS records.

-

+

queueRequest - Flow of Control

User code requests access to a port by calling:

@@ -890,10 +994,8 @@

device support, which returns to record support, which completes record processing.
-
-

- asynDriver Structures and Interfaces

-
+

+ asynDriver Structures and Interfaces

asynDriver.h describes the following:

    @@ -914,7 +1016,7 @@

  • asynTrace - An interface plus associated functions and definitions that implement the trace facility.
-

+

asynStatus

Defines the status returned by most methods. If a method returns a status other @@ -967,7 +1069,7 @@

-

+

asynException

Defines the exceptions for method exceptionOccurred

@@ -1030,7 +1132,7 @@

-

+

asynQueuePriority

This defines the priority passed to queueRequest.

@@ -1069,7 +1171,7 @@

-

+

asynUser

Describes a structure that user code passes to most asynManager and driver methods. @@ -1205,7 +1307,7 @@

-

+

asynInterface

This defines an interface registered with asynPortManager:registerPort or asynManager:interposeInterface.

@@ -1239,7 +1341,7 @@

-

+

asynManager

This is the main interface for communicating with asynDriver.

@@ -1263,7 +1365,6 @@

ELLNODE node; void *drvPvt; }interruptNode; - typedef struct asynManager { void (*report)(FILE *fp,int details,const char*portName); asynUser *(*createAsynUser)(userCallback process,userCallback timeout); @@ -1793,7 +1894,7 @@

-

+

asynCommon

asynCommon describes the methods that must be implemented by drivers.

@@ -1833,7 +1934,7 @@

-

+

asynCommonSyncIO

asynCommonSyncIO provides a convenient interface for software that needs to perform @@ -1854,7 +1955,7 @@

names of this interface. For consistency with the other SyncIO interfaces, connect calls pasynManager->connectDevice, disconnect calls pasynManager->disconnect, connectDevice calls asynCommon->connect, and disconnectDevice calls asynCommon->disconnect.

-

+

asynDrvUser

asynDrvUser provides methods that allow an asynUser to communicate user specific @@ -1899,7 +2000,7 @@

-

+

asynLockPortNotify

This is provided for port drivers that are an asynUser of another port driver. For @@ -1943,7 +2044,7 @@

-

+

asynOption

asynOption provides a generic way of setting driver specific options. For example @@ -1974,7 +2075,7 @@

-

+

Trace Interface

/*asynTrace is implemented by asynManager*/
 /*All asynTrace methods can be called from any thread*/
@@ -2049,7 +2150,7 @@ 

}asynTrace; epicsShareExtern asynTrace *pasynTrace;

-

+

asynTrace

asynDriver provides a trace facility with the following attributes:

@@ -2286,10 +2387,8 @@


-
-

- Standard Message Based Interfaces

-
+

+ Standard Message Based Interfaces

These are interfaces for communicating with message based devices, where message based means that the device communicates via octet strings, i.e. arrays of 8 bit @@ -2298,7 +2397,7 @@

by port drivers that implement asynOctet. It's primary purpose is to help with interrupt support. asynOctetSyncIO provides a synchronous inteface to asynOctet and can be used by code that is willing to block.

-

+

asynOctet

asynOctet describes the methods implemented by drivers that use octet strings for @@ -2474,7 +2573,7 @@

-

+

asynOctetSyncIO

asynOctetSyncIO provides a convenient interface for software that needs to perform @@ -2622,7 +2721,7 @@

-

+

End of String Support

asynOctet provides methods for handling end of string (message) processing. It does @@ -2631,11 +2730,9 @@

will be followed for individual devices. The policy will be determined by the device, the device support, and the driver.


-
-

- Standard Register Based Interfaces

-
-

+

+ Standard Register Based Interfaces

+

Introduction

This section descibes interfaces for register based devices. Support is provided @@ -2684,7 +2781,7 @@

an example of how to provide support for interrupts.
  • asynInt32SyncIO - A synchronous interface to asynInt32
  • -

    +

    addr - What does it mean for register based interfaces?

    Low level register based drivers are normally multi-device. The meaning of addr @@ -2703,7 +2800,7 @@

    array element. For example a 128 bit digital I/O module appears as an array of four UInt32 registers. -

    +

    Example Drivers

    Two examples of drivers that might implement and use the interfaces are:

    @@ -2727,7 +2824,7 @@

    is a soft example of a driver that implements asynUInt32Digital.

    -

    +

    asynInt32

    asynInt32 describes the methods implemented by drivers that use integers for communicating @@ -2869,7 +2966,7 @@

    -

    +

    asynInt32SyncIO

    asynInt32SyncIO describes a synchronous interface to asynInt32. The code that calls @@ -2948,7 +3045,7 @@

    -

    +

    asynUInt32Digital

    asynUInt32Digital describes the methods for communicating via bits of an Int32 register.

    @@ -3122,7 +3219,7 @@

    -

    +

    asynUInt32DigitalSyncIO

    asynUInt32DigitalSyncIO describes a synchronous interrace to asynUInt32Digital. @@ -3217,7 +3314,7 @@

    -

    +

    asynFloat64

    asynFloat64 describes the methods for communicating via IEEE double precision float @@ -3334,7 +3431,7 @@

    -

    +

    asynFloat64SyncIO

    asynFloat64SyncIO describes a synchronous interrace to asynFloat64. The code that @@ -3396,8 +3493,8 @@

    -

    - asynXXXArray (where XXX is Int8, Int16, Int32, Float32 or Float64)

    +

    + asynXXXArray (XXX=Int8, Int16, Int32, Float32 or Float64)

    asynXXXArray describes the methods for communicating via 8, 16, or 32-bit integers, or 32 or 64-bit IEEE float values.

    @@ -3519,7 +3616,7 @@

    -

    +

    asynXXXArraySyncIO

    asynXXXArraySyncIO describes a synchronous interface to asynXXXArray. The code that @@ -3587,7 +3684,7 @@

    -

    +

    asynEnum

    asynEnum describes the methods implemented by drivers to define the enum strings, @@ -3743,7 +3840,7 @@

    -

    +

    asynEnumSyncIO

    asynEnumSyncIO describes a synchronous interface to asynEnum. The code that calls @@ -3814,7 +3911,7 @@

    -

    +

    asynGenericPointer

    asynGenericPointer describes the methods for communicating via void* pointers. asyn @@ -3934,7 +4031,7 @@

    -

    +

    asynGenericPointerSyncIO

    asynGenericPointerSyncIO describes a synchronous interrace to asynGenericPointer. @@ -4012,10 +4109,8 @@

    -
    -

    - asynStandardInterfacesBase

    -
    +

    + asynStandardInterfacesBase

    asynStandardInterfacesBase is an interface designed as a convenience to minimize the amount of code that must be written in the initialization routine of a port @@ -4030,8 +4125,8 @@

    to register itself as an interrupt source on one or more of those interfaces. This can reduce the number of lines of code in the driver initialization routine by a factor of four or more.

    -

    - asynStandardInterfaces structure

    +

    + asynStandardInterfaces structure

    The following is the definition of the asynStandardInterfaces structure. Drivers will normally have a structure of this type contained in their drvPvt structure. @@ -4094,8 +4189,8 @@

    void *enumInterruptPvt; } asynStandardInterfaces; -

    - asynStandardInterfacesBase interface

    +

    + asynStandardInterfacesBase interface

    The following is the definition of the asynStandardInterfacesBase interface.

    typedef struct asynStandardInterfacesBase {
    @@ -4212,12 +4307,10 @@ 

    } ... }

    -
    -

    - Standard Interpose Interfaces

    -
    -

    - asynInterposeEos

    +

    + Standard Interpose Interfaces

    +

    + asynInterposeEos

    This can be used to simulate EOS processing for asynOctet if the port driver doesn't provide EOS support. If an EOS is specified it looks for the eos on each read. It @@ -4234,8 +4327,8 @@

    This command should appear immediately after the command that initializes a port Some drivers provide configuration options to call this automatically.

    -

    - asynInterposeFlush

    +

    + asynInterposeFlush

    This can be used to simulate flush processing for asynOctet if the port driver doesn't provide support for flush. It just reads and discards characters until no more characters @@ -4251,10 +4344,8 @@

    this command should appear immediately after the command that initializes a port


    -
    -

    - Generic Device Support for EPICS records

    -
    +

    + Generic Device Support for EPICS records

    Generic device support is provided for standard EPICS records. This support should be usable for a large class of low level register based drivers. For complicated @@ -4303,8 +4394,8 @@

    For example:

        field(DTYP,"asynInt32")
         field(INP,"@asyn(portA,0,.1)thisIsForDriver")
    -

    - asynManager interrupts and EPICS device support

    +

    + asynManager interrupts and EPICS device support

    All of the device support files can call registerInterruptUser for input records. The callback is used in one of two ways:

    @@ -4326,8 +4417,8 @@

    is used to append values to the time series.

    -

    - Initial values of output records

    +

    + Initial values of output records

    The device support for output records on register based interfaces (bo, mbbo, ao, longout) does an initial read() of the value from the driver in init_record. If @@ -4346,8 +4437,8 @@

    the record in the database contains the following line:
    info(asyn:INITIAL_READBACK, "1")
    .

    -

    - Enum values for bi, bo, mbbi, and mbbo records

    +

    + Enum values for bi, bo, mbbi, and mbbo records

    Beginning in asyn R4-19 support was added for asyn port drivers to control the values of the enum strings, enum values and enum severities in bi, bo, mbbi, and mbbo records. @@ -4367,8 +4458,8 @@

    clients like medm and edm will not change the enum widgets until the window is closed and reopened, but newer clients like CSS should dynamically change the enum widgets. -

    - Callback updates for output records

    +

    + Callback updates for output records

    Beginning in asyn R4-26 support was added for updating output records from driver interrupt callbacks. This feature allows output records to reflect changes in the @@ -4384,8 +4475,8 @@

    If the value of the info tag is 0 or if the info tag is not present then updates of output records on interrupt callbacks are disabled.

    -

    - Buffering of driver callbacks

    +

    + Buffering of driver callbacks

    It is possible for the time between driver callbacks to be less than the time for record processing. asyn device support provides a ring-buffer (FIFO) mechanism to @@ -4402,9 +4493,9 @@

    support for numeric arrays was added in asyn R4-25. asynOctet support for stringin, stringout, and waveform records was added in asyn R4-26.

    -

    +

    Time stamps -

    +

    Beginning in asyn R4-20 support was added for asyn port drivers to set the TIME field of input records. This is done by setting the TSE field of the record to "-2" @@ -4417,8 +4508,8 @@

    was also added for user-supplied timestamp source functions. Timestamp support was also added to asynPortDriver for the base-class read functions and callback functions.

    -

    - asynInt32 device support

    +

    + asynInt32 device support

    The following support is available:

    device(ai,INST_IO,asynAiInt32,"asynInt32")
    @@ -4574,8 +4665,8 @@ 

    field(TWST,"twoVal") field(THST,"threeVal") }

    -

    - asynIntXXXArray device support (XXX=8, 16 or 32)

    +

    + asynIntXXXArray device support (XXX=8, 16 or 32)

    The following support is available:

    device(waveform,INST_IO,asynIntXXXArrayWfIn,"asynIntXXXArrayIn")
    @@ -4584,8 +4675,8 @@ 

    devAsynIntXXXArray.c provides EPICS device support for drivers that implement interface asynIntXXXArray. It has support for both reading and writing a waveform. SCAN "I/O Intr" is supported similar to the aiRecord in devAsynInt32 device support.

    -

    - asynXXXTimeSeries device support (XXX=Int32 or Float64)

    +

    + asynXXXTimeSeries device support (XXX=Int32 or Float64)

    The following support is available:

    device(waveform,INST_IO,asynInt32TimeSeries,"asynInt32TimeSeries")
    @@ -4603,8 +4694,8 @@ 

  • RARM=3 Start acquisition (set BUSY=1) without clearing the waveform or setting NORD=0.
  • -

    - devAsynUInt32Digital

    +

    + asynUInt32Digital device support

    The following support is available:

    device(bi,INST_IO,asynBiUInt32Digital,"asynUInt32Digital")
    @@ -4733,8 +4824,8 @@ 

    field(SXVL,"0x6") field(SVVL,"0x7") }

    -

    - devAsynFloat64 device support

    +

    + asynFloat64 device support

    The following support is available:

    device(ai,INST_IO,asynAiFloat64,"asynFloat64")
    @@ -4746,7 +4837,9 @@ 

    • aiRecord

      - A value is given to val.

      + A value is given to val. Beginning with R4-33 scaling via the ASLO/AOFF record fields, + and smoothing via the SMOO field are supported. +

      • asynFloat64 - SCAN "I/O Intr" is supported. If the record is "I/O Intr" scanned then when the registerInterruptUser callback is called, it saves the value and calls @@ -4760,11 +4853,12 @@

      • aoRecord

        - val is written.

        + val is written. Beginning with R4-33 scaling via the ASLO/AOFF record fields is + supported.

      -

      - asynFloatXXXArray device support (where XXX=32 or 64)

      +

      + asynFloatXXXArray device support (XXX=32 or 64)

      The following support is available:

      device(waveform,INST_IO,asynFloatXXXArrayWfIn,"asynFloatXXXArrayIn")
      @@ -4773,8 +4867,8 @@ 

      devAsynFloatXXXArray.c provides EPICS device support for drivers that implement interface asynFloatXXXArray. It has support for both reading and writing a waveform. SCAN "I/O Intr" is supported similar to the aiRecord in devAsynInt32 device support.

      -

      - octet device support

      +

      + asynOctet device support

      The following support is available:

      device(stringin,INST_IO,asynSiOctetCmdResponse,"asynOctetCmdResponse")
      @@ -4827,8 +4921,8 @@ 

      asynDrvUser. When the record is processed a read request is made. The result is read into the record.

    -

    - Record alarms

    +

    + Record alarms

    The generic EPICS device support sets the record alarm status and severity when errors occur. Beginning in R4-30 the alarmStatus and alarmSeverity fields were added @@ -4864,10 +4958,8 @@

    set the record STAT and SEVR fields, regardless of the value of asynUser.auxStatus.


    -
    -

    - asynRecord: Generic EPICS Record Support

    -
    +

    + asynRecord: Generic EPICS Record Support

    A special record type asynRecord is provided. Details are described in asynRecord. This section provides a brief description of how to use it.

    @@ -4893,272 +4985,27 @@

    asynRecord.png

    -
    -
    -

    - Example

    -
    -

    - The following reads from a device via octet messages:

    -
    #include <asynDriver.h>
    -...
    -#define BUFFER_SIZE 80
    -typedef struct myData {
    -    epicsEventId done;
    -    asynOctet    *pasynOctet;
    -    void         *drvPvt;
    -    char         buffer[BUFFER_SIZE];
    -}myData;
    -
    -static void queueCallback(asynUser *pasynUser) {
    -    myData     *pmydata = (myData *)pasynUser->userPvt;
    -    asynOctet  *pasynOctet = pmydata->pasynOctet;
    -    void       *drvPvt = pmydata->drvPvt;
    -    asynStatus status;
    -    int        writeBytes,readBytes;
    -    int        eomReason;
    -
    -    asynPrint(pasynUser,ASYN_TRACE_FLOW,"queueCallback entered\n");
    -    status = pasynOctet->write(drvPvt,pasynUser,pmydata->buffer,
    -              strlen(pmydata->buffer),&writeBytes);
    -    if(status!=asynSuccess) {
    -        asynPrint(pasynUser,ASYN_TRACE_ERROR,
    -            "queueCallback write failed %s\n",pasynUser->errorMessage);
    -    } else {
    -        asynPrintIO(pasynUser,ASYN_TRACEIO_DEVICE,
    -            pmydata->buffer,strlen(pmydata->buffer),
    -            "queueCallback write sent %d bytes\n",writeBytes);
    -    }
    -    status = pasynOctet->read(drvPvt,pasynUser,pmydata->buffer,
    -         BUFFER_SIZE,&readBytes,&eomReason);
    -    if(status!=asynSuccess) {
    -        asynPrint(pasynUser,ASYN_TRACE_ERROR,
    -            "queueCallback read failed %s\n",pasynUser->errorMessage);
    -    } else {
    -        asynPrintIO(pasynUser,ASYN_TRACEIO_DEVICE,
    -            pmydata->buffer,BUFFER_SIZE,
    -            "queueCallback read returned: retlen %d eomReason 0x%x data %s\n",
    -            readBytes,eomReason,pmydata->buffer);
    -    }
    -    epicsEventSignal(pmydata->done);
    -}
    -
    -static void asynExample(const char *port,int addr,const char *message)
    -{
    -    myData        *pmyData;
    -    asynUser      *pasynUser;
    -    asynStatus    status;
    -    asynInterface *pasynInterface;
    -
    -    pmyData = (myData *)pasynManager->memMalloc(sizeof(myData));
    -    memset(pmyData,0,sizeof(myData));
    -    strcpy(pmyData->buffer,message);
    -    pasynUser = pasynManager->createAsynUser(queueCallback,0);
    -    pasynUser->userPvt = pmyData;
    -    status = pasynManager->connectDevice(pasynUser,port,addr);
    -    if(status!=asynSuccess) {
    -        printf("can't connect to serialPort1 %s\n",pasynUser->errorMessage);
    -        exit(1);
    -    }
    -    pasynInterface = pasynManager->findInterface(
    -        pasynUser,asynOctetType,1);
    -    if(!pasynInterface) {
    -        printf("%s driver not supported\n",asynOctetType);
    -        exit(-1);
    -    }
    -    pmyData->pasynOctet = (asynOctet *)pasynInterface->pinterface;
    -    pmyData->drvPvt = pasynInterface->drvPvt;
    -    pmyData->done = epicsEventCreate(epicsEventEmpty);
    -    status = pasynManager->queueRequest(pasynUser,asynQueuePriorityLow, 0.0);
    -    if(status) {
    -        asynPrint(pasynUser,ASYN_TRACE_ERROR,
    -            "queueRequest failed %s\n",pasynUser->errorMessage);
    -    }
    -    epicsEventWait(pmyData->done);
    -    status = pasynManager->freeAsynUser(pasynUser);
    -    if(status) {
    -        asynPrint(pasynUser,ASYN_TRACE_ERROR,
    -            "freeAsynUser failed %s\n",pasynUser->errorMessage);
    -    }
    -    epicsEventDestroy(pmyData->done);
    -    pasynManager->memFree(pasynUser->userPvt,sizeof(myData));
    -}
    -

    - The flow of control is as follows:

    -
      -
    1. A port driver calls registerPort. This step is not shown in the above example.
    2. -
    3. asynExample allocates myData and an asynUser.
    4. -
    5. asynExample connects to a device and to the asynOctet interface for the port driver.
    6. -
    7. When it is ready to communicate with the driver it calls queueRequest.
    8. -
    9. queueCallback is called. It calls the port driver's write and read methods.
    10. -

    -
    -

    - Test Application

    -
    -

    - The asynDriver distribution includes code to test asynDriver. It is also an example - of how to interface to asynManager. The example resides in <top>/testApp and - contains the following components:

    -
    Db/
    -   test.db
    -   testBlock.db
    -adl/
    -   test.adl
    -src/
    -   devTestBlock.dbd
    -   echoDriver.c
    -   addrChangeDriver.c
    -   devTestBlock.c
    -   interposeInterface.c
    -

    - echoDriver is a port driver that echos messages it receives. It implements asynCommon - and asynOctet. When asynOctet:write is called it saves the message. When asynOctet:read - is called, the saved message is returned and the message is flushed. echoDriverInit - has an argument that determines if it acts like a multiDevice or a single device - port driver.

    -

    - An instance of echoDriver is started via the iocsh command:

    -
    echoDriverInit(portName,delay,noAutoConnect,multiDevice)
    +

    + asynGpib

    - where

    + GPIB has additional features that are not supported by asynCommon and asynOctet. + asynGpib defines two interfaces.

      -
    • portName - the port name for this instance.
    • -
    • delay - The time to delay after a read or write. If delay is 0 then echoDriver - registers as a synchronous port driver, i.e. bit ASYN_CANBLOCK of attributes is - not set. If delay>0 then ASYN_CANBLOCK is set.
    • -
    • noAutoConnect - Determines initial setting for port.
    • -
    • multiDevice - If true then it supports two devices with addresses 0 and 1. If - false it does not set ASYN_MULTIDEVICE, i.e. it only supports a single device.
    • +
    • asynGpib - This is the interface that device support calls. It provides the following: +
        +
      • A set of GPIB specific methods that device support can call.
      • +
      • Code that handles generic GPIB functions like SRQ polling.
      • +
      • A registerPort method which is called by GPIB port drivers. +

        +

        +
      • +
      +
    • +
    • asynGpibPort - A set of methods implemented by GPIB drivers
    -

    - addrChangeDriver is a multidevice driver that is an asynUser of another port driver. - In the example application it connects to echoDriver. An example where this technique - might be used is a port driver for mult-drop serial that connects to a standard - serial port.

    -

    - An instance of addrChangeDriver is started via the iocsh commandL:

    -
    addrChangeDriverInit(portName,lowerPort,addr)
    -

    - where

    -
      -
    • portName - the port name for this instance.
    • -
    • lowerPort - the port to which addrChangeDriver connects
    • -
    • addr - The address to which addrChangeDriver connects
    • -
    -

    - devTestBlock is device support that tests blockProcessCallback. It has device support - for stringin records. The INP field has the syntax:

    -
        field(INP,"@asyn(port,addr,timeout) pvname)
    -

    - where:

    -
      -
    • asyn(port,addr,timeout) is same as for devEpics support.
    • -
    • pvname - The name of a record in the same ioc.
    • -
    -

    - When the stringin record is processed the following occurs.

    -
      -
    • When process is called and PACT is : -
        -
      • TRUE - then it just returns to record support.
      • -
      • FALSE - It does what follows.
      • -
      -
    • -
    • When processing starts the state is stateIdle.
    • -
    • blockProcessCallback is called.
    • -
    • callbackRequestDelayed is called (.1 second delay). The callback calls queueRequest.
    • -
    • When processCallback is called it does the following: -
        -
      • calls unblockProcessCallback
      • -
      • If state is stateIdle -
          -
        • Calls dbGet to get a string value from pvname
        • -
        • calls pasynOctet->write to send the string
        • -
        • sets state to stateWrite
        • -
        • Calls blockProcessCallback
        • -
        • callbackRequestDelayed is called The callback calls queueRequest.
        • -
        • completes. processCallback will be called again
        • -
        -
      • -
      • If state is stateWrite -
          -
        • calls pasynOctet->read and puts the value in VAL.
        • -
        • Sets state = stateIdle
        • -
        • requests the the record be processed. This time PACT will be TRUE
        • -
        -
      • -
      -
    • -
    -

    - test.db is a template containing three records: a calc record, which forward links - to a stringout record which forward links to a stringin record. The stringOut record - attaches to the device support supplied by asynOctetWriteRead.c. When the calcRecord - is processed the following happens:

    -
      -
    • The calcRecord acts as a counter that overflows when the count reaches 10. After - counting to forward links ti the stringIn record.
    • -
    • The string in record gets the current value of the counter converted to s character - string and forward links to the stringOut record.
    • -
    • The stringOut record gets the value from the stringIn record an calls queueRequest. - The record is left with PACT true.
    • -
    • The processCallback calls pasynOctet->write passing the value obtained from - the stringIn record. The then does does a pasynOctet->read. When this completes - it asks for the record to complete processing.
    • -
    • The stringOut record completes processing. -

      -

      -
    • -
    -

    - testBlock.db is a template similar to test.db except that it attached to device - support testBlock instead of asynOctetWriteRead.

    -

    - Executing "medm -x test.adl" produces the display:

    -
    -

    - asynTest.png

    -
    -

    - It assumes that an ioc has been started via:

    -
    cd <top>/iocBoot/ioctest
    -../../bin/solaris-sparc/test st.cmd
    -

    - This starts two versions of echoDriver as port "A" and "B". port A acts as single - device port. port B acts as a multiDevice port that has two devices. For each of - the three possible devices, the st.cmd file starts up two sets of records from test.db - The st.cmd file also loads a set of records from asynTest.db for port A and for - port B and for each of the two devices attached to port B. It also loads a set of - records from asynRecord.db. It starts one version of addrChangeDriver which connects - to port A.

    -

    - It loads six versions of test.db and four versions of testBlock.db The test.adl - file attaches to these database records.

    -
    -
    -

    - asynGpib

    -
    -

    - GPIB has additional features that are not supported by asynCommon and asynOctet. - asynGpib defines two interfaces.

    -
      -
    • asynGpib - This is the interface that device support calls. It provides the following: -
        -
      • A set of GPIB specific methods that device support can call.
      • -
      • Code that handles generic GPIB functions like SRQ polling.
      • -
      • A registerPort method which is called by GPIB port drivers. -

        -

        -
      • -
      -
    • -
    • asynGpibPort - A set of methods implemented by GPIB drivers
    • -
    -

    - asynGpibDriver.h

    +

    + asynGpibDriver.h

    asynGpibDriver.h contains the following definitions:

    /* GPIB Addressed Commands*/
    @@ -5237,7 +5084,7 @@ 

    asynStatus (*serialPoll) (void *drvPvt, int addr, double timeout,int *status); asynStatus (*serialPollEnd) (void *drvPvt); };

    -

    +

    asynGpib

    asynGpib describes the interface for device support code. It provides gpib specific @@ -5303,7 +5150,7 @@

    -

    +

    asynGpibPort

    asynGpibPort is the interface that is implemented by gpib drivers, e.g. the VXI-11. @@ -5383,10 +5230,8 @@


    -
    -

    - Port Drivers

    -
    +

    + Port Drivers

    Local Serial Port

    @@ -5667,10 +5512,9 @@

    TCP/IP Server

    The drvAsynIPServerPort driver supports asyn socket servers by listening for TCP/IP - or UDP connections from remote clients. The listener thread then creates a new drvAsynIPPort - port by calling drvAsynIPPortConfigure (or re-uses a disconnected port it previously - created), and calls back any registered asyn clients with the name of the new port. - These asyn clients will typically be socket servers.

    + or UDP connections from remote clients. The creates maxClients drvAsynIPPort port + drivers by calling drvAsynIPPortConfigure at initialization. These ports are named + portName:0, portName:1, etc. where portName is the name passed to drvAsynIPServerPortConfigure.

    IP server listeners are configured with the drvAsynIPServerPortConfigure command:

    @@ -5690,28 +5534,24 @@

    connect. Non-zero if explicit connect command must be issued. Note that all asyn I/O ports that the listener thread creates will be created with noAutoConnect=1, but this is transparent to socket server applications, because the listener thread - does the explicit connect for them. + does the explicit connection for them.
  • noProcessEos is passed to drvAsynIPPortConfigure when new asyn I/O ports are created. If 0 then asynInterposeEosConfig is called specifying both processEosIn and processEosOut.
  • - This driver implements the asynOctet interface. The only methods it supports are - registerInterruptUser and cancelInterruptUser. Calling the other asynOctet methods - will result in an error. The following happens when a new connection is received - on the port specified in drvAsynIPServerPortConfigure:

    + This driver implements the asynOctet interface. For TCP connections the only methods + it supports are registerInterruptUser and cancelInterruptUser. Calling the other + asynOctet methods will result in an error. For UDP it implements asynOctet->read(). + The following happens when a new connection is received on the port specified in + drvAsynIPServerPortConfigure:

      -
    • If there are no registered asyn clients (who have called registerInterruptUser - on the asynOctet interface of the listener port) then the incoming connection is - immediately closed, since there are no IP servers available to service it. If there - is at least one registered client, then the following steps are executed.
    • The list of drvAsynIPPort ports that this listener thread has created is searched - to see if there is an existing port that is currently disconnected because the remote - IP client disconnected.
    • -
    • If there is an existing disconnected port, then it is reconnected with the file - descriptor from the new IP connection.
    • -
    • If there is no available existing port, then a new one is created by calling drvAsynIPPortConfigure. - The name of the new port is of the form portName:1, portName:2, etc., where portName - is the name of the listener port.
    • + to see if there is a drvAsynIPPort that is currently disconnected because there + is no remote IP client connected. +
    • If there is a disconnected port, then it is connected with the file descriptor + from the new IP connection.
    • +
    • If there are no disconnected ports then the incoming connection will be immediately + closed.
    • The asynTraceMask and asynTraceIOMask of the newly connected port are set to the current values of the listener thread port. This makes it possible to trace the early stages of execution of the callbacks to the registered clients, before one @@ -5719,8 +5559,6 @@

    • All registered asyn clients (who have called registerInterruptUser on the asynOctet interface of the listener port) are called back with the name of the newly connected port.
    • -
    • The clients then will connect to this new asyn port and perform I/O using the - asynOctet methods.

    VXI-11

    @@ -5810,7 +5648,7 @@

    Linux-Gpib

    - The linux-gpib port driver was written to support + The linux-gpib port driver was written to support The Linux GPIB Package library.

    In order to build this support the Linux GPIB Package must be installed. Also in @@ -6018,10 +5856,8 @@

    Driver for Prologix LAN/GPIB adapter
    -
    -

    - asynPortDriver C++ base class

    -
    +

    + asynPortDriver C++ base class

    A C++ base class called asynPortDriver is available. This is a base class from which real asyn port drivers can be derived. It greatly simplifies the job of writing @@ -6029,10 +5865,8 @@

    the port, registering the interfaces, and calling interrupt clients. It is documented separately in asynPortDriver.html.


    -
    -

    - asynPortClient C++ classes

    -
    +

    + asynPortClient C++ classes

    asynPortClient is a set of C++ classes that are designed to simplify the task of writing a client that directly communicates with an asyn port driver, without running @@ -6042,11 +5876,9 @@

    with pasynManager->queueRequest. It is documented separately in asynPortClient.html.


    -
    -

    - Diagnostic Aids

    -
    -

    +

    + Diagnostic Aids

    +

    iocsh Commands

        asynReport(level,portName)
         asynInterposeFlushConfig(portName,addr,timeout)
    @@ -6088,15 +5920,18 @@ 

    asynSetTraceMask calls asynTrace:setTraceMask for the specified port and address. If portName is zero length then the global trace mask - is set.

    + is set. The mask bit definitions are documented in the traceMask + definitions.

    asynSetTraceIOMask calls asynTrace:setTraceIOMask for the specified port and address. If portName is zero length then the global traceIO - mask is set.

    + mask is set. The mask bit definitions are documented in the + traceIO mask definitions.

    asynSetTraceInfoMask calls asynTrace:setTraceInfoMask for the specified port and address. If portName is zero length then the global traceInfo - mask is set.

    + mask is set. The mask bit definitions are documented in the + traceInfo mask definitions.

    asynSetTraceFile calls asynTrace:setTraceFile. The filename is handled as follows:

    @@ -6161,11 +5996,413 @@

    for the specified port. This reverts to the default timestamp source function in asynManager.


    +

    + Example Client

    +

    + The following is an example of an asyn client that reads from an asyn driver via + octet messages:

    +
    #include <asynDriver.h>
    +...
    +#define BUFFER_SIZE 80
    +typedef struct myData {
    +    epicsEventId done;
    +    asynOctet    *pasynOctet;
    +    void         *drvPvt;
    +    char         buffer[BUFFER_SIZE];
    +}myData;
    +
    +static void queueCallback(asynUser *pasynUser) {
    +    myData     *pmydata = (myData *)pasynUser->userPvt;
    +    asynOctet  *pasynOctet = pmydata->pasynOctet;
    +    void       *drvPvt = pmydata->drvPvt;
    +    asynStatus status;
    +    int        writeBytes,readBytes;
    +    int        eomReason;
    +
    +    asynPrint(pasynUser,ASYN_TRACE_FLOW,"queueCallback entered\n");
    +    status = pasynOctet->write(drvPvt,pasynUser,pmydata->buffer,
    +              strlen(pmydata->buffer),&writeBytes);
    +    if(status!=asynSuccess) {
    +        asynPrint(pasynUser,ASYN_TRACE_ERROR,
    +            "queueCallback write failed %s\n",pasynUser->errorMessage);
    +    } else {
    +        asynPrintIO(pasynUser,ASYN_TRACEIO_DEVICE,
    +            pmydata->buffer,strlen(pmydata->buffer),
    +            "queueCallback write sent %d bytes\n",writeBytes);
    +    }
    +    status = pasynOctet->read(drvPvt,pasynUser,pmydata->buffer,
    +         BUFFER_SIZE,&readBytes,&eomReason);
    +    if(status!=asynSuccess) {
    +        asynPrint(pasynUser,ASYN_TRACE_ERROR,
    +            "queueCallback read failed %s\n",pasynUser->errorMessage);
    +    } else {
    +        asynPrintIO(pasynUser,ASYN_TRACEIO_DEVICE,
    +            pmydata->buffer,BUFFER_SIZE,
    +            "queueCallback read returned: retlen %d eomReason 0x%x data %s\n",
    +            readBytes,eomReason,pmydata->buffer);
    +    }
    +    epicsEventSignal(pmydata->done);
    +}
    +
    +static void asynExample(const char *port,int addr,const char *message)
    +{
    +    myData        *pmyData;
    +    asynUser      *pasynUser;
    +    asynStatus    status;
    +    asynInterface *pasynInterface;
    +
    +    pmyData = (myData *)pasynManager->memMalloc(sizeof(myData));
    +    memset(pmyData,0,sizeof(myData));
    +    strcpy(pmyData->buffer,message);
    +    pasynUser = pasynManager->createAsynUser(queueCallback,0);
    +    pasynUser->userPvt = pmyData;
    +    status = pasynManager->connectDevice(pasynUser,port,addr);
    +    if(status!=asynSuccess) {
    +        printf("can't connect to serialPort1 %s\n",pasynUser->errorMessage);
    +        exit(1);
    +    }
    +    pasynInterface = pasynManager->findInterface(
    +        pasynUser,asynOctetType,1);
    +    if(!pasynInterface) {
    +        printf("%s driver not supported\n",asynOctetType);
    +        exit(-1);
    +    }
    +    pmyData->pasynOctet = (asynOctet *)pasynInterface->pinterface;
    +    pmyData->drvPvt = pasynInterface->drvPvt;
    +    pmyData->done = epicsEventCreate(epicsEventEmpty);
    +    status = pasynManager->queueRequest(pasynUser,asynQueuePriorityLow, 0.0);
    +    if(status) {
    +        asynPrint(pasynUser,ASYN_TRACE_ERROR,
    +            "queueRequest failed %s\n",pasynUser->errorMessage);
    +    }
    +    epicsEventWait(pmyData->done);
    +    status = pasynManager->freeAsynUser(pasynUser);
    +    if(status) {
    +        asynPrint(pasynUser,ASYN_TRACE_ERROR,
    +            "freeAsynUser failed %s\n",pasynUser->errorMessage);
    +    }
    +    epicsEventDestroy(pmyData->done);
    +    pasynManager->memFree(pasynUser->userPvt,sizeof(myData));
    +}
    +

    + The flow of control is as follows:

    +
      +
    1. A port driver calls registerPort. This step is not shown in the above example.
    2. +
    3. asynExample allocates myData and an asynUser.
    4. +
    5. asynExample connects to a device and to the asynOctet interface for the port driver.
    6. +
    7. When it is ready to communicate with the driver it calls queueRequest.
    8. +
    9. queueCallback is called. It calls the port driver's write and read methods.
    10. +
    +
    +

    + Test Applications

    +

    + The asynDriver distribution includes several test applications to test asynDriver + and device support.

    +

    + testApp

    +

    + This is an example of how to interface to asynManager. The example resides in <top>/testApp + and contains the following components:

    +
    Db/
    +   test.db
    +   testBlock.db
    +adl/
    +   test.adl
    +src/
    +   devTestBlock.dbd
    +   echoDriver.c
    +   addrChangeDriver.c
    +   devTestBlock.c
    +   interposeInterface.c
    +

    + echoDriver is a port driver that echos messages it receives. It implements asynCommon + and asynOctet. When asynOctet:write is called it saves the message. When asynOctet:read + is called, the saved message is returned and the message is flushed. echoDriverInit + has an argument that determines if it acts like a multiDevice or a single device + port driver.

    +

    + An instance of echoDriver is started via the iocsh command:

    +
    echoDriverInit(portName,delay,noAutoConnect,multiDevice)
    +

    + where

    +
      +
    • portName - the port name for this instance.
    • +
    • delay - The time to delay after a read or write. If delay is 0 then echoDriver + registers as a synchronous port driver, i.e. bit ASYN_CANBLOCK of attributes is + not set. If delay>0 then ASYN_CANBLOCK is set.
    • +
    • noAutoConnect - Determines initial setting for port.
    • +
    • multiDevice - If true then it supports two devices with addresses 0 and 1. If + false it does not set ASYN_MULTIDEVICE, i.e. it only supports a single device.
    • +
    +

    + addrChangeDriver is a multidevice driver that is an asynUser of another port driver. + In the example application it connects to echoDriver. An example where this technique + might be used is a port driver for mult-drop serial that connects to a standard + serial port.

    +

    + An instance of addrChangeDriver is started via the iocsh commandL:

    +
    addrChangeDriverInit(portName,lowerPort,addr)
    +

    + where

    +
      +
    • portName - the port name for this instance.
    • +
    • lowerPort - the port to which addrChangeDriver connects
    • +
    • addr - The address to which addrChangeDriver connects
    • +
    +

    + devTestBlock is device support that tests blockProcessCallback. It has device support + for stringin records. The INP field has the syntax:

    +
        field(INP,"@asyn(port,addr,timeout) pvname)
    +

    + where:

    +
      +
    • asyn(port,addr,timeout) is same as for devEpics support.
    • +
    • pvname - The name of a record in the same ioc.
    • +
    +

    + When the stringin record is processed the following occurs.

    +
      +
    • When process is called and PACT is : +
        +
      • TRUE - then it just returns to record support.
      • +
      • FALSE - It does what follows.
      • +
      +
    • +
    • When processing starts the state is stateIdle.
    • +
    • blockProcessCallback is called.
    • +
    • callbackRequestDelayed is called (.1 second delay). The callback calls queueRequest.
    • +
    • When processCallback is called it does the following: +
        +
      • calls unblockProcessCallback
      • +
      • If state is stateIdle +
          +
        • Calls dbGet to get a string value from pvname
        • +
        • calls pasynOctet->write to send the string
        • +
        • sets state to stateWrite
        • +
        • Calls blockProcessCallback
        • +
        • callbackRequestDelayed is called The callback calls queueRequest.
        • +
        • completes. processCallback will be called again
        • +
        +
      • +
      • If state is stateWrite +
          +
        • calls pasynOctet->read and puts the value in VAL.
        • +
        • Sets state = stateIdle
        • +
        • requests the the record be processed. This time PACT will be TRUE
        • +
        +
      • +
      +
    • +
    +

    + test.db is a template containing three records: a calc record, which forward links + to a stringout record which forward links to a stringin record. The stringOut record + attaches to the device support supplied by asynOctetWriteRead.c. When the calcRecord + is processed the following happens:

    +
      +
    • The calcRecord acts as a counter that overflows when the count reaches 10. After + counting to forward links ti the stringIn record.
    • +
    • The string in record gets the current value of the counter converted to s character + string and forward links to the stringOut record.
    • +
    • The stringOut record gets the value from the stringIn record an calls queueRequest. + The record is left with PACT true.
    • +
    • The processCallback calls pasynOctet->write passing the value obtained from + the stringIn record. The then does does a pasynOctet->read. When this completes + it asks for the record to complete processing.
    • +
    • The stringOut record completes processing. +

      +

      +
    • +
    +

    + testBlock.db is a template similar to test.db except that it attached to device + support testBlock instead of asynOctetWriteRead.

    +

    + Executing "medm -x test.adl" produces the display:

    -

    - Install and Build

    +

    + asynTest.png

    -

    +

    + It assumes that an ioc has been started via:

    +
    cd <top>/iocBoot/ioctest
    +../../bin/linux-x86_64/test st.cmd
    +

    + This starts two versions of echoDriver as port "A" and "B". port A acts as single + device port. port B acts as a multiDevice port that has two devices. For each of + the three possible devices, the st.cmd file starts up two sets of records from test.db + The st.cmd file also loads a set of records from asynTest.db for port A and for + port B and for each of the two devices attached to port B. It also loads a set of + records from asynRecord.db. It starts one version of addrChangeDriver which connects + to port A.

    +

    + It loads six versions of test.db and four versions of testBlock.db The test.adl + file attaches to these database records.

    +

    + testArrayRingBufferApp

    +

    + This tests ring buffers for callbacks with arrays. The example resides in <top>/testArrayRingBufferApp. +

    +

    + Executing "medm -x testArrayRingBufferTop.adl" produces a top-level display from + which this display can be opened:

    +
    +

    + asynTestArrayRingBuffer.png

    +
    +

    + It assumes that an ioc has been started via:

    +
    cd <top>/iocBoot/ioctestArrayRingBuffer
    +../../bin/linux-x86_64/testArrayRingBuffer st.cmd
    +

    + testAsynPortClientApp

    +

    + This is a test program that demonstrates how to write C++ program that instantiates + both an asyn port driver and an asynPortClient object. It uses the asynPortClient + object to communicate with the asyn port driver directly over the asyn interfaces + without running an EPICS IOC. It creates an asynIPPort driver and an asynPortClient, + and uses the command line arguments to set the hostInfo string, a single command + string to send to the server, and optionally the input and output EOS. It then prints + out the response from the server. There are 3 example shell scipts provided that + show how to use testAsynIPPortClient to communicate with a Web server, a Newport + XPS motor controller, and a telnet host respectively.

    +

    + Usage: testAsynIPPortClient hostInfo outputString [outputEos] [inputEos]

    +

    + Example: testAsynIPPortClient cars.uchicago.edu:80 "GET / HTTP/1.0" "\n\n"

    +

    + The example resides in <top>/testAsynPortClientApp.

    +

    + testAsynPortDriverApp

    +

    + This test demonstrates how to write a driver using the asynPortDriver C++ class. + It consists of a simple digital oscilloscope simulator. When the vertical gain changes + the driver does callbacks on the enum choices for the vertical volts/division. This + requires closing and re-opening the display in medm, because Channel Access does + not do monitors on enum value changes.

    +

    + The example resides in <top>/testAsynPortDriverApp. +

    +

    + Executing "medm -x testAsynPortDriverTop.adl" produces a top-level display from + which this display can be opened:

    +
    +

    + testAsynPortDriver.png

    +
    +

    + It assumes that an ioc has been started via:

    +
    cd <top>/iocBoot/ioctestAsynPortDriver
    +../../bin/linux-x86_64/testAsynPortDriver st.cmd
    +

    + testBroadcastApp

    +

    + This application contains 3 test programs that use UDP IP broadcast messages.

    +

    + testBroadcastAsyn.c
    + This program uses drvAsynIPPort to send UDP broadcast messages on port 37747. The + message is "i\n". It then listens for any responses. If there are NSLS electrometers + on the network they should respond.

    +

    + testBroadcastNoAsyn.c
    + This program does the same as testBroadcastAsyn.c but uses native socket calls rather + than drvAsynIPort.

    +

    + testBroadcastBurst.c
    + This program is used to test the behavior of devices in the presence of large amounts + of broadcast traffic. It should be used with caution, since it can send a large + number of broadcast messages very quickly. It sends numBroadcast messages with no + delay. The messages is "test\r". It does this in a loop of numLoops with a delay + of delayTime seconds at the end of each loop. delayTime is floating point value, + so can be less than 1 second.
    + Usage: testBroadcastBurst broadcastAddress broadcastPort numBroadcast numLoops delayTime

    +

    + The code resides in <top>/testBroadcastApp.

    +

    + testConnectApp

    +

    + This application can be used to test connection management. It connects to a device + with drvAsynIPPort and periodically writes to it in a background thread. Depending + on whether the device is connected error messages will be printed. The device can + be connected and disconnected by power-cycling or removing the network cable to + test the behavior.

    +

    + The example resides in <top>/testConnectApp. +

    +

    + The test ioc can be started via:

    +
    cd <top>/iocBoot/ioctestConnect
    +../../bin/linux-x86_64/testConnect st.cmd
    +

    + The st.cmd file can be edited to select devices which will or will not ever connect. + There is no medm screen for this test.

    +

    + testEpicsApp

    +

    + This test includes example asyn port drivers for the asynInt32 and asynUInt32Digital + interfaces. Both drivers also implement the asynFloat64 interface for controlling + the update rate. The testEpicsApp application also uses the asynOctet echoDriver + from testApp. +

    +

    + The example resides in <top>/testEpicsApp. +

    +

    + Executing "medm -x *.adl" from the <top>/testEpicsApp/adl directory opens + the followings displays.

    +
    +

    + testInt32.png

    +

    + testDigital.png

    +

    + testOctet.png

    +
    +

    + From the testInt32.adl screen the following time-series screen can be opened.

    +
    +

    + asynTimeSeries.png

    +
    +

    + It assumes that an ioc has been started via:

    +
    cd <top>/iocBoot/ioctestEpics
    +../../bin/linux-x86_64/testEpics st.cmd
    +

    + testErrorsApp

    +

    + This tests error handling in standard asyn device support. The user can control + the status and severity for write operations, read operations, and interrupt callbacks. + It tests all of the interfaces (asynInt32, asynUInt32Digital, asynFloat64, asynOctet, + asynEnum, asynXXXArray (XXX=Int8, Int16, Int32, Float32, Float64). It tests output + records both with an without the info tag asyn:READBACK. By editing options in the + st.cmd file it also tests:

    +
      +
    • Synchronous and asynchronous driver operation (ASYN_CANBLOCK unset or set)
    • +
    • String and waveform records with or without ring buffer support(asyn:FIFO=0 or + 5)
    • +
    • Record .TSE field 0 (default timestamp support) or -2 (records get their timestamps + from the driver)
    • +
    • Periodic or I/O Intr scanning of input records.
    • +
    +

    + The example resides in <top>/testEpicsApp. +

    +

    + Executing "medm -x testErrorsTop.adl" from the <top>/testEerrorsApp/adl directory + produces a top-level display from which this display can be opened:

    +
    +

    + testErrors.png

    +
    +

    + It assumes that an ioc has been started via:

    +
    cd <top>/iocBoot/ioctestErrors
    +../../bin/linux-x86_64/testErrors st.cmd
    +

    + Install and Build

    +

    Install and Build asynDriver

    After obtaining a copy of the distribution, it must be installed and built for use @@ -6189,7 +6426,7 @@

    EPICS_BASE and IPAC. IPAC is only needed if you are building for vxWorks.
  • Run make in the top level directory and check for any compilation errors.
  • -

    +

    Using asynDriver Components with an EPICS iocCore Application

    Since asynDriver does NOT provide support for specific devices an application must @@ -6251,10 +6488,8 @@

    You must provide correct values for <ioc> and <record>. Once asynRecord is started, it can be connected to different devices.


    -
    -

    - License Agreement

    -
    +

    + License Agreement

    Copyright (c) 2002 University of Chicago All rights reserved.
     asynDriver is distributed subject to the following license conditions:
     
    diff --git a/documentation/asynPortClient.html b/documentation/asynPortClient.html
    old mode 100755
    new mode 100644
    diff --git a/documentation/asynPortDriver.html b/documentation/asynPortDriver.html
    old mode 100755
    new mode 100644
    diff --git a/documentation/asynRecord.html b/documentation/asynRecord.html
    old mode 100755
    new mode 100644
    diff --git a/documentation/asynTestArrayRingBuffer.png b/documentation/asynTestArrayRingBuffer.png
    new file mode 100755
    index 0000000..3a3bb07
    Binary files /dev/null and b/documentation/asynTestArrayRingBuffer.png differ
    diff --git a/documentation/asynTimeSeries.png b/documentation/asynTimeSeries.png
    new file mode 100755
    index 0000000..42b8073
    Binary files /dev/null and b/documentation/asynTimeSeries.png differ
    diff --git a/documentation/testAsynPortDriver.png b/documentation/testAsynPortDriver.png
    old mode 100644
    new mode 100755
    index ff5ef49..18f80fb
    Binary files a/documentation/testAsynPortDriver.png and b/documentation/testAsynPortDriver.png differ
    diff --git a/documentation/testDigital.png b/documentation/testDigital.png
    new file mode 100755
    index 0000000..85090bf
    Binary files /dev/null and b/documentation/testDigital.png differ
    diff --git a/documentation/testErrors.png b/documentation/testErrors.png
    new file mode 100755
    index 0000000..ea4d5cf
    Binary files /dev/null and b/documentation/testErrors.png differ
    diff --git a/documentation/testInt32.png b/documentation/testInt32.png
    new file mode 100755
    index 0000000..7f8efda
    Binary files /dev/null and b/documentation/testInt32.png differ
    diff --git a/documentation/testOctet.png b/documentation/testOctet.png
    new file mode 100755
    index 0000000..1dfdd16
    Binary files /dev/null and b/documentation/testOctet.png differ
    diff --git a/iocBoot/ioctestErrors/st.cmd b/iocBoot/ioctestErrors/st.cmd
    index 612135f..d6ed31b 100644
    --- a/iocBoot/ioctestErrors/st.cmd
    +++ b/iocBoot/ioctestErrors/st.cmd
    @@ -1,7 +1,8 @@
     dbLoadDatabase("../../dbd/testErrors.dbd")
     testErrors_registerRecordDeviceDriver(pdbbase)
     
    -testErrorsConfigure("PORT1",)
    +# The second argument is ASYN_CANBLOCK.  0 for a synchronous driver, 1 for asynchronous
    +testErrorsConfigure("PORT1",1)
     #asynSetTraceMask("PORT1",0,0xff)
     asynSetTraceIOMask("PORT1",0,0x2)
     
    diff --git a/iocBoot/ioctestIPServer/st.cmd.testIPServer1 b/iocBoot/ioctestIPServer/st.cmd.testIPServer1
    new file mode 100644
    index 0000000..ebe3c62
    --- /dev/null
    +++ b/iocBoot/ioctestIPServer/st.cmd.testIPServer1
    @@ -0,0 +1,29 @@
    +< envPaths
    +
    +dbLoadDatabase("../../dbd/testIPServer.dbd")
    +testIPServer_registerRecordDeviceDriver(pdbbase)
    +
    +# This is the local TCP port that for clients to connect to
    +epicsEnvSet LOCAL_IP_PORT 5001
    +
    +# This is the name of the asyn port driver that listens for connections
    +epicsEnvSet ASYN_LISTEN_PORT P5001
    +
    +# This is the name of the first drvAsynIPPort TCP driver that will be created
    +epicsEnvSet ASYN_TCP_PORT P5001:0
    +
    +# The following command starts a server on port 5001
    +drvAsynIPServerPortConfigure("$(ASYN_LISTEN_PORT)","localhost:$(LOCAL_IP_PORT)",1,0,0,0)
    +
    +#asynSetTraceFile("$(ASYN_LISTEN_PORT)", -1, "")
    +asynSetTraceIOMask("$(ASYN_LISTEN_PORT)", -1, 0x2)
    +#asynSetTraceMask("$(ASYN_LISTEN_PORT)", -1, 0xff)
    +#asynSetTraceMask("$(ASYN_TCP_PORT)", -1, 0xff)
    +
    +asynOctetSetInputEos("$(ASYN_TCP_PORT)", 0, "\r\n")
    +asynOctetSetOutputEos("$(ASYN_TCP_PORT)", 0, "\r\n")
    +
    +dbLoadRecords("../../db/testIPServer1.db", "P=testIPServer:,PORT=$(ASYN_TCP_PORT)")
    +
    +iocInit()
    +
    diff --git a/iocBoot/ioctestOutputCallback/Makefile b/iocBoot/ioctestOutputCallback/Makefile
    new file mode 100644
    index 0000000..b493509
    --- /dev/null
    +++ b/iocBoot/ioctestOutputCallback/Makefile
    @@ -0,0 +1,5 @@
    +TOP = ../..
    +include $(TOP)/configure/CONFIG
    +ARCH = linux-x86_64
    +TARGETS = envPaths cdCommands dllPath.bat
    +include $(TOP)/configure/RULES.ioc
    diff --git a/iocBoot/ioctestOutputCallback/st.cmd b/iocBoot/ioctestOutputCallback/st.cmd
    new file mode 100644
    index 0000000..f22a923
    --- /dev/null
    +++ b/iocBoot/ioctestOutputCallback/st.cmd
    @@ -0,0 +1,17 @@
    +dbLoadDatabase("../../dbd/testOutputCallback.dbd")
    +testOutputCallback_registerRecordDeviceDriver(pdbbase)
    +
    +# Arguments: Portname, canBlock
    +testOutputCallbackConfigure("PORT1", 1)
    +# Enable ASYN_TRACE_WARNING
    +asynSetTraceMask("PORT1",0,0x21)
    +asynSetTraceIOMask("PORT1",0,0x2)
    +
    +### Use PINI=NO on output records and SCAN=I/O Intr on input records
    +dbLoadRecords("../../db/testOutputCallback.db","P=testOutputCallback:,PORT=PORT1,ADDR=0,TIMEOUT=1,PINI=NO")
    +
    +dbLoadRecords("../../db/asynRecord.db","P=testOutputCallback:,R=asyn1,PORT=PORT1,ADDR=0,OMAX=80,IMAX=80")
    +
    +iocInit()
    +
    +
    diff --git a/opi/Makefile b/opi/Makefile
    new file mode 100644
    index 0000000..6399d88
    --- /dev/null
    +++ b/opi/Makefile
    @@ -0,0 +1,9 @@
    +TOP = ../..
    +include $(TOP)/configure/CONFIG
    +
    +ADL_DIR = medm
    +UI_DIR  = caqtdm/autoconvert
    +EDL_DIR = edm/autoconvert
    +OPI_DIR = boy/autoconvert
    +
    +-include $(SUPPORT)/configure/RULES_OPI
    diff --git a/opi/boy/autoconvert/asynGPIBSetup.opi b/opi/boy/autoconvert/asynGPIBSetup.opi
    new file mode 100644
    index 0000000..395c3d1
    --- /dev/null
    +++ b/opi/boy/autoconvert/asynGPIBSetup.opi
    @@ -0,0 +1,631 @@
    +
    +  
    +  
    +    false
    +    -1
    +    -1
    +  
    +  false
    +  
    +    
    +  
    +  5.1.0.201801081728
    +  
    +    
    +  
    +  5
    +  185
    +  
    +    true
    +  
    +  asynGPIBSetup
    +  
    +  
    +  true
    +  true
    +  false
    +  true
    +  false
    +  Display
    +  375
    +  456
    +  239
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    100.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    29
    +    true
    +    
    +      
    +    
    +    0
    +    0
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Rectangle
    +    375
    +    0
    +    8
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    25
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(P)$(R)
    +    
    +    true
    +    1
    +    true
    +    Label
    +    375
    +    false
    +    0
    +    12
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    GPIB address:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    130
    +    false
    +    4
    +    68
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).ADDR
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    75
    +    139
    +    68
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Serial poll response:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    210
    +    false
    +    4
    +    97
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).SPR
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    56
    +    false
    +    224
    +    97
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Universal Command
    +    
    +    true
    +    1
    +    true
    +    Label
    +    170
    +    false
    +    4
    +    126
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).UCMD
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    180
    +    179
    +    126
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Addressed Command
    +    
    +    true
    +    1
    +    true
    +    Label
    +    170
    +    false
    +    4
    +    151
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).ACMD
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    180
    +    179
    +    151
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).GPIBIV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Supported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    218
    +    42
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).GPIBIV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Unsupported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    208
    +    42
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    asynGpib interface:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    190
    +    false
    +    4
    +    42
    +  
    +
    diff --git a/opi/boy/autoconvert/asynIPPortSetup.opi b/opi/boy/autoconvert/asynIPPortSetup.opi
    new file mode 100644
    index 0000000..9ddde52
    --- /dev/null
    +++ b/opi/boy/autoconvert/asynIPPortSetup.opi
    @@ -0,0 +1,1350 @@
    +
    +  
    +  
    +    false
    +    -1
    +    -1
    +  
    +  false
    +  
    +    
    +  
    +  5.1.0.201801081728
    +  
    +    
    +  
    +  5
    +  410
    +  
    +    true
    +  
    +  asynIPPortSetup
    +  
    +  
    +  true
    +  true
    +  false
    +  true
    +  false
    +  Display
    +  260
    +  405
    +  149
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    100.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    16
    +    true
    +    
    +      
    +    
    +    0
    +    0
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Rectangle
    +    260
    +    0
    +    2
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    16
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(P)$(R)
    +    
    +    true
    +    1
    +    true
    +    Label
    +    260
    +    false
    +    0
    +    2
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).OPTIONIV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Supported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    148
    +    25
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).OPTIONIV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Unsupported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    138
    +    25
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    asynOption:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    8
    +    25
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Disconnect on
    +    
    +    true
    +    1
    +    true
    +    Label
    +    130
    +    false
    +    13
    +    51
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    read timeout:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    130
    +    false
    +    13
    +    76
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Host info:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    100
    +    false
    +    43
    +    101
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    4
    +    18
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).HOSTINFO
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    102
    +    150
    +    101
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).DRTO
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    76
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Data bits:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    100
    +    false
    +    43
    +    206
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Stop bits:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    100
    +    false
    +    43
    +    231
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Modem control:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    140
    +    false
    +    3
    +    281
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Parity:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    73
    +    256
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).DBIT
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    206
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).SBIT
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    231
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).PRTY
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    256
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).MCTL
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    281
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Flow control:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    130
    +    false
    +    13
    +    306
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).FCTL
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    306
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    XOFF output:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    120
    +    false
    +    23
    +    331
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).IXON
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    331
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    XOFF input:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    33
    +    356
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).IXOFF
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    356
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    XON=any:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    80
    +    false
    +    63
    +    381
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).IXANY
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    381
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Baud rate:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    100
    +    false
    +    43
    +    181
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    18
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).LBAUD
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    102
    +    150
    +    181
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    COM (RFC 2217) protocol
    +    
    +    true
    +    1
    +    true
    +    Label
    +    230
    +    false
    +    15
    +    151
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Parameters for ports with
    +    
    +    true
    +    1
    +    true
    +    Label
    +    250
    +    false
    +    5
    +    130
    +  
    +
    diff --git a/opi/boy/autoconvert/asynOctet.opi b/opi/boy/autoconvert/asynOctet.opi
    new file mode 100644
    index 0000000..2c37bb5
    --- /dev/null
    +++ b/opi/boy/autoconvert/asynOctet.opi
    @@ -0,0 +1,2422 @@
    +
    +  
    +  
    +    false
    +    -1
    +    -1
    +  
    +  false
    +  
    +    
    +  
    +  5.1.0.201801081728
    +  
    +    
    +  
    +  5
    +  350
    +  
    +    true
    +  
    +  asynOctet
    +  
    +  
    +  true
    +  true
    +  false
    +  true
    +  false
    +  Display
    +  442
    +  457
    +  494
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    100.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    29
    +    true
    +    
    +      
    +    
    +    0
    +    0
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Rectangle
    +    442
    +    0
    +    5
    +  
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    0.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    85
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    true
    +    Rectangle
    +    430
    +    6
    +    92
    +  
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    0.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    25
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    true
    +    Rectangle
    +    430
    +    6
    +    292
    +  
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    0.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    21
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    true
    +    Rectangle
    +    360
    +    74
    +    213
    +  
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    0.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    105
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    true
    +    Rectangle
    +    430
    +    6
    +    182
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    4
    +    18
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).TINP
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    350
    +    false
    +    81
    +    216
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Timeout (sec):
    +    
    +    true
    +    1
    +    true
    +    Label
    +    140
    +    false
    +    6
    +    43
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).TMOT
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    50
    +    151
    +    43
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).TMOD
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    110
    +    320
    +    43
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Transfer:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    225
    +    43
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    21
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(P)$(R)
    +    
    +    true
    +    1
    +    true
    +    Label
    +    442
    +    false
    +    0
    +    9
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    4
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).AOUT
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    350
    +    78
    +    128
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Output
    +    
    +    true
    +    1
    +    true
    +    Label
    +    60
    +    false
    +    13
    +    99
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Format:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    91
    +    99
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).OFMT
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    80
    +    166
    +    99
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ASCII:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    60
    +    false
    +    13
    +    126
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Terminator:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    256
    +    99
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    4
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).OEOS
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    60
    +    371
    +    99
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Requested:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    100
    +    false
    +    88
    +    152
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Length:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    10
    +    152
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Actual:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    280
    +    152
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).NAWT
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    56
    +    false
    +    355
    +    152
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).NOWT
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    70
    +    193
    +    152
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    I/O Status:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    10
    +    297
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    I/O Severity:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    130
    +    false
    +    217
    +    297
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    4
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).STAT
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    85
    +    false
    +    122
    +    297
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    4
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).SEVR
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    85
    +    false
    +    349
    +    297
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Scan:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    50
    +    false
    +    9
    +    323
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).SCAN
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    110
    +    64
    +    323
    +  
    +  
    +    
    +      
    +        $(P)$(R).PROC
    +        1
    +        10
    +        
    +        
    +      
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Action Button
    +    0
    +    $(P)$(R).PROC
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +    Process
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Action Button
    +    80
    +    179
    +    323
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Terminator:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    253
    +    189
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    4
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).IEOS
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    60
    +    368
    +    189
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Input
    +    
    +    true
    +    1
    +    true
    +    Label
    +    50
    +    false
    +    16
    +    189
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Format:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    86
    +    191
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).IFMT
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    80
    +    161
    +    189
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ASCII:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    60
    +    false
    +    13
    +    215
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Requested:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    100
    +    false
    +    88
    +    242
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Length:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    10
    +    242
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Actual:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    280
    +    242
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).NORD
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    56
    +    false
    +    355
    +    242
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).NRRD
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    70
    +    193
    +    242
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    EOM reason:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    77
    +    265
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    4
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).EOMR
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    70
    +    false
    +    193
    +    265
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).OCTETIV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Supported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    220
    +    66
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).OCTETIV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Unsupported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    210
    +    66
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    asynOctet interface:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    200
    +    false
    +    6
    +    66
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).IFACE
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Active
    +    
    +    true
    +    1
    +    true
    +    Label
    +    60
    +    false
    +    344
    +    66
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).IFACE
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Inactive
    +    
    +    true
    +    1
    +    true
    +    Label
    +    80
    +    false
    +    334
    +    66
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    More...
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    300
    +    323
    +  
    +  
    +    
    +      
    +        asynRecord.opi
    +        
    +          true
    +        
    +        1
    +        Record parameters
    +      
    +      
    +        asynRegister.opi
    +        
    +          true
    +        
    +        1
    +        Register interfaces I/O
    +      
    +      
    +        asynSerialPortSetup.opi
    +        
    +          true
    +        
    +        1
    +        Serial port parameters
    +      
    +      
    +        asynGPIBSetup.opi
    +        
    +          true
    +        
    +        1
    +        GPIB parameters
    +      
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    56
    +    375
    +    323
    +  
    +
    diff --git a/opi/boy/autoconvert/asynRecord.opi b/opi/boy/autoconvert/asynRecord.opi
    new file mode 100644
    index 0000000..4b95ef6
    --- /dev/null
    +++ b/opi/boy/autoconvert/asynRecord.opi
    @@ -0,0 +1,3318 @@
    +
    +  
    +  
    +    false
    +    -1
    +    -1
    +  
    +  false
    +  
    +    
    +  
    +  5.1.0.201801081728
    +  
    +    
    +  
    +  5
    +  589
    +  
    +    true
    +  
    +  asynRecord
    +  
    +  
    +  true
    +  true
    +  false
    +  true
    +  false
    +  Display
    +  440
    +  72
    +  61
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    100.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    29
    +    true
    +    
    +      
    +    
    +    0
    +    0
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Rectangle
    +    440
    +    0
    +    8
    +  
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    0.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    25
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    true
    +    Rectangle
    +    430
    +    6
    +    178
    +  
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    0.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    49
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    true
    +    Rectangle
    +    430
    +    6
    +    210
    +  
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    0.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    315
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    true
    +    Rectangle
    +    430
    +    5
    +    267
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    21
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(P)$(R)
    +    
    +    true
    +    1
    +    true
    +    Label
    +    440
    +    false
    +    0
    +    12
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    4
    +    16
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).ERRS
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    359
    +    false
    +    75
    +    182
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Error:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    60
    +    false
    +    10
    +    181
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).AUCT
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    noAutoConnect
    +    
    +    true
    +    1
    +    true
    +    Label
    +    130
    +    false
    +    300
    +    212
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).AUCT
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    autoConnect
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    310
    +    212
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).AUCT
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    120
    +    305
    +    233
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).ENBL
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Enabled
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    180
    +    212
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).ENBL
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Disabled
    +    
    +    true
    +    1
    +    true
    +    Label
    +    80
    +    false
    +    175
    +    212
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).ENBL
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    120
    +    155
    +    234
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceError
    +    
    +    true
    +    1
    +    true
    +    Label
    +    80
    +    false
    +    68
    +    316
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceIODriver
    +    
    +    true
    +    1
    +    true
    +    Label
    +    104
    +    false
    +    68
    +    385
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceIOFilter
    +    
    +    true
    +    1
    +    true
    +    Label
    +    104
    +    false
    +    68
    +    362
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceIODevice
    +    
    +    true
    +    1
    +    true
    +    Label
    +    104
    +    false
    +    68
    +    339
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceMask
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    9
    +    269
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceIOHex
    +    
    +    true
    +    1
    +    true
    +    Label
    +    80
    +    false
    +    242
    +    362
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TB0
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    9
    +    316
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TB3
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    9
    +    385
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TB2
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    9
    +    362
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TB1
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    9
    +    339
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TIB2
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    183
    +    362
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Truncate size
    +    
    +    true
    +    1
    +    true
    +    Label
    +    104
    +    false
    +    242
    +    385
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).TSIZ
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    50
    +    183
    +    385
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).TMSK
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    70
    +    9
    +    293
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    drvInfo:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    80
    +    false
    +    6
    +    97
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    4
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).DRVINFO
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    150
    +    88
    +    97
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).IFACE
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    130
    +    111
    +    122
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Interface:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    100
    +    false
    +    6
    +    122
    +  
    +  
    +    
    +      
    +        $(P)$(R).AQR
    +        1
    +        10
    +        
    +        
    +      
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Action Button
    +    0
    +    $(P)$(R).AQR
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +    Cancel queueRequest
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Action Button
    +    150
    +    6
    +    147
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Reason:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    244
    +    97
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).REASON
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    50
    +    318
    +    97
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).CNCT
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Connected
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    25
    +    212
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).CNCT
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Disconnected
    +    
    +    true
    +    1
    +    true
    +    Label
    +    120
    +    false
    +    10
    +    212
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).CNCT
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    120
    +    10
    +    234
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Port:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    50
    +    false
    +    6
    +    47
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    4
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).PORT
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    150
    +    61
    +    47
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Address:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    80
    +    false
    +    228
    +    47
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).ADDR
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    110
    +    318
    +    47
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).PCNCT
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    120
    +    61
    +    72
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).PCNCT
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Connected
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    243
    +    72
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).PCNCT
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Disconnected
    +    
    +    true
    +    1
    +    true
    +    Label
    +    120
    +    false
    +    228
    +    72
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    More...
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    291
    +    147
    +  
    +  
    +    
    +      
    +        asynOctet.opi
    +        
    +          true
    +        
    +        1
    +        asynOctet Interface I/O
    +      
    +      
    +        asynRegister.opi
    +        
    +          true
    +        
    +        1
    +        Register interfaces I/O
    +      
    +      
    +        asynSerialPortSetup.opi
    +        
    +          true
    +        
    +        1
    +        Serial port parameters
    +      
    +      
    +        asynIPPortSetup.opi
    +        
    +          true
    +        
    +        1
    +        IP port parameters
    +      
    +      
    +        asynGPIBSetup.opi
    +        
    +          true
    +        
    +        1
    +        GPIB parameters
    +      
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    56
    +    366
    +    147
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceIOMask
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    183
    +    269
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceIOASCII
    +    
    +    true
    +    1
    +    true
    +    Label
    +    96
    +    false
    +    242
    +    316
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceIOEscape
    +    
    +    true
    +    1
    +    true
    +    Label
    +    104
    +    false
    +    242
    +    339
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TIB0
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    183
    +    316
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TIB1
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    183
    +    339
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).TIOM
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    70
    +    183
    +    293
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceInfoMask
    +    
    +    true
    +    1
    +    true
    +    Label
    +    130
    +    false
    +    183
    +    415
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).TINM
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    70
    +    183
    +    439
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Trace file:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    88
    +    false
    +    9
    +    557
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    4
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).TFIL
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    330
    +    99
    +    555
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TB4
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    9
    +    408
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceFlow
    +    
    +    true
    +    1
    +    true
    +    Label
    +    72
    +    false
    +    68
    +    408
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TB5
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    9
    +    431
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceWarning
    +    
    +    true
    +    1
    +    true
    +    Label
    +    96
    +    false
    +    68
    +    431
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceInfoPort
    +    
    +    true
    +    1
    +    true
    +    Label
    +    104
    +    false
    +    242
    +    485
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TINB1
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    183
    +    485
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceInfoSource
    +    
    +    true
    +    1
    +    true
    +    Label
    +    120
    +    false
    +    242
    +    508
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TINB2
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    183
    +    508
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceInfoTime
    +    
    +    true
    +    1
    +    true
    +    Label
    +    104
    +    false
    +    242
    +    462
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TINB0
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    183
    +    462
    +  
    +  
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    18
    +    true
    +    
    +      Choice 1
    +      Choice 2
    +      Choice 3
    +    
    +    true
    +    Choice Button
    +    $(P)$(R).TINB3
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +      
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Choice Button
    +    55
    +    183
    +    531
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    18
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    traceInfoThread
    +    
    +    true
    +    1
    +    true
    +    Label
    +    120
    +    false
    +    242
    +    531
    +  
    +
    diff --git a/opi/boy/autoconvert/asynRegister.opi b/opi/boy/autoconvert/asynRegister.opi
    new file mode 100644
    index 0000000..efc9164
    --- /dev/null
    +++ b/opi/boy/autoconvert/asynRegister.opi
    @@ -0,0 +1,2440 @@
    +
    +  
    +  
    +    false
    +    -1
    +    -1
    +  
    +  false
    +  
    +    
    +  
    +  5.1.0.201801081728
    +  
    +    
    +  
    +  5
    +  345
    +  
    +    true
    +  
    +  asynRegister
    +  
    +  
    +  true
    +  true
    +  false
    +  true
    +  false
    +  Display
    +  510
    +  344
    +  142
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    0.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    25
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    true
    +    Rectangle
    +    430
    +    6
    +    279
    +  
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    100.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    29
    +    true
    +    
    +      
    +    
    +    0
    +    0
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Rectangle
    +    510
    +    0
    +    5
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Timeout (sec):
    +    
    +    true
    +    1
    +    true
    +    Label
    +    140
    +    false
    +    6
    +    43
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).TMOT
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    50
    +    151
    +    43
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).TMOD
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    110
    +    320
    +    43
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Transfer:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    225
    +    43
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    I/O Status:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    10
    +    284
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    I/O Severity:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    130
    +    false
    +    217
    +    284
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    4
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).STAT
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    85
    +    false
    +    122
    +    284
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    4
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).SEVR
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    85
    +    false
    +    349
    +    284
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Scan:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    50
    +    false
    +    9
    +    310
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).SCAN
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    110
    +    64
    +    310
    +  
    +  
    +    
    +      
    +        $(P)$(R).PROC
    +        1
    +        10
    +        
    +        
    +      
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Action Button
    +    0
    +    $(P)$(R).PROC
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +    Process
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Action Button
    +    80
    +    179
    +    310
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    21
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(P)$(R)
    +    
    +    true
    +    1
    +    true
    +    Label
    +    510
    +    false
    +    0
    +    9
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Mask (hex):
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    27
    +    251
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Input (hex):
    +    
    +    true
    +    1
    +    true
    +    Label
    +    120
    +    false
    +    17
    +    226
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Input:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    60
    +    false
    +    77
    +    201
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Output (hex):
    +    
    +    true
    +    1
    +    true
    +    Label
    +    130
    +    false
    +    7
    +    176
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Output:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    67
    +    151
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).IFACE
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    130
    +    5
    +    101
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Interface:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    100
    +    false
    +    37
    +    76
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).I32INP
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    100
    +    false
    +    147
    +    226
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).I32INP
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    100
    +    false
    +    147
    +    201
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).I32OUT
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    100
    +    147
    +    176
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).I32OUT
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    100
    +    147
    +    151
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).IFACE
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Active
    +    
    +    true
    +    1
    +    true
    +    Label
    +    60
    +    false
    +    167
    +    126
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).IFACE
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Inactive
    +    
    +    true
    +    1
    +    true
    +    Label
    +    80
    +    false
    +    157
    +    126
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).I32IV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Supported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    152
    +    101
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).I32IV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Unsupported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    142
    +    101
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Int32
    +    
    +    true
    +    1
    +    true
    +    Label
    +    50
    +    false
    +    172
    +    76
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).UI32MASK
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    100
    +    272
    +    251
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).UI32INP
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    100
    +    false
    +    272
    +    226
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).UI32INP
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    100
    +    false
    +    272
    +    201
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).UI32OUT
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    100
    +    272
    +    176
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).UI32OUT
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    100
    +    272
    +    151
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).IFACE
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Active
    +    
    +    true
    +    1
    +    true
    +    Label
    +    60
    +    false
    +    292
    +    126
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).IFACE
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Inactive
    +    
    +    true
    +    1
    +    true
    +    Label
    +    80
    +    false
    +    282
    +    126
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).UI32IV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Unsupported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    267
    +    101
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).UI32IV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Supported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    277
    +    101
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    UInt32Digital
    +    
    +    true
    +    1
    +    true
    +    Label
    +    130
    +    false
    +    257
    +    76
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).F64INP
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    100
    +    false
    +    397
    +    201
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).F64OUT
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    100
    +    397
    +    151
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).IFACE
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Active
    +    
    +    true
    +    1
    +    true
    +    Label
    +    60
    +    false
    +    417
    +    126
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).IFACE
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Inactive
    +    
    +    true
    +    1
    +    true
    +    Label
    +    80
    +    false
    +    407
    +    126
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).F64IV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Unsupported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    392
    +    101
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).F64IV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Supported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    402
    +    101
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Float64
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    412
    +    76
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    More...
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    364
    +    310
    +  
    +  
    +    
    +      
    +        asynRecord.opi
    +        
    +          true
    +        
    +        1
    +        Record parameters
    +      
    +      
    +        asynRegister.opi
    +        
    +          true
    +        
    +        1
    +        Register interfaces I/O
    +      
    +      
    +        asynSerialPortSetup.opi
    +        
    +          true
    +        
    +        1
    +        Serial port parameters
    +      
    +      
    +        asynGPIBSetup.opi
    +        
    +          true
    +        
    +        1
    +        GPIB parameters
    +      
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    56
    +    439
    +    310
    +  
    +
    diff --git a/opi/boy/autoconvert/asynSerialPortSetup.opi b/opi/boy/autoconvert/asynSerialPortSetup.opi
    new file mode 100644
    index 0000000..379762c
    --- /dev/null
    +++ b/opi/boy/autoconvert/asynSerialPortSetup.opi
    @@ -0,0 +1,1128 @@
    +
    +  
    +  
    +    false
    +    -1
    +    -1
    +  
    +  false
    +  
    +    
    +  
    +  5.1.0.201801081728
    +  
    +    
    +  
    +  5
    +  300
    +  
    +    true
    +  
    +  asynSerialPortSetup
    +  
    +  
    +  true
    +  true
    +  false
    +  true
    +  false
    +  Display
    +  260
    +  228
    +  79
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    100.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    16
    +    true
    +    
    +      
    +    
    +    0
    +    0
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Rectangle
    +    260
    +    0
    +    2
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    16
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(P)$(R)
    +    
    +    true
    +    1
    +    true
    +    Label
    +    260
    +    false
    +    0
    +    2
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).OPTIONIV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Supported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    148
    +    25
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).OPTIONIV
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Unsupported
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    138
    +    25
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    asynOption:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    8
    +    25
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Baud rate:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    100
    +    false
    +    43
    +    51
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).BAUD
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    51
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Baud rate:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    100
    +    false
    +    43
    +    76
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Data bits:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    100
    +    false
    +    43
    +    101
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Stop bits:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    100
    +    false
    +    43
    +    126
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Modem control:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    140
    +    false
    +    3
    +    176
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Parity:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    70
    +    false
    +    73
    +    151
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).DBIT
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    101
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).SBIT
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    126
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).PRTY
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    151
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).MCTL
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    176
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Flow control:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    130
    +    false
    +    13
    +    201
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).FCTL
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    201
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    XOFF output:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    120
    +    false
    +    23
    +    226
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).IXON
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    226
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    XOFF input:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    110
    +    false
    +    33
    +    251
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).IXOFF
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    251
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    XON=any:
    +    
    +    true
    +    1
    +    true
    +    Label
    +    80
    +    false
    +    63
    +    276
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R).IXANY
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    102
    +    150
    +    276
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    3
    +    1
    +    
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    18
    +    0
    +    false
    +    Infinity
    +    -Infinity
    +    false
    +    Text Input
    +    0
    +    false
    +    0
    +    true
    +    $(P)$(R).LBAUD
    +    
    +    false
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    0
    +    false
    +    true
    +    false
    +    false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Text Input
    +    102
    +    150
    +    76
    +  
    +
    diff --git a/opi/boy/autoconvert/asynTimeSeries.opi b/opi/boy/autoconvert/asynTimeSeries.opi
    new file mode 100644
    index 0000000..1f294d4
    --- /dev/null
    +++ b/opi/boy/autoconvert/asynTimeSeries.opi
    @@ -0,0 +1,1225 @@
    +
    +  
    +  
    +    false
    +    -1
    +    -1
    +  
    +  false
    +  
    +    
    +  
    +  5.1.0.201801081728
    +  
    +    
    +  
    +  5
    +  360
    +  
    +    true
    +  
    +  asynTimeSeries
    +  
    +  
    +  true
    +  true
    +  false
    +  true
    +  false
    +  Display
    +  500
    +  326
    +  179
    +  
    +    
    +    false
    +    255
    +    true
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    100.0
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    false
    +    25
    +    true
    +    
    +      
    +    
    +    0
    +    0
    +    Rectangle
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Rectangle
    +    500
    +    0
    +    5
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    25
    +    1
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(P)$(R)
    +    
    +    true
    +    1
    +    true
    +    Label
    +    500
    +    false
    +    0
    +    5
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).BUSY
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Acquiring
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    42
    +    40
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    1
    +    Label
    +    
    +      
    +        
    +          true
    +        
    +        
    +          false
    +        
    +        $(P)$(R).BUSY
    +      
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Done
    +    
    +    true
    +    1
    +    true
    +    Label
    +    40
    +    false
    +    95
    +    40
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Status
    +    
    +    true
    +    1
    +    true
    +    Label
    +    60
    +    false
    +    142
    +    40
    +  
    +  
    +    
    +    false
    +    false
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    1
    +    20
    +    0
    +    Text Update
    +    0
    +    true
    +    $(P)$(R).NORD
    +    
    +    0.0
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    ######
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    1
    +    true
    +    Text Update
    +    100
    +    false
    +    224
    +    40
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Current point
    +    
    +    true
    +    1
    +    true
    +    Label
    +    130
    +    false
    +    329
    +    40
    +  
    +  
    +    
    +    false
    +    true
    +    0.0
    +    
    +      
    +    
    +    Time point
    +    true
    +    
    +      
    +    
    +    false
    +    100.0
    +    0.0
    +    
    +      Default
    +    
    +    
    +    true
    +    0
    +    
    +      Default Bold
    +    
    +    true
    +    true
    +    0.0
    +    
    +      
    +    
    +    Value
    +    true
    +    
    +      
    +    
    +    false
    +    100.0
    +    0.0
    +    
    +      Default
    +    
    +    
    +    true
    +    0
    +    
    +      Default Bold
    +    
    +    true
    +    true
    +    0.0
    +    
    +      
    +    
    +    Secondary Axis (2)
    +    true
    +    
    +      
    +    
    +    true
    +    false
    +    100.0
    +    0.0
    +    
    +      Default
    +    
    +    
    +    true
    +    0
    +    
    +      Default Bold
    +    
    +    true
    +    true
    +    true
    +    0.0
    +    
    +      
    +    
    +    Secondary Axis (3)
    +    true
    +    
    +      
    +    
    +    true
    +    false
    +    100.0
    +    0.0
    +    
    +      Default
    +    
    +    
    +    true
    +    0
    +    
    +      Default Bold
    +    
    +    true
    +    true
    +    2
    +    false
    +    
    +      
    +    
    +    true
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    false
    +    
    +      
    +    
    +    230
    +    XY Graph
    +    
    +      
    +    
    +    
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    true
    +    false
    +    true
    +    $(P)$(R)
    +    
    +      Default Bold
    +    
    +    $(trace_0_y_pv)
    +$(trace_0_y_pv_value)
    +    true
    +    100
    +    true
    +    1
    +    $(trace_0_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    $(pv_name)
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_10_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_11_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_12_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_13_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_14_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_15_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_16_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_17_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_18_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_19_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_1_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_2_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_3_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_4_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_5_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_6_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_7_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_8_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    true
    +    100
    +    true
    +    1
    +    $(trace_9_y_pv)
    +    0
    +    4
    +    0
    +    
    +      
    +    
    +    0
    +    100
    +    0
    +    true
    +    0
    +    
    +    
    +    1
    +    
    +    
    +    1
    +    false
    +    
    +    
    +    true
    +    XY Graph
    +    480
    +    10
    +    92
    +  
    +  
    +    
    +      
    +        $(P)$(R).RARM
    +        1
    +        10
    +        
    +        
    +      
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Action Button
    +    0
    +    $(P)$(R).RARM
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +    Erase/Start
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Action Button
    +    90
    +    15
    +    65
    +  
    +  
    +    
    +      
    +        $(P)$(R).RARM
    +        3
    +        10
    +        
    +        
    +      
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Action Button
    +    0
    +    $(P)$(R).RARM
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +    Start
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Action Button
    +    90
    +    110
    +    65
    +  
    +  
    +    
    +      
    +        $(P)$(R).RARM
    +        2
    +        10
    +        
    +        
    +      
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Action Button
    +    0
    +    $(P)$(R).RARM
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +    Stop
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Action Button
    +    90
    +    205
    +    65
    +  
    +  
    +    
    +    true
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    6
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Menu Button
    +    $(P)$(R)Read.SCAN
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    false
    +    true
    +    Menu Button
    +    100
    +    10
    +    329
    +  
    +  
    +    
    +    false
    +    
    +      
    +    
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      
    +    
    +    
    +      
    +    
    +    20
    +    0
    +    Label
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    false
    +    Read rate
    +    
    +    true
    +    1
    +    true
    +    Label
    +    90
    +    false
    +    117
    +    329
    +  
    +  
    +    
    +      
    +        $(P)$(R)Read.PROC
    +        1
    +        10
    +        
    +        
    +      
    +    
    +    false
    +    false
    +    
    +      
    +    
    +    false
    +    
    +      
    +    
    +    0
    +    1
    +    true
    +    
    +      Default
    +    
    +    false
    +    
    +      
    +    
    +    20
    +    
    +    Action Button
    +    0
    +    $(P)$(R)Read.PROC
    +    
    +    
    +    
    +      true
    +      true
    +      false
    +    
    +    
    +    
    +    Read
    +    false
    +    $(pv_name)
    +$(pv_value)
    +    true
    +    Action Button
    +    50
    +    217
    +    329
    +  
    +
    diff --git a/opi/caqtdm/autoconvert/asynGPIBSetup.ui b/opi/caqtdm/autoconvert/asynGPIBSetup.ui
    new file mode 100644
    index 0000000..02dd27c
    --- /dev/null
    +++ b/opi/caqtdm/autoconvert/asynGPIBSetup.ui
    @@ -0,0 +1,622 @@
    +
    +
    +MainWindow
    +
    +    
    +        
    +            456
    +            239
    +            375
    +            185
    +        
    +    
    +    
    +        
    +
    +QWidget#centralWidget {background: rgba(187, 187, 187, 255);}
    +
    +caTable {
    +       font: 10pt;
    +       background: cornsilk;
    +       alternate-background-color: wheat;
    +}
    +
    +caLineEdit {
    +     border-radius: 1px;
    +     background: lightyellow;
    +     color: black;
    + }
    +
    +caTextEntry {
    +    color: rgb(127, 0, 63);
    +    background-color: cornsilk;
    +    selection-color: #0a214c;
    +    selection-background-color: wheat;
    +    border: 1px groove black;
    +    border-radius: 1px;
    +    padding: 1px;
    +}
    +
    +caTextEntry:focus {
    +    padding: 0px;
    +    border: 2px groove darkred;
    +    border-radius: 1px;
    +}
    +
    +QPushButton {
    +      border-color: #00b;
    +      border-radius: 2px;
    +      padding: 3px;
    +      border-width: 1px;
    +
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						   stop:0   rgba(224, 239, 255, 255),
    +						   stop:0.5 rgba(199, 215, 230, 255),
    +						   stop:1   rgba(184, 214, 236, 255));
    +}
    +QPushButton:hover {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(201, 226, 255, 255),
    +						stop:0.5 rgba(177, 204, 230, 255),
    +						stop:1   rgba(163, 205, 236, 255));
    +}
    +QPushButton:pressed {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +QPushButton:disabled {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +caChoice {
    +      background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
    +                                  stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
    +                                  stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
    +}
    +
    +caChoice > QPushButton {
    +      text-align: left;
    +      padding: 1px;
    +}
    +
    +caSlider::groove:horizontal {
    +border: 1px solid #bbb;
    +background: lightgrey;
    +height: 20px;
    +border-radius: 4px;
    +}
    +
    +caSlider::handle:horizontal {
    +background: red;
    +border: 1px solid #777;
    +width: 13px;
    +margin-top: -2px;
    +margin-bottom: -2px;
    +border-radius: 2px;
    +}
    +
    +
    +
    +
    +    
    +    
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    0
    +                    8
    +                    375
    +                    29
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                Filled
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                $(P)$(R)
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter
    +            
    +            
    +                
    +                    0
    +                    12
    +                    375
    +                    25
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                GPIB address:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    4
    +                    68
    +                    130
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    139
    +                    68
    +                    75
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).ADDR
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Serial poll response:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    4
    +                    97
    +                    210
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    224
    +                    97
    +                    56
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).SPR
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                hexadecimal
    +            
    +            
    +                caLineEdit::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Universal Command
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    4
    +                    126
    +                    170
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    179
    +                    126
    +                    180
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).UCMD
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Addressed Command
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    4
    +                    151
    +                    170
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    179
    +                    151
    +                    180
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).ACMD
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                caLabel::IfNotZero
    +            
    +            
    +                $(P)$(R).GPIBIV
    +            
    +            
    +                Supported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    218
    +                    42
    +                    90
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                caLabel::IfZero
    +            
    +            
    +                $(P)$(R).GPIBIV
    +            
    +            
    +                Unsupported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    208
    +                    42
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                asynGpib interface:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    4
    +                    42
    +                    190
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        caRectangle_0
    +        caLabel_0
    +        caLabel_1
    +        caLabel_2
    +        caLabel_3
    +        caLabel_4
    +        caLabel_5
    +        caLabel_6
    +        caLabel_7
    +        caTextEntry_0
    +        caLineEdit_0
    +        caMenu_0
    +        caMenu_1
    +    
    +
    +
    \ No newline at end of file
    diff --git a/opi/caqtdm/autoconvert/asynIPPortSetup.ui b/opi/caqtdm/autoconvert/asynIPPortSetup.ui
    new file mode 100644
    index 0000000..c743187
    --- /dev/null
    +++ b/opi/caqtdm/autoconvert/asynIPPortSetup.ui
    @@ -0,0 +1,1206 @@
    +
    +
    +MainWindow
    +
    +    
    +        
    +            405
    +            149
    +            260
    +            410
    +        
    +    
    +    
    +        
    +
    +QWidget#centralWidget {background: rgba(187, 187, 187, 255);}
    +
    +caTable {
    +       font: 10pt;
    +       background: cornsilk;
    +       alternate-background-color: wheat;
    +}
    +
    +caLineEdit {
    +     border-radius: 1px;
    +     background: lightyellow;
    +     color: black;
    + }
    +
    +caTextEntry {
    +    color: rgb(127, 0, 63);
    +    background-color: cornsilk;
    +    selection-color: #0a214c;
    +    selection-background-color: wheat;
    +    border: 1px groove black;
    +    border-radius: 1px;
    +    padding: 1px;
    +}
    +
    +caTextEntry:focus {
    +    padding: 0px;
    +    border: 2px groove darkred;
    +    border-radius: 1px;
    +}
    +
    +QPushButton {
    +      border-color: #00b;
    +      border-radius: 2px;
    +      padding: 3px;
    +      border-width: 1px;
    +
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						   stop:0   rgba(224, 239, 255, 255),
    +						   stop:0.5 rgba(199, 215, 230, 255),
    +						   stop:1   rgba(184, 214, 236, 255));
    +}
    +QPushButton:hover {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(201, 226, 255, 255),
    +						stop:0.5 rgba(177, 204, 230, 255),
    +						stop:1   rgba(163, 205, 236, 255));
    +}
    +QPushButton:pressed {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +QPushButton:disabled {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +caChoice {
    +      background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
    +                                  stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
    +                                  stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
    +}
    +
    +caChoice > QPushButton {
    +      text-align: left;
    +      padding: 1px;
    +}
    +
    +caSlider::groove:horizontal {
    +border: 1px solid #bbb;
    +background: lightgrey;
    +height: 20px;
    +border-radius: 4px;
    +}
    +
    +caSlider::handle:horizontal {
    +background: red;
    +border: 1px solid #777;
    +width: 13px;
    +margin-top: -2px;
    +margin-bottom: -2px;
    +border-radius: 2px;
    +}
    +
    +
    +
    +
    +    
    +    
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    0
    +                    2
    +                    260
    +                    16
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                Filled
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                $(P)$(R)
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter
    +            
    +            
    +                
    +                    0
    +                    2
    +                    260
    +                    16
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                caLabel::IfNotZero
    +            
    +            
    +                $(P)$(R).OPTIONIV
    +            
    +            
    +                Supported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    148
    +                    25
    +                    90
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                caLabel::IfZero
    +            
    +            
    +                $(P)$(R).OPTIONIV
    +            
    +            
    +                Unsupported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    138
    +                    25
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                asynOption:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    8
    +                    25
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Disconnect on
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    13
    +                    51
    +                    130
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                read timeout:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    13
    +                    76
    +                    130
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Host info:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    43
    +                    101
    +                    100
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    101
    +                    102
    +                    18
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).HOSTINFO
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                string
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    76
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).DRTO
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Data bits:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    43
    +                    206
    +                    100
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Stop bits:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    43
    +                    231
    +                    100
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Modem control:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    3
    +                    281
    +                    140
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Parity:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    73
    +                    256
    +                    70
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    206
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).DBIT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    231
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).SBIT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    256
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).PRTY
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    281
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).MCTL
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Flow control:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    13
    +                    306
    +                    130
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    306
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).FCTL
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                XOFF output:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    23
    +                    331
    +                    120
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    331
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).IXON
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                XOFF input:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    33
    +                    356
    +                    110
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    356
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).IXOFF
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                XON=any:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    63
    +                    381
    +                    80
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    381
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).IXANY
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Baud rate:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    43
    +                    181
    +                    100
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    181
    +                    102
    +                    18
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).LBAUD
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                COM (RFC 2217) protocol
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    15
    +                    151
    +                    230
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Parameters for ports with
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    5
    +                    130
    +                    250
    +                    20
    +                
    +            
    +        
    +        caRectangle_0
    +        caLabel_0
    +        caLabel_1
    +        caLabel_2
    +        caLabel_3
    +        caLabel_4
    +        caLabel_5
    +        caLabel_6
    +        caLabel_7
    +        caLabel_8
    +        caLabel_9
    +        caLabel_10
    +        caLabel_11
    +        caLabel_12
    +        caLabel_13
    +        caLabel_14
    +        caLabel_15
    +        caLabel_16
    +        caLabel_17
    +        caTextEntry_0
    +        caMenu_0
    +        caMenu_1
    +        caMenu_2
    +        caMenu_3
    +        caMenu_4
    +        caMenu_5
    +        caMenu_6
    +        caMenu_7
    +        caMenu_8
    +        caTextEntry_1
    +    
    +
    +
    \ No newline at end of file
    diff --git a/opi/caqtdm/autoconvert/asynOctet.ui b/opi/caqtdm/autoconvert/asynOctet.ui
    new file mode 100644
    index 0000000..0ee16b3
    --- /dev/null
    +++ b/opi/caqtdm/autoconvert/asynOctet.ui
    @@ -0,0 +1,2172 @@
    +
    +
    +MainWindow
    +
    +    
    +        
    +            457
    +            494
    +            442
    +            350
    +        
    +    
    +    
    +        
    +
    +QWidget#centralWidget {background: rgba(187, 187, 187, 255);}
    +
    +caTable {
    +       font: 10pt;
    +       background: cornsilk;
    +       alternate-background-color: wheat;
    +}
    +
    +caLineEdit {
    +     border-radius: 1px;
    +     background: lightyellow;
    +     color: black;
    + }
    +
    +caTextEntry {
    +    color: rgb(127, 0, 63);
    +    background-color: cornsilk;
    +    selection-color: #0a214c;
    +    selection-background-color: wheat;
    +    border: 1px groove black;
    +    border-radius: 1px;
    +    padding: 1px;
    +}
    +
    +caTextEntry:focus {
    +    padding: 0px;
    +    border: 2px groove darkred;
    +    border-radius: 1px;
    +}
    +
    +QPushButton {
    +      border-color: #00b;
    +      border-radius: 2px;
    +      padding: 3px;
    +      border-width: 1px;
    +
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						   stop:0   rgba(224, 239, 255, 255),
    +						   stop:0.5 rgba(199, 215, 230, 255),
    +						   stop:1   rgba(184, 214, 236, 255));
    +}
    +QPushButton:hover {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(201, 226, 255, 255),
    +						stop:0.5 rgba(177, 204, 230, 255),
    +						stop:1   rgba(163, 205, 236, 255));
    +}
    +QPushButton:pressed {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +QPushButton:disabled {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +caChoice {
    +      background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
    +                                  stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
    +                                  stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
    +}
    +
    +caChoice > QPushButton {
    +      text-align: left;
    +      padding: 1px;
    +}
    +
    +caSlider::groove:horizontal {
    +border: 1px solid #bbb;
    +background: lightgrey;
    +height: 20px;
    +border-radius: 4px;
    +}
    +
    +caSlider::handle:horizontal {
    +background: red;
    +border: 1px solid #777;
    +width: 13px;
    +margin-top: -2px;
    +margin-bottom: -2px;
    +border-radius: 2px;
    +}
    +
    +
    +
    +
    +    
    +    
    +        
    +            
    +                
    +                    81
    +                    216
    +                    350
    +                    18
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).TINP
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    187
    +                    187
    +                    187
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                string
    +            
    +            
    +                caLineEdit::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Timeout (sec):
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    6
    +                    43
    +                    140
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    151
    +                    43
    +                    50
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).TMOT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        
    +            
    +                
    +                    320
    +                    43
    +                    110
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).TMOD
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Transfer:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    225
    +                    43
    +                    90
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    0
    +                    5
    +                    442
    +                    29
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                Filled
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                $(P)$(R)
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter
    +            
    +            
    +                
    +                    0
    +                    9
    +                    442
    +                    21
    +                
    +            
    +        
    +        
    +            
    +                
    +                    78
    +                    128
    +                    350
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).AOUT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                string
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    88
    +                    147
    +                    255
    +                
    +            
    +            
    +                
    +                    88
    +                    147
    +                    255
    +                
    +            
    +            
    +                Output
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    13
    +                    99
    +                    60
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Format:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    91
    +                    99
    +                    70
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    166
    +                    99
    +                    80
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).OFMT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                ASCII:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    13
    +                    126
    +                    60
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    6
    +                    92
    +                    430
    +                    85
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Terminator:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    256
    +                    99
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    371
    +                    99
    +                    60
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).OEOS
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                string
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Requested:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    88
    +                    152
    +                    100
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Length:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    10
    +                    152
    +                    70
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Actual:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    280
    +                    152
    +                    70
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    355
    +                    152
    +                    56
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).NAWT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                decimal
    +            
    +            
    +                caLineEdit::Static
    +            
    +        
    +        
    +            
    +                
    +                    193
    +                    152
    +                    70
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).NOWT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                I/O Status:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    10
    +                    297
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                I/O Severity:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    217
    +                    297
    +                    130
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    122
    +                    297
    +                    85
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).STAT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                string
    +            
    +            
    +                caLineEdit::Alarm_Static
    +            
    +        
    +        
    +            
    +                
    +                    349
    +                    297
    +                    85
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).SEVR
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                string
    +            
    +            
    +                caLineEdit::Alarm_Static
    +            
    +        
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    6
    +                    292
    +                    430
    +                    25
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Scan:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    9
    +                    323
    +                    50
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    64
    +                    323
    +                    110
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).SCAN
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                
    +                    179
    +                    323
    +                    80
    +                    20
    +                
    +            
    +            
    +                EPushButton::WidthAndHeight
    +            
    +            
    +                $(P)$(R).PROC
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Process
    +            
    +            
    +                1
    +            
    +            
    +                caMessageButton::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Terminator:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    253
    +                    189
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    368
    +                    189
    +                    60
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).IEOS
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                string
    +            
    +        
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    74
    +                    213
    +                    360
    +                    21
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    88
    +                    147
    +                    255
    +                
    +            
    +            
    +                
    +                    88
    +                    147
    +                    255
    +                
    +            
    +            
    +                Input
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    16
    +                    189
    +                    50
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Format:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    86
    +                    191
    +                    70
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    161
    +                    189
    +                    80
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).IFMT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                ASCII:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    13
    +                    215
    +                    60
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    6
    +                    182
    +                    430
    +                    105
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Requested:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    88
    +                    242
    +                    100
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Length:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    10
    +                    242
    +                    70
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Actual:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    280
    +                    242
    +                    70
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    355
    +                    242
    +                    56
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).NORD
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    187
    +                    187
    +                    187
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                decimal
    +            
    +            
    +                caLineEdit::Static
    +            
    +        
    +        
    +            
    +                
    +                    193
    +                    242
    +                    70
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).NRRD
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                EOM reason:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    77
    +                    265
    +                    110
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    193
    +                    265
    +                    70
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).EOMR
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                string
    +            
    +            
    +                caLineEdit::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                caLabel::IfNotZero
    +            
    +            
    +                $(P)$(R).OCTETIV
    +            
    +            
    +                Supported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    220
    +                    66
    +                    90
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                caLabel::IfZero
    +            
    +            
    +                $(P)$(R).OCTETIV
    +            
    +            
    +                Unsupported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    210
    +                    66
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                asynOctet interface:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    6
    +                    66
    +                    200
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                caLabel::Calc
    +            
    +            
    +                A=0
    +            
    +            
    +                $(P)$(R).IFACE
    +            
    +            
    +                Active
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    344
    +                    66
    +                    60
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                caLabel::Calc
    +            
    +            
    +                !(A=0)
    +            
    +            
    +                $(P)$(R).IFACE
    +            
    +            
    +                Inactive
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    334
    +                    66
    +                    80
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                More...
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    300
    +                    323
    +                    70
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    375
    +                    323
    +                    56
    +                    20
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Menu
    +            
    +            
    +                Record parameters;Register interfaces I/O;Serial port parameters;GPIB parameters
    +            
    +            
    +                asynRecord.adl;asynRegister.adl;asynSerialPortSetup.adl;asynGPIBSetup.adl
    +            
    +            
    +                P=$(P),R=$(R);P=$(P),R=$(R);P=$(P),R=$(R);P=$(P),R=$(R)
    +            
    +            
    +                false;false;false;false
    +            
    +        
    +        caLabel_0
    +        caLabel_1
    +        caRectangle_0
    +        caLabel_2
    +        caLabel_3
    +        caLabel_4
    +        caLabel_5
    +        caRectangle_1
    +        caLabel_6
    +        caLabel_7
    +        caLabel_8
    +        caLabel_9
    +        caLabel_10
    +        caLabel_11
    +        caRectangle_2
    +        caLabel_12
    +        caLabel_13
    +        caRectangle_3
    +        caLabel_14
    +        caLabel_15
    +        caLabel_16
    +        caRectangle_4
    +        caLabel_17
    +        caLabel_18
    +        caLabel_19
    +        caLabel_20
    +        caLabel_21
    +        caLabel_22
    +        caLabel_23
    +        caLabel_24
    +        caLabel_25
    +        caLabel_26
    +        caLineEdit_0
    +        caTextEntry_0
    +        caMenu_0
    +        caTextEntry_1
    +        caMenu_1
    +        caTextEntry_2
    +        caLineEdit_1
    +        caTextEntry_3
    +        caLineEdit_2
    +        caLineEdit_3
    +        caMenu_2
    +        caMessageButton_0
    +        caTextEntry_4
    +        caMenu_3
    +        caLineEdit_4
    +        caTextEntry_5
    +        caLineEdit_5
    +        caRelatedDisplay_0
    +    
    +
    +
    \ No newline at end of file
    diff --git a/opi/caqtdm/autoconvert/asynRecord.ui b/opi/caqtdm/autoconvert/asynRecord.ui
    new file mode 100644
    index 0000000..9ee4347
    --- /dev/null
    +++ b/opi/caqtdm/autoconvert/asynRecord.ui
    @@ -0,0 +1,2765 @@
    +
    +
    +MainWindow
    +
    +    
    +        
    +            72
    +            61
    +            440
    +            589
    +        
    +    
    +    
    +        
    +
    +QWidget#centralWidget {background: rgba(187, 187, 187, 255);}
    +
    +caTable {
    +       font: 10pt;
    +       background: cornsilk;
    +       alternate-background-color: wheat;
    +}
    +
    +caLineEdit {
    +     border-radius: 1px;
    +     background: lightyellow;
    +     color: black;
    + }
    +
    +caTextEntry {
    +    color: rgb(127, 0, 63);
    +    background-color: cornsilk;
    +    selection-color: #0a214c;
    +    selection-background-color: wheat;
    +    border: 1px groove black;
    +    border-radius: 1px;
    +    padding: 1px;
    +}
    +
    +caTextEntry:focus {
    +    padding: 0px;
    +    border: 2px groove darkred;
    +    border-radius: 1px;
    +}
    +
    +QPushButton {
    +      border-color: #00b;
    +      border-radius: 2px;
    +      padding: 3px;
    +      border-width: 1px;
    +
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						   stop:0   rgba(224, 239, 255, 255),
    +						   stop:0.5 rgba(199, 215, 230, 255),
    +						   stop:1   rgba(184, 214, 236, 255));
    +}
    +QPushButton:hover {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(201, 226, 255, 255),
    +						stop:0.5 rgba(177, 204, 230, 255),
    +						stop:1   rgba(163, 205, 236, 255));
    +}
    +QPushButton:pressed {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +QPushButton:disabled {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +caChoice {
    +      background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
    +                                  stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
    +                                  stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
    +}
    +
    +caChoice > QPushButton {
    +      text-align: left;
    +      padding: 1px;
    +}
    +
    +caSlider::groove:horizontal {
    +border: 1px solid #bbb;
    +background: lightgrey;
    +height: 20px;
    +border-radius: 4px;
    +}
    +
    +caSlider::handle:horizontal {
    +background: red;
    +border: 1px solid #777;
    +width: 13px;
    +margin-top: -2px;
    +margin-bottom: -2px;
    +border-radius: 2px;
    +}
    +
    +
    +
    +
    +    
    +    
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    0
    +                    8
    +                    440
    +                    29
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                Filled
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                $(P)$(R)
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter
    +            
    +            
    +                
    +                    0
    +                    12
    +                    440
    +                    21
    +                
    +            
    +        
    +        
    +            
    +                
    +                    75
    +                    182
    +                    359
    +                    16
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).ERRS
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                string
    +            
    +            
    +                caLineEdit::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Error:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    10
    +                    181
    +                    60
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    6
    +                    178
    +                    430
    +                    25
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    251
    +                    243
    +                    74
    +                
    +            
    +            
    +                
    +                    251
    +                    243
    +                    74
    +                
    +            
    +            
    +                caLabel::IfZero
    +            
    +            
    +                $(P)$(R).AUCT
    +            
    +            
    +                noAutoConnect
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    300
    +                    212
    +                    130
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    60
    +                    180
    +                    32
    +                
    +            
    +            
    +                
    +                    60
    +                    180
    +                    32
    +                
    +            
    +            
    +                caLabel::IfNotZero
    +            
    +            
    +                $(P)$(R).AUCT
    +            
    +            
    +                autoConnect
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    310
    +                    212
    +                    110
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    305
    +                    233
    +                    120
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).AUCT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    60
    +                    180
    +                    32
    +                
    +            
    +            
    +                
    +                    60
    +                    180
    +                    32
    +                
    +            
    +            
    +                caLabel::IfNotZero
    +            
    +            
    +                $(P)$(R).ENBL
    +            
    +            
    +                Enabled
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    180
    +                    212
    +                    70
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    253
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    253
    +                    0
    +                    0
    +                
    +            
    +            
    +                caLabel::IfZero
    +            
    +            
    +                $(P)$(R).ENBL
    +            
    +            
    +                Disabled
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    175
    +                    212
    +                    80
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    155
    +                    234
    +                    120
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).ENBL
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    6
    +                    210
    +                    430
    +                    49
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceError
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    68
    +                    316
    +                    80
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceIODriver
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    68
    +                    385
    +                    104
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceIOFilter
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    68
    +                    362
    +                    104
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceIODevice
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    68
    +                    339
    +                    104
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceMask
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    9
    +                    269
    +                    90
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceIOHex
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    242
    +                    362
    +                    80
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    9
    +                    316
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TB0
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                
    +                    9
    +                    385
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TB3
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                
    +                    9
    +                    362
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TB2
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                
    +                    9
    +                    339
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TB1
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                
    +                    183
    +                    362
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TIB2
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Truncate size
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    242
    +                    385
    +                    104
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    183
    +                    385
    +                    50
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).TSIZ
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    5
    +                    267
    +                    430
    +                    315
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                
    +                    9
    +                    293
    +                    70
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).TMSK
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                hexadecimal
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                drvInfo:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    6
    +                    97
    +                    80
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    88
    +                    97
    +                    150
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).DRVINFO
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                string
    +            
    +        
    +        
    +            
    +                
    +                    111
    +                    122
    +                    130
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).IFACE
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Interface:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    6
    +                    122
    +                    100
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    6
    +                    147
    +                    150
    +                    20
    +                
    +            
    +            
    +                EPushButton::WidthAndHeight
    +            
    +            
    +                $(P)$(R).AQR
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Cancel queueRequest
    +            
    +            
    +                1
    +            
    +            
    +                caMessageButton::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Reason:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    244
    +                    97
    +                    70
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    318
    +                    97
    +                    50
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).REASON
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    60
    +                    180
    +                    32
    +                
    +            
    +            
    +                
    +                    60
    +                    180
    +                    32
    +                
    +            
    +            
    +                caLabel::IfNotZero
    +            
    +            
    +                $(P)$(R).CNCT
    +            
    +            
    +                Connected
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    25
    +                    212
    +                    90
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    253
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    253
    +                    0
    +                    0
    +                
    +            
    +            
    +                caLabel::IfZero
    +            
    +            
    +                $(P)$(R).CNCT
    +            
    +            
    +                Disconnected
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    10
    +                    212
    +                    120
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    10
    +                    234
    +                    120
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).CNCT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Port:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    6
    +                    47
    +                    50
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    61
    +                    47
    +                    150
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).PORT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                string
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Address:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    228
    +                    47
    +                    80
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    318
    +                    47
    +                    110
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).ADDR
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        
    +            
    +                
    +                    61
    +                    72
    +                    120
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).PCNCT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    60
    +                    180
    +                    32
    +                
    +            
    +            
    +                
    +                    60
    +                    180
    +                    32
    +                
    +            
    +            
    +                caLabel::IfNotZero
    +            
    +            
    +                $(P)$(R).PCNCT
    +            
    +            
    +                Connected
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    243
    +                    72
    +                    90
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    253
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    253
    +                    0
    +                    0
    +                
    +            
    +            
    +                caLabel::IfZero
    +            
    +            
    +                $(P)$(R).PCNCT
    +            
    +            
    +                Disconnected
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    228
    +                    72
    +                    120
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                More...
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    291
    +                    147
    +                    70
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    366
    +                    147
    +                    56
    +                    20
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Menu
    +            
    +            
    +                asynOctet Interface I/O;Register interfaces I/O;Serial port parameters;IP port parameters;GPIB parameters
    +            
    +            
    +                asynOctet.adl;asynRegister.adl;asynSerialPortSetup.adl;asynIPPortSetup.adl;asynGPIBSetup.adl
    +            
    +            
    +                P=$(P),R=$(R);P=$(P),R=$(R);P=$(P),R=$(R);P=$(P),R=$(R);P=$(P),R=$(R)
    +            
    +            
    +                false;false;false;false;false
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceIOMask
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    183
    +                    269
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceIOASCII
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    242
    +                    316
    +                    96
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceIOEscape
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    242
    +                    339
    +                    104
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    183
    +                    316
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TIB0
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                
    +                    183
    +                    339
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TIB1
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                
    +                    183
    +                    293
    +                    70
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).TIOM
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                hexadecimal
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceInfoMask
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    183
    +                    415
    +                    130
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    183
    +                    439
    +                    70
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).TINM
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                hexadecimal
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Trace file:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    9
    +                    557
    +                    88
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    99
    +                    555
    +                    330
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).TFIL
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                string
    +            
    +        
    +        
    +            
    +                
    +                    9
    +                    408
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TB4
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceFlow
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    68
    +                    408
    +                    72
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    9
    +                    431
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TB5
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceWarning
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    68
    +                    431
    +                    96
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceInfoPort
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    242
    +                    485
    +                    104
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    183
    +                    485
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TINB1
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceInfoSource
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    242
    +                    508
    +                    120
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    183
    +                    508
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TINB2
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceInfoTime
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    242
    +                    462
    +                    104
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    183
    +                    462
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TINB0
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                
    +                    183
    +                    531
    +                    55
    +                    18
    +                
    +            
    +            
    +                $(P)$(R).TINB3
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Column
    +            
    +            
    +                caChoice::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                traceInfoThread
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    242
    +                    531
    +                    120
    +                    18
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        caRectangle_0
    +        caLabel_0
    +        caLabel_1
    +        caRectangle_1
    +        caLabel_2
    +        caLabel_3
    +        caLabel_4
    +        caLabel_5
    +        caRectangle_2
    +        caLabel_6
    +        caLabel_7
    +        caLabel_8
    +        caLabel_9
    +        caLabel_10
    +        caLabel_11
    +        caLabel_12
    +        caRectangle_3
    +        caLabel_13
    +        caLabel_14
    +        caLabel_15
    +        caLabel_16
    +        caLabel_17
    +        caLabel_18
    +        caLabel_19
    +        caLabel_20
    +        caLabel_21
    +        caLabel_22
    +        caLabel_23
    +        caLabel_24
    +        caLabel_25
    +        caLabel_26
    +        caLabel_27
    +        caLabel_28
    +        caLabel_29
    +        caLabel_30
    +        caLabel_31
    +        caLabel_32
    +        caLabel_33
    +        caLineEdit_0
    +        caMenu_0
    +        caMenu_1
    +        caChoice_0
    +        caChoice_1
    +        caChoice_2
    +        caChoice_3
    +        caChoice_4
    +        caTextEntry_0
    +        caTextEntry_1
    +        caTextEntry_2
    +        caMenu_2
    +        caMessageButton_0
    +        caTextEntry_3
    +        caMenu_3
    +        caTextEntry_4
    +        caTextEntry_5
    +        caMenu_4
    +        caRelatedDisplay_0
    +        caChoice_5
    +        caChoice_6
    +        caTextEntry_6
    +        caTextEntry_7
    +        caTextEntry_8
    +        caChoice_7
    +        caChoice_8
    +        caChoice_9
    +        caChoice_10
    +        caChoice_11
    +        caChoice_12
    +    
    +
    +
    \ No newline at end of file
    diff --git a/opi/caqtdm/autoconvert/asynRegister.ui b/opi/caqtdm/autoconvert/asynRegister.ui
    new file mode 100644
    index 0000000..8691d20
    --- /dev/null
    +++ b/opi/caqtdm/autoconvert/asynRegister.ui
    @@ -0,0 +1,2231 @@
    +
    +
    +MainWindow
    +
    +    
    +        
    +            344
    +            142
    +            510
    +            345
    +        
    +    
    +    
    +        
    +
    +QWidget#centralWidget {background: rgba(187, 187, 187, 255);}
    +
    +caTable {
    +       font: 10pt;
    +       background: cornsilk;
    +       alternate-background-color: wheat;
    +}
    +
    +caLineEdit {
    +     border-radius: 1px;
    +     background: lightyellow;
    +     color: black;
    + }
    +
    +caTextEntry {
    +    color: rgb(127, 0, 63);
    +    background-color: cornsilk;
    +    selection-color: #0a214c;
    +    selection-background-color: wheat;
    +    border: 1px groove black;
    +    border-radius: 1px;
    +    padding: 1px;
    +}
    +
    +caTextEntry:focus {
    +    padding: 0px;
    +    border: 2px groove darkred;
    +    border-radius: 1px;
    +}
    +
    +QPushButton {
    +      border-color: #00b;
    +      border-radius: 2px;
    +      padding: 3px;
    +      border-width: 1px;
    +
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						   stop:0   rgba(224, 239, 255, 255),
    +						   stop:0.5 rgba(199, 215, 230, 255),
    +						   stop:1   rgba(184, 214, 236, 255));
    +}
    +QPushButton:hover {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(201, 226, 255, 255),
    +						stop:0.5 rgba(177, 204, 230, 255),
    +						stop:1   rgba(163, 205, 236, 255));
    +}
    +QPushButton:pressed {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +QPushButton:disabled {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +caChoice {
    +      background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
    +                                  stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
    +                                  stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
    +}
    +
    +caChoice > QPushButton {
    +      text-align: left;
    +      padding: 1px;
    +}
    +
    +caSlider::groove:horizontal {
    +border: 1px solid #bbb;
    +background: lightgrey;
    +height: 20px;
    +border-radius: 4px;
    +}
    +
    +caSlider::handle:horizontal {
    +background: red;
    +border: 1px solid #777;
    +width: 13px;
    +margin-top: -2px;
    +margin-bottom: -2px;
    +border-radius: 2px;
    +}
    +
    +
    +
    +
    +    
    +    
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Timeout (sec):
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    6
    +                    43
    +                    140
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    151
    +                    43
    +                    50
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).TMOT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        
    +            
    +                
    +                    320
    +                    43
    +                    110
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).TMOD
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Transfer:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    225
    +                    43
    +                    90
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                I/O Status:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    10
    +                    284
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                I/O Severity:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    217
    +                    284
    +                    130
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    122
    +                    284
    +                    85
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).STAT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                string
    +            
    +            
    +                caLineEdit::Alarm_Static
    +            
    +        
    +        
    +            
    +                
    +                    349
    +                    284
    +                    85
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).SEVR
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                string
    +            
    +            
    +                caLineEdit::Alarm_Static
    +            
    +        
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    6
    +                    279
    +                    430
    +                    25
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Scan:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    9
    +                    310
    +                    50
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    64
    +                    310
    +                    110
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).SCAN
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                
    +                    179
    +                    310
    +                    80
    +                    20
    +                
    +            
    +            
    +                EPushButton::WidthAndHeight
    +            
    +            
    +                $(P)$(R).PROC
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Process
    +            
    +            
    +                1
    +            
    +            
    +                caMessageButton::Static
    +            
    +        
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    0
    +                    5
    +                    510
    +                    29
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                Filled
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                $(P)$(R)
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter
    +            
    +            
    +                
    +                    0
    +                    9
    +                    510
    +                    21
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Mask (hex):
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    27
    +                    251
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Input (hex):
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    17
    +                    226
    +                    120
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Input:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    77
    +                    201
    +                    60
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Output (hex):
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    7
    +                    176
    +                    130
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Output:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    67
    +                    151
    +                    70
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    5
    +                    101
    +                    130
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).IFACE
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Interface:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    37
    +                    76
    +                    100
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    147
    +                    226
    +                    100
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).I32INP
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                hexadecimal
    +            
    +            
    +                caLineEdit::Static
    +            
    +        
    +        
    +            
    +                
    +                    147
    +                    201
    +                    100
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).I32INP
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                decimal
    +            
    +            
    +                caLineEdit::Static
    +            
    +        
    +        
    +            
    +                
    +                    147
    +                    176
    +                    100
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).I32OUT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                hexadecimal
    +            
    +        
    +        
    +            
    +                
    +                    147
    +                    151
    +                    100
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).I32OUT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                caLabel::Calc
    +            
    +            
    +                A=1
    +            
    +            
    +                $(P)$(R).IFACE
    +            
    +            
    +                Active
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    167
    +                    126
    +                    60
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                caLabel::Calc
    +            
    +            
    +                !(A=1)
    +            
    +            
    +                $(P)$(R).IFACE
    +            
    +            
    +                Inactive
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    157
    +                    126
    +                    80
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                caLabel::IfNotZero
    +            
    +            
    +                $(P)$(R).I32IV
    +            
    +            
    +                Supported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    152
    +                    101
    +                    90
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                caLabel::IfZero
    +            
    +            
    +                $(P)$(R).I32IV
    +            
    +            
    +                Unsupported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    142
    +                    101
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Int32
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    172
    +                    76
    +                    50
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    272
    +                    251
    +                    100
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).UI32MASK
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                hexadecimal
    +            
    +        
    +        
    +            
    +                
    +                    272
    +                    226
    +                    100
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).UI32INP
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                hexadecimal
    +            
    +            
    +                caLineEdit::Static
    +            
    +        
    +        
    +            
    +                
    +                    272
    +                    201
    +                    100
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).UI32INP
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                decimal
    +            
    +            
    +                caLineEdit::Static
    +            
    +        
    +        
    +            
    +                
    +                    272
    +                    176
    +                    100
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).UI32OUT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                hexadecimal
    +            
    +        
    +        
    +            
    +                
    +                    272
    +                    151
    +                    100
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).UI32OUT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                caLabel::Calc
    +            
    +            
    +                A=2
    +            
    +            
    +                $(P)$(R).IFACE
    +            
    +            
    +                Active
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    292
    +                    126
    +                    60
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                caLabel::Calc
    +            
    +            
    +                !(A=2)
    +            
    +            
    +                $(P)$(R).IFACE
    +            
    +            
    +                Inactive
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    282
    +                    126
    +                    80
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                caLabel::IfZero
    +            
    +            
    +                $(P)$(R).UI32IV
    +            
    +            
    +                Unsupported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    267
    +                    101
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                caLabel::IfNotZero
    +            
    +            
    +                $(P)$(R).UI32IV
    +            
    +            
    +                Supported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    277
    +                    101
    +                    90
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                UInt32Digital
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    257
    +                    76
    +                    130
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    397
    +                    201
    +                    100
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).F64INP
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +            
    +                decimal
    +            
    +            
    +                caLineEdit::Static
    +            
    +        
    +        
    +            
    +                
    +                    397
    +                    151
    +                    100
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).F64OUT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                caLabel::Calc
    +            
    +            
    +                A=3
    +            
    +            
    +                $(P)$(R).IFACE
    +            
    +            
    +                Active
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    417
    +                    126
    +                    60
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                caLabel::Calc
    +            
    +            
    +                !(A=3)
    +            
    +            
    +                $(P)$(R).IFACE
    +            
    +            
    +                Inactive
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    407
    +                    126
    +                    80
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                caLabel::IfZero
    +            
    +            
    +                $(P)$(R).F64IV
    +            
    +            
    +                Unsupported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    392
    +                    101
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                caLabel::IfNotZero
    +            
    +            
    +                $(P)$(R).F64IV
    +            
    +            
    +                Supported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    402
    +                    101
    +                    90
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Float64
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    412
    +                    76
    +                    70
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                More...
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    364
    +                    310
    +                    70
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    439
    +                    310
    +                    56
    +                    20
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Menu
    +            
    +            
    +                Record parameters;Register interfaces I/O;Serial port parameters;GPIB parameters
    +            
    +            
    +                asynRecord.adl;asynRegister.adl;asynSerialPortSetup.adl;asynGPIBSetup.adl
    +            
    +            
    +                P=$(P),R=$(R);P=$(P),R=$(R);P=$(P),R=$(R);P=$(P),R=$(R)
    +            
    +            
    +                false;false;false;false
    +            
    +        
    +        caLabel_0
    +        caLabel_1
    +        caLabel_2
    +        caLabel_3
    +        caRectangle_0
    +        caLabel_4
    +        caRectangle_1
    +        caLabel_5
    +        caLabel_6
    +        caLabel_7
    +        caLabel_8
    +        caLabel_9
    +        caLabel_10
    +        caLabel_11
    +        caLabel_12
    +        caLabel_13
    +        caLabel_14
    +        caLabel_15
    +        caLabel_16
    +        caLabel_17
    +        caLabel_18
    +        caLabel_19
    +        caLabel_20
    +        caLabel_21
    +        caLabel_22
    +        caLabel_23
    +        caLabel_24
    +        caLabel_25
    +        caLabel_26
    +        caLabel_27
    +        caTextEntry_0
    +        caMenu_0
    +        caLineEdit_0
    +        caLineEdit_1
    +        caMenu_1
    +        caMessageButton_0
    +        caMenu_2
    +        caLineEdit_2
    +        caLineEdit_3
    +        caTextEntry_1
    +        caTextEntry_2
    +        caTextEntry_3
    +        caLineEdit_4
    +        caLineEdit_5
    +        caTextEntry_4
    +        caTextEntry_5
    +        caLineEdit_6
    +        caTextEntry_6
    +        caRelatedDisplay_0
    +    
    +
    +
    \ No newline at end of file
    diff --git a/opi/caqtdm/autoconvert/asynSerialPortSetup.ui b/opi/caqtdm/autoconvert/asynSerialPortSetup.ui
    new file mode 100644
    index 0000000..e74afe8
    --- /dev/null
    +++ b/opi/caqtdm/autoconvert/asynSerialPortSetup.ui
    @@ -0,0 +1,1006 @@
    +
    +
    +MainWindow
    +
    +    
    +        
    +            228
    +            79
    +            260
    +            300
    +        
    +    
    +    
    +        
    +
    +QWidget#centralWidget {background: rgba(187, 187, 187, 255);}
    +
    +caTable {
    +       font: 10pt;
    +       background: cornsilk;
    +       alternate-background-color: wheat;
    +}
    +
    +caLineEdit {
    +     border-radius: 1px;
    +     background: lightyellow;
    +     color: black;
    + }
    +
    +caTextEntry {
    +    color: rgb(127, 0, 63);
    +    background-color: cornsilk;
    +    selection-color: #0a214c;
    +    selection-background-color: wheat;
    +    border: 1px groove black;
    +    border-radius: 1px;
    +    padding: 1px;
    +}
    +
    +caTextEntry:focus {
    +    padding: 0px;
    +    border: 2px groove darkred;
    +    border-radius: 1px;
    +}
    +
    +QPushButton {
    +      border-color: #00b;
    +      border-radius: 2px;
    +      padding: 3px;
    +      border-width: 1px;
    +
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						   stop:0   rgba(224, 239, 255, 255),
    +						   stop:0.5 rgba(199, 215, 230, 255),
    +						   stop:1   rgba(184, 214, 236, 255));
    +}
    +QPushButton:hover {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(201, 226, 255, 255),
    +						stop:0.5 rgba(177, 204, 230, 255),
    +						stop:1   rgba(163, 205, 236, 255));
    +}
    +QPushButton:pressed {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +QPushButton:disabled {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +caChoice {
    +      background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
    +                                  stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
    +                                  stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
    +}
    +
    +caChoice > QPushButton {
    +      text-align: left;
    +      padding: 1px;
    +}
    +
    +caSlider::groove:horizontal {
    +border: 1px solid #bbb;
    +background: lightgrey;
    +height: 20px;
    +border-radius: 4px;
    +}
    +
    +caSlider::handle:horizontal {
    +background: red;
    +border: 1px solid #777;
    +width: 13px;
    +margin-top: -2px;
    +margin-bottom: -2px;
    +border-radius: 2px;
    +}
    +
    +
    +
    +
    +    
    +    
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    0
    +                    2
    +                    260
    +                    16
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                Filled
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                $(P)$(R)
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter
    +            
    +            
    +                
    +                    0
    +                    2
    +                    260
    +                    16
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                
    +                    51
    +                    153
    +                    0
    +                
    +            
    +            
    +                caLabel::IfNotZero
    +            
    +            
    +                $(P)$(R).OPTIONIV
    +            
    +            
    +                Supported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    148
    +                    25
    +                    90
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                caLabel::IfZero
    +            
    +            
    +                $(P)$(R).OPTIONIV
    +            
    +            
    +                Unsupported
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    138
    +                    25
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                asynOption:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    8
    +                    25
    +                    110
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Baud rate:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    43
    +                    51
    +                    100
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    51
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).BAUD
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Baud rate:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    43
    +                    76
    +                    100
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Data bits:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    43
    +                    101
    +                    100
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Stop bits:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    43
    +                    126
    +                    100
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Modem control:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    3
    +                    176
    +                    140
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Parity:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    73
    +                    151
    +                    70
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    101
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).DBIT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    126
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).SBIT
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    151
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).PRTY
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    176
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).MCTL
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Flow control:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    13
    +                    201
    +                    130
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    201
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).FCTL
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                XOFF output:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    23
    +                    226
    +                    120
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    226
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).IXON
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                XOFF input:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    33
    +                    251
    +                    110
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    251
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).IXOFF
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                XON=any:
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                
    +                    63
    +                    276
    +                    80
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    276
    +                    102
    +                    20
    +                
    +            
    +            
    +                $(P)$(R).IXANY
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                
    +                    150
    +                    76
    +                    102
    +                    18
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).LBAUD
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                caLineEdit::Static
    +            
    +            
    +                decimal
    +            
    +        
    +        caRectangle_0
    +        caLabel_0
    +        caLabel_1
    +        caLabel_2
    +        caLabel_3
    +        caLabel_4
    +        caLabel_5
    +        caLabel_6
    +        caLabel_7
    +        caLabel_8
    +        caLabel_9
    +        caLabel_10
    +        caLabel_11
    +        caLabel_12
    +        caLabel_13
    +        caMenu_0
    +        caMenu_1
    +        caMenu_2
    +        caMenu_3
    +        caMenu_4
    +        caMenu_5
    +        caMenu_6
    +        caMenu_7
    +        caMenu_8
    +        caTextEntry_0
    +    
    +
    +
    \ No newline at end of file
    diff --git a/opi/caqtdm/autoconvert/asynTimeSeries.ui b/opi/caqtdm/autoconvert/asynTimeSeries.ui
    new file mode 100644
    index 0000000..5f5c456
    --- /dev/null
    +++ b/opi/caqtdm/autoconvert/asynTimeSeries.ui
    @@ -0,0 +1,709 @@
    +
    +
    +MainWindow
    +
    +    
    +        
    +            326
    +            179
    +            500
    +            360
    +        
    +    
    +    
    +        
    +
    +QWidget#centralWidget {background: rgba(187, 187, 187, 255);}
    +
    +caTable {
    +       font: 10pt;
    +       background: cornsilk;
    +       alternate-background-color: wheat;
    +}
    +
    +caLineEdit {
    +     border-radius: 1px;
    +     background: lightyellow;
    +     color: black;
    + }
    +
    +caTextEntry {
    +    color: rgb(127, 0, 63);
    +    background-color: cornsilk;
    +    selection-color: #0a214c;
    +    selection-background-color: wheat;
    +    border: 1px groove black;
    +    border-radius: 1px;
    +    padding: 1px;
    +}
    +
    +caTextEntry:focus {
    +    padding: 0px;
    +    border: 2px groove darkred;
    +    border-radius: 1px;
    +}
    +
    +QPushButton {
    +      border-color: #00b;
    +      border-radius: 2px;
    +      padding: 3px;
    +      border-width: 1px;
    +
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						   stop:0   rgba(224, 239, 255, 255),
    +						   stop:0.5 rgba(199, 215, 230, 255),
    +						   stop:1   rgba(184, 214, 236, 255));
    +}
    +QPushButton:hover {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(201, 226, 255, 255),
    +						stop:0.5 rgba(177, 204, 230, 255),
    +						stop:1   rgba(163, 205, 236, 255));
    +}
    +QPushButton:pressed {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +QPushButton:disabled {
    +	background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
    +						stop:0   rgba(174, 219, 255, 255),
    +						stop:0.5 rgba(165, 199, 230, 255),
    +						stop:1   rgba(134, 188, 236, 255));
    +}
    +
    +caChoice {
    +      background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
    +                                  stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
    +                                  stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
    +}
    +
    +caChoice > QPushButton {
    +      text-align: left;
    +      padding: 1px;
    +}
    +
    +caSlider::groove:horizontal {
    +border: 1px solid #bbb;
    +background: lightgrey;
    +height: 20px;
    +border-radius: 4px;
    +}
    +
    +caSlider::handle:horizontal {
    +background: red;
    +border: 1px solid #777;
    +width: 13px;
    +margin-top: -2px;
    +margin-bottom: -2px;
    +border-radius: 2px;
    +}
    +
    +
    +
    +
    +    
    +    
    +        
    +            
    +                caGraphics::Rectangle
    +            
    +            
    +                
    +                    0
    +                    5
    +                    500
    +                    25
    +                
    +            
    +            
    +                
    +                    10
    +                    0
    +                    184
    +                
    +            
    +            
    +                Filled
    +            
    +            
    +                
    +                    10
    +                    0
    +                    184
    +                
    +            
    +            
    +                Solid
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    255
    +                    255
    +                    255
    +                
    +            
    +            
    +                
    +                    255
    +                    255
    +                    255
    +                
    +            
    +            
    +                $(P)$(R)
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter
    +            
    +            
    +                
    +                    0
    +                    5
    +                    500
    +                    25
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    45
    +                    127
    +                    0
    +                
    +            
    +            
    +                
    +                    45
    +                    127
    +                    0
    +                
    +            
    +            
    +                caLabel::IfNotZero
    +            
    +            
    +                $(P)$(R).BUSY
    +            
    +            
    +                Acquiring
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter
    +            
    +            
    +                
    +                    42
    +                    40
    +                    90
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                
    +                    222
    +                    19
    +                    9
    +                
    +            
    +            
    +                caLabel::IfZero
    +            
    +            
    +                $(P)$(R).BUSY
    +            
    +            
    +                Done
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter
    +            
    +            
    +                
    +                    95
    +                    40
    +                    40
    +                    20
    +                
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Status
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    142
    +                    40
    +                    60
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    224
    +                    40
    +                    100
    +                    20
    +                
    +            
    +            
    +                caLineEdit::WidthAndHeight
    +            
    +            
    +                $(P)$(R).NORD
    +            
    +            
    +                
    +                    10
    +                    0
    +                    184
    +                
    +            
    +            
    +                
    +                    187
    +                    187
    +                    187
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                caLineEdit::Channel
    +            
    +            
    +                0.0
    +            
    +            
    +                1.0
    +            
    +            
    +                decimal
    +            
    +            
    +                caLineEdit::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Current point
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    329
    +                    40
    +                    130
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    10
    +                    92
    +                    480
    +                    230
    +                
    +            
    +            
    +                $(P)$(R)
    +            
    +            
    +                Time point
    +            
    +            
    +                Value
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                
    +                    218
    +                    218
    +                    218
    +                
    +            
    +            
    +                caCartesianPlot::Lines
    +            
    +            
    +                caCartesianPlot::Lines
    +            
    +            
    +                caCartesianPlot::Lines
    +            
    +            
    +                caCartesianPlot::NoSymbol
    +            
    +            
    +                caCartesianPlot::Rect
    +            
    +            
    +                caCartesianPlot::Triangle
    +            
    +            
    +                caCartesianPlot::PlotLastNPoints
    +            
    +            
    +                
    +                    75
    +                    110
    +                    199
    +                
    +            
    +            
    +                ;$(P)$(R).VAL
    +            
    +            
    +                caCartesianPlot::Auto
    +            
    +            
    +                0;1
    +            
    +            
    +                caCartesianPlot::Auto
    +            
    +            
    +                0;1
    +            
    +        
    +        
    +            
    +                
    +                    15
    +                    65
    +                    90
    +                    20
    +                
    +            
    +            
    +                EPushButton::WidthAndHeight
    +            
    +            
    +                $(P)$(R).RARM
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Erase/Start
    +            
    +            
    +                1
    +            
    +            
    +                caMessageButton::Static
    +            
    +        
    +        
    +            
    +                
    +                    110
    +                    65
    +                    90
    +                    20
    +                
    +            
    +            
    +                EPushButton::WidthAndHeight
    +            
    +            
    +                $(P)$(R).RARM
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Start
    +            
    +            
    +                3
    +            
    +            
    +                caMessageButton::Static
    +            
    +        
    +        
    +            
    +                
    +                    205
    +                    65
    +                    90
    +                    20
    +                
    +            
    +            
    +                EPushButton::WidthAndHeight
    +            
    +            
    +                $(P)$(R).RARM
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Stop
    +            
    +            
    +                2
    +            
    +            
    +                caMessageButton::Static
    +            
    +        
    +        
    +            
    +                
    +                    10
    +                    329
    +                    100
    +                    20
    +                
    +            
    +            
    +                $(P)$(R)Read.SCAN
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                caMenu::Static
    +            
    +        
    +        
    +            
    +                QFrame::NoFrame
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                Read rate
    +            
    +            
    +                ESimpleLabel::WidthAndHeight
    +            
    +            
    +                
    +                    117
    +                    329
    +                    90
    +                    20
    +                
    +            
    +            
    +                Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter
    +            
    +        
    +        
    +            
    +                
    +                    217
    +                    329
    +                    50
    +                    20
    +                
    +            
    +            
    +                EPushButton::WidthAndHeight
    +            
    +            
    +                $(P)$(R)Read.PROC
    +            
    +            
    +                
    +                    0
    +                    0
    +                    0
    +                
    +            
    +            
    +                
    +                    115
    +                    223
    +                    255
    +                
    +            
    +            
    +                Read
    +            
    +            
    +                1
    +            
    +            
    +                caMessageButton::Static
    +            
    +        
    +        caRectangle_0
    +        caLabel_0
    +        caLabel_1
    +        caLabel_2
    +        caLabel_3
    +        caLabel_4
    +        caLabel_5
    +        caLineEdit_0
    +        caCartesianPlot_0
    +        caMessageButton_0
    +        caMessageButton_1
    +        caMessageButton_2
    +        caMenu_0
    +        caMessageButton_3
    +    
    +
    +
    \ No newline at end of file
    diff --git a/opi/edm/autoconvert/asynGPIBSetup.edl b/opi/edm/autoconvert/asynGPIBSetup.edl
    new file mode 100644
    index 0000000..d3aecc1
    --- /dev/null
    +++ b/opi/edm/autoconvert/asynGPIBSetup.edl
    @@ -0,0 +1,284 @@
    +4 0 0
    +beginScreenProperties
    +major 4
    +minor 0
    +release 0
    +x 456
    +y 239
    +w 375
    +h 185
    +font "helvetica-medium-r-18.0"
    +ctlFont "helvetica-medium-r-8.0"
    +btnFont "helvetica-medium-r-18.0"
    +fgColor index 14
    +bgColor index 4
    +textColor index 14
    +ctlFgColor1 index 30
    +ctlFgColor2 index 32
    +ctlBgColor1 index 34
    +ctlBgColor2 index 35
    +topShadowColor index 37
    +botShadowColor index 44
    +snapToGrid
    +gridSize 5
    +endScreenProperties
    +
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 8
    +w 374
    +h 28
    +lineColor index 2
    +fill
    +fillColor index 2
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 12
    +w 375
    +h 25
    +font "helvetica-medium-r-8.0"
    +fontAlign "center"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "$(P)$(R)"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 4
    +y 68
    +w 130
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "GPIB address:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 139
    +y 68
    +w 75
    +h 20
    +controlPv "$(P)$(R).ADDR"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 4
    +y 97
    +w 210
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Serial poll response:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 224
    +y 97
    +w 56
    +h 20
    +controlPv "$(P)$(R).SPR"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +autoHeight
    +format "hex"
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 4
    +y 126
    +w 170
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Universal Command"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 4
    +y 151
    +w 170
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Addressed Command"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 218
    +y 42
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 17
    +useDisplayBg
    +value {
    + "Supported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).GPIBIV)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 208
    +y 42
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 21
    +useDisplayBg
    +value {
    + "Unsupported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).GPIBIV)"
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 4
    +y 42
    +w 190
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "asynGpib interface:"
    +}
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 179
    +y 126
    +w 180
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).UCMD"
    +indicatorPv "$(P)$(R).UCMD"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 179
    +y 151
    +w 180
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).ACMD"
    +indicatorPv "$(P)$(R).ACMD"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    diff --git a/opi/edm/autoconvert/asynIPPortSetup.edl b/opi/edm/autoconvert/asynIPPortSetup.edl
    new file mode 100644
    index 0000000..5e95576
    --- /dev/null
    +++ b/opi/edm/autoconvert/asynIPPortSetup.edl
    @@ -0,0 +1,620 @@
    +4 0 0
    +beginScreenProperties
    +major 4
    +minor 0
    +release 0
    +x 405
    +y 149
    +w 260
    +h 410
    +font "helvetica-medium-r-18.0"
    +ctlFont "helvetica-medium-r-8.0"
    +btnFont "helvetica-medium-r-18.0"
    +fgColor index 14
    +bgColor index 4
    +textColor index 14
    +ctlFgColor1 index 30
    +ctlFgColor2 index 32
    +ctlBgColor1 index 34
    +ctlBgColor2 index 35
    +topShadowColor index 37
    +botShadowColor index 44
    +snapToGrid
    +gridSize 5
    +endScreenProperties
    +
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 2
    +w 259
    +h 15
    +lineColor index 2
    +fill
    +fillColor index 2
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 2
    +w 260
    +h 16
    +font "helvetica-medium-r-8.0"
    +fontAlign "center"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "$(P)$(R)"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 148
    +y 25
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 17
    +useDisplayBg
    +value {
    + "Supported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).OPTIONIV)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 138
    +y 25
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 21
    +useDisplayBg
    +value {
    + "Unsupported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).OPTIONIV)"
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 8
    +y 25
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "asynOption:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 13
    +y 51
    +w 130
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Disconnect on"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 13
    +y 76
    +w 130
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "read timeout:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 43
    +y 101
    +w 100
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Host info:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 101
    +w 102
    +h 18
    +controlPv "$(P)$(R).HOSTINFO"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "string"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 43
    +y 206
    +w 100
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Data bits:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 43
    +y 231
    +w 100
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Stop bits:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 3
    +y 281
    +w 140
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Modem control:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 73
    +y 256
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Parity:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 13
    +y 306
    +w 130
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Flow control:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 23
    +y 331
    +w 120
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "XOFF output:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 33
    +y 356
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "XOFF input:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 63
    +y 381
    +w 80
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "XON=any:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 43
    +y 181
    +w 100
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Baud rate:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 181
    +w 102
    +h 18
    +controlPv "$(P)$(R).LBAUD"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 15
    +y 151
    +w 230
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "COM (RFC 2217) protocol"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 5
    +y 130
    +w 250
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Parameters for ports with"
    +}
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 76
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).DRTO"
    +indicatorPv "$(P)$(R).DRTO"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 206
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).DBIT"
    +indicatorPv "$(P)$(R).DBIT"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 231
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).SBIT"
    +indicatorPv "$(P)$(R).SBIT"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 256
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).PRTY"
    +indicatorPv "$(P)$(R).PRTY"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 281
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).MCTL"
    +indicatorPv "$(P)$(R).MCTL"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 306
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).FCTL"
    +indicatorPv "$(P)$(R).FCTL"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 331
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).IXON"
    +indicatorPv "$(P)$(R).IXON"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 356
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).IXOFF"
    +indicatorPv "$(P)$(R).IXOFF"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 381
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).IXANY"
    +indicatorPv "$(P)$(R).IXANY"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    diff --git a/opi/edm/autoconvert/asynOctet.edl b/opi/edm/autoconvert/asynOctet.edl
    new file mode 100644
    index 0000000..af89d7b
    --- /dev/null
    +++ b/opi/edm/autoconvert/asynOctet.edl
    @@ -0,0 +1,1038 @@
    +4 0 0
    +beginScreenProperties
    +major 4
    +minor 0
    +release 0
    +x 457
    +y 494
    +w 442
    +h 350
    +font "helvetica-medium-r-18.0"
    +ctlFont "helvetica-medium-r-8.0"
    +btnFont "helvetica-medium-r-18.0"
    +fgColor index 14
    +bgColor index 4
    +textColor index 14
    +ctlFgColor1 index 30
    +ctlFgColor2 index 32
    +ctlBgColor1 index 34
    +ctlBgColor2 index 35
    +topShadowColor index 37
    +botShadowColor index 44
    +snapToGrid
    +gridSize 5
    +endScreenProperties
    +
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 81
    +y 216
    +w 350
    +h 18
    +controlPv "$(P)$(R).TINP"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 4
    +autoHeight
    +format "string"
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 43
    +w 140
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Timeout (sec):"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 151
    +y 43
    +w 50
    +h 20
    +controlPv "$(P)$(R).TMOT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 225
    +y 43
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Transfer:"
    +}
    +endObjectProperties
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 5
    +w 441
    +h 28
    +lineColor index 2
    +fill
    +fillColor index 2
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 9
    +w 442
    +h 21
    +font "helvetica-medium-r-8.0"
    +fontAlign "center"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "$(P)$(R)"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 78
    +y 128
    +w 350
    +h 20
    +controlPv "$(P)$(R).AOUT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "string"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 13
    +y 99
    +w 60
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 25
    +useDisplayBg
    +value {
    + "Output"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 91
    +y 99
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Format:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 13
    +y 126
    +w 60
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "ASCII:"
    +}
    +endObjectProperties
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 92
    +w 430
    +h 85
    +lineColor index 14
    +fillColor index 14
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 256
    +y 99
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Terminator:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 371
    +y 99
    +w 60
    +h 20
    +controlPv "$(P)$(R).OEOS"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "string"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 88
    +y 152
    +w 100
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Requested:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 10
    +y 152
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Length:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 280
    +y 152
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Actual:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 355
    +y 152
    +w 56
    +h 20
    +controlPv "$(P)$(R).NAWT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +autoHeight
    +format decimal
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 193
    +y 152
    +w 70
    +h 20
    +controlPv "$(P)$(R).NOWT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 10
    +y 297
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "I/O Status:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 217
    +y 297
    +w 130
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "I/O Severity:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 122
    +y 297
    +w 85
    +h 20
    +controlPv "$(P)$(R).STAT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +fgAlarm
    +bgColor index 2
    +autoHeight
    +format "string"
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 349
    +y 297
    +w 85
    +h 20
    +controlPv "$(P)$(R).SEVR"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +fgAlarm
    +bgColor index 2
    +autoHeight
    +format "string"
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 292
    +w 430
    +h 25
    +lineColor index 14
    +fillColor index 14
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 9
    +y 323
    +w 50
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Scan:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 253
    +y 189
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Terminator:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 368
    +y 189
    +w 60
    +h 20
    +controlPv "$(P)$(R).IEOS"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "string"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 74
    +y 213
    +w 360
    +h 21
    +lineColor index 14
    +fillColor index 14
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 16
    +y 189
    +w 50
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 25
    +useDisplayBg
    +value {
    + "Input"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 86
    +y 191
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Format:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 13
    +y 215
    +w 60
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "ASCII:"
    +}
    +endObjectProperties
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 182
    +w 430
    +h 105
    +lineColor index 14
    +fillColor index 14
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 88
    +y 242
    +w 100
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Requested:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 10
    +y 242
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Length:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 280
    +y 242
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Actual:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 355
    +y 242
    +w 56
    +h 20
    +controlPv "$(P)$(R).NORD"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 4
    +autoHeight
    +format decimal
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 193
    +y 242
    +w 70
    +h 20
    +controlPv "$(P)$(R).NRRD"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 77
    +y 265
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "EOM reason:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 193
    +y 265
    +w 70
    +h 20
    +controlPv "$(P)$(R).EOMR"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +autoHeight
    +format "string"
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 220
    +y 66
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 17
    +useDisplayBg
    +value {
    + "Supported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).OCTETIV)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 210
    +y 66
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 21
    +useDisplayBg
    +value {
    + "Unsupported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).OCTETIV)"
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 66
    +w 200
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "asynOctet interface:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 344
    +y 66
    +w 60
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 17
    +useDisplayBg
    +value {
    + "Active"
    +}
    +visPv "CALC\\\{(A=0)\}($(P)$(R).IFACE)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 334
    +y 66
    +w 80
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 21
    +useDisplayBg
    +value {
    + "Inactive"
    +}
    +visPv "CALC\\\{(!(A=0))\}($(P)$(R).IFACE)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 300
    +y 323
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "More..."
    +}
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 320
    +y 43
    +w 110
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).TMOD"
    +indicatorPv "$(P)$(R).TMOD"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 166
    +y 99
    +w 80
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).OFMT"
    +indicatorPv "$(P)$(R).OFMT"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 64
    +y 323
    +w 110
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).SCAN"
    +indicatorPv "$(P)$(R).SCAN"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Message Button)
    +object activeMessageButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 179
    +y 323
    +w 80
    +h 20
    +fgColor index 14
    +onColor index 51
    +offColor index 51
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).PROC"
    +pressValue "1"
    +releaseValue 
    +onLabel "Process"
    +offLabel "Process"
    +3d
    +useEnumNumeric
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 161
    +y 189
    +w 80
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).IFMT"
    +indicatorPv "$(P)$(R).IFMT"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Related Display)
    +object relatedDisplayClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 375
    +y 323
    +w 56
    +h 20
    +fgColor index 14
    +bgColor index 51
    +topShadowColor index 2
    +botShadowColor index 12
    +font "helvetica-medium-r-10.0"
    +icon
    +numPvs 0
    +numDsps 0
    +displayFileName {
    +}
    +menuLabel {
    +}
    +endObjectProperties
    +
    diff --git a/opi/edm/autoconvert/asynRecord.edl b/opi/edm/autoconvert/asynRecord.edl
    new file mode 100644
    index 0000000..39bbb0e
    --- /dev/null
    +++ b/opi/edm/autoconvert/asynRecord.edl
    @@ -0,0 +1,1416 @@
    +4 0 0
    +beginScreenProperties
    +major 4
    +minor 0
    +release 0
    +x 72
    +y 61
    +w 440
    +h 589
    +font "helvetica-medium-r-18.0"
    +ctlFont "helvetica-medium-r-8.0"
    +btnFont "helvetica-medium-r-18.0"
    +fgColor index 14
    +bgColor index 4
    +textColor index 14
    +ctlFgColor1 index 30
    +ctlFgColor2 index 32
    +ctlBgColor1 index 34
    +ctlBgColor2 index 35
    +topShadowColor index 37
    +botShadowColor index 44
    +snapToGrid
    +gridSize 5
    +endScreenProperties
    +
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 8
    +w 439
    +h 28
    +lineColor index 2
    +fill
    +fillColor index 2
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 12
    +w 440
    +h 21
    +font "helvetica-medium-r-8.0"
    +fontAlign "center"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "$(P)$(R)"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 75
    +y 182
    +w 359
    +h 16
    +controlPv "$(P)$(R).ERRS"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 2
    +autoHeight
    +format "string"
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 10
    +y 181
    +w 60
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Error:"
    +}
    +endObjectProperties
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 178
    +w 430
    +h 25
    +lineColor index 14
    +fillColor index 14
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 300
    +y 212
    +w 130
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 30
    +useDisplayBg
    +value {
    + "noAutoConnect"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).AUCT)"
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 310
    +y 212
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 62
    +useDisplayBg
    +value {
    + "autoConnect"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).AUCT)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 180
    +y 212
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 62
    +useDisplayBg
    +value {
    + "Enabled"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).ENBL)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 175
    +y 212
    +w 80
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 20
    +useDisplayBg
    +value {
    + "Disabled"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).ENBL)"
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 210
    +w 430
    +h 49
    +lineColor index 14
    +fillColor index 14
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 68
    +y 316
    +w 80
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceError"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 68
    +y 385
    +w 104
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceIODriver"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 68
    +y 362
    +w 104
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceIOFilter"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 68
    +y 339
    +w 104
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceIODevice"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 9
    +y 269
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceMask"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 242
    +y 362
    +w 80
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceIOHex"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 242
    +y 385
    +w 104
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Truncate size"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 183
    +y 385
    +w 50
    +h 20
    +controlPv "$(P)$(R).TSIZ"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 5
    +y 267
    +w 430
    +h 315
    +lineColor index 14
    +fillColor index 14
    +lineWidth 0
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 9
    +y 293
    +w 70
    +h 20
    +controlPv "$(P)$(R).TMSK"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "hex"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 97
    +w 80
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "drvInfo:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 88
    +y 97
    +w 150
    +h 20
    +controlPv "$(P)$(R).DRVINFO"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "string"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 122
    +w 100
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Interface:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 244
    +y 97
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Reason:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 318
    +y 97
    +w 50
    +h 20
    +controlPv "$(P)$(R).REASON"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 25
    +y 212
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 62
    +useDisplayBg
    +value {
    + "Connected"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).CNCT)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 10
    +y 212
    +w 120
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 20
    +useDisplayBg
    +value {
    + "Disconnected"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).CNCT)"
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 47
    +w 50
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Port:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 61
    +y 47
    +w 150
    +h 20
    +controlPv "$(P)$(R).PORT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "string"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 228
    +y 47
    +w 80
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Address:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 318
    +y 47
    +w 110
    +h 20
    +controlPv "$(P)$(R).ADDR"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 243
    +y 72
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 62
    +useDisplayBg
    +value {
    + "Connected"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).PCNCT)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 228
    +y 72
    +w 120
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 20
    +useDisplayBg
    +value {
    + "Disconnected"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).PCNCT)"
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 291
    +y 147
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "More..."
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 183
    +y 269
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceIOMask"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 242
    +y 316
    +w 96
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceIOASCII"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 242
    +y 339
    +w 104
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceIOEscape"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 183
    +y 293
    +w 70
    +h 20
    +controlPv "$(P)$(R).TIOM"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "hex"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 183
    +y 415
    +w 130
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceInfoMask"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 183
    +y 439
    +w 70
    +h 20
    +controlPv "$(P)$(R).TINM"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "hex"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 9
    +y 557
    +w 88
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Trace file:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 99
    +y 555
    +w 330
    +h 20
    +controlPv "$(P)$(R).TFIL"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "string"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 68
    +y 408
    +w 72
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceFlow"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 68
    +y 431
    +w 96
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceWarning"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 242
    +y 485
    +w 104
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceInfoPort"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 242
    +y 508
    +w 120
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceInfoSource"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 242
    +y 462
    +w 104
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceInfoTime"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 242
    +y 531
    +w 120
    +h 18
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "traceInfoThread"
    +}
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 305
    +y 233
    +w 120
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).AUCT"
    +indicatorPv "$(P)$(R).AUCT"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 155
    +y 234
    +w 120
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).ENBL"
    +indicatorPv "$(P)$(R).ENBL"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 9
    +y 316
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TB0"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 9
    +y 385
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TB3"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 9
    +y 362
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TB2"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 9
    +y 339
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TB1"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 183
    +y 362
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TIB2"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 111
    +y 122
    +w 130
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).IFACE"
    +indicatorPv "$(P)$(R).IFACE"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Message Button)
    +object activeMessageButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 147
    +w 150
    +h 20
    +fgColor index 14
    +onColor index 51
    +offColor index 51
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).AQR"
    +pressValue "1"
    +releaseValue 
    +onLabel "Cancel queueRequest"
    +offLabel "Cancel queueRequest"
    +3d
    +useEnumNumeric
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 10
    +y 234
    +w 120
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).CNCT"
    +indicatorPv "$(P)$(R).CNCT"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 61
    +y 72
    +w 120
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).PCNCT"
    +indicatorPv "$(P)$(R).PCNCT"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Related Display)
    +object relatedDisplayClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 366
    +y 147
    +w 56
    +h 20
    +fgColor index 14
    +bgColor index 51
    +topShadowColor index 2
    +botShadowColor index 12
    +font "helvetica-medium-r-10.0"
    +icon
    +numPvs 0
    +numDsps 0
    +displayFileName {
    +}
    +menuLabel {
    +}
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 183
    +y 316
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TIB0"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 183
    +y 339
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TIB1"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 9
    +y 408
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TB4"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 9
    +y 431
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TB5"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 183
    +y 485
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TINB1"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 183
    +y 508
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TINB2"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 183
    +y 462
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TINB0"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    +# (Choice Button)
    +object activeChoiceButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 183
    +y 531
    +w 55
    +h 18
    +fgColor index 14
    +bgColor index 51
    +selectColor index 51
    +inconsistentColor index 14
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).TINB3"
    +font "helvetica-medium-r-10.0"
    +orientation "horizontal"
    +endObjectProperties
    +
    diff --git a/opi/edm/autoconvert/asynRegister.edl b/opi/edm/autoconvert/asynRegister.edl
    new file mode 100644
    index 0000000..034f398
    --- /dev/null
    +++ b/opi/edm/autoconvert/asynRegister.edl
    @@ -0,0 +1,1070 @@
    +4 0 0
    +beginScreenProperties
    +major 4
    +minor 0
    +release 0
    +x 344
    +y 142
    +w 510
    +h 345
    +font "helvetica-medium-r-18.0"
    +ctlFont "helvetica-medium-r-8.0"
    +btnFont "helvetica-medium-r-18.0"
    +fgColor index 14
    +bgColor index 4
    +textColor index 14
    +ctlFgColor1 index 30
    +ctlFgColor2 index 32
    +ctlBgColor1 index 34
    +ctlBgColor2 index 35
    +topShadowColor index 37
    +botShadowColor index 44
    +snapToGrid
    +gridSize 5
    +endScreenProperties
    +
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 43
    +w 140
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Timeout (sec):"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 151
    +y 43
    +w 50
    +h 20
    +controlPv "$(P)$(R).TMOT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 225
    +y 43
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Transfer:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 10
    +y 284
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "I/O Status:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 217
    +y 284
    +w 130
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "I/O Severity:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 122
    +y 284
    +w 85
    +h 20
    +controlPv "$(P)$(R).STAT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +fgAlarm
    +bgColor index 2
    +autoHeight
    +format "string"
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 349
    +y 284
    +w 85
    +h 20
    +controlPv "$(P)$(R).SEVR"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +fgAlarm
    +bgColor index 2
    +autoHeight
    +format "string"
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 6
    +y 279
    +w 430
    +h 25
    +lineColor index 14
    +fillColor index 14
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 9
    +y 310
    +w 50
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Scan:"
    +}
    +endObjectProperties
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 5
    +w 509
    +h 28
    +lineColor index 2
    +fill
    +fillColor index 2
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 9
    +w 510
    +h 21
    +font "helvetica-medium-r-8.0"
    +fontAlign "center"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "$(P)$(R)"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 27
    +y 251
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Mask (hex):"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 17
    +y 226
    +w 120
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Input (hex):"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 77
    +y 201
    +w 60
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Input:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 7
    +y 176
    +w 130
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Output (hex):"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 67
    +y 151
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Output:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 37
    +y 76
    +w 100
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Interface:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 147
    +y 226
    +w 100
    +h 20
    +controlPv "$(P)$(R).I32INP"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +autoHeight
    +format "hex"
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 147
    +y 201
    +w 100
    +h 20
    +controlPv "$(P)$(R).I32INP"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +autoHeight
    +format decimal
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 147
    +y 176
    +w 100
    +h 20
    +controlPv "$(P)$(R).I32OUT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "hex"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 147
    +y 151
    +w 100
    +h 20
    +controlPv "$(P)$(R).I32OUT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 167
    +y 126
    +w 60
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 17
    +useDisplayBg
    +value {
    + "Active"
    +}
    +visPv "CALC\\\{(A=1)\}($(P)$(R).IFACE)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 157
    +y 126
    +w 80
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 21
    +useDisplayBg
    +value {
    + "Inactive"
    +}
    +visPv "CALC\\\{(!(A=1))\}($(P)$(R).IFACE)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 152
    +y 101
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 17
    +useDisplayBg
    +value {
    + "Supported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).I32IV)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 142
    +y 101
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 21
    +useDisplayBg
    +value {
    + "Unsupported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).I32IV)"
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 172
    +y 76
    +w 50
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Int32"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 272
    +y 251
    +w 100
    +h 20
    +controlPv "$(P)$(R).UI32MASK"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "hex"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 272
    +y 226
    +w 100
    +h 20
    +controlPv "$(P)$(R).UI32INP"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +autoHeight
    +format "hex"
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 272
    +y 201
    +w 100
    +h 20
    +controlPv "$(P)$(R).UI32INP"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +autoHeight
    +format decimal
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 272
    +y 176
    +w 100
    +h 20
    +controlPv "$(P)$(R).UI32OUT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format "hex"
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 272
    +y 151
    +w 100
    +h 20
    +controlPv "$(P)$(R).UI32OUT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 292
    +y 126
    +w 60
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 17
    +useDisplayBg
    +value {
    + "Active"
    +}
    +visPv "CALC\\\{(A=2)\}($(P)$(R).IFACE)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 282
    +y 126
    +w 80
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 21
    +useDisplayBg
    +value {
    + "Inactive"
    +}
    +visPv "CALC\\\{(!(A=2))\}($(P)$(R).IFACE)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 267
    +y 101
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 21
    +useDisplayBg
    +value {
    + "Unsupported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).UI32IV)"
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 277
    +y 101
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 17
    +useDisplayBg
    +value {
    + "Supported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).UI32IV)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 257
    +y 76
    +w 130
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "UInt32Digital"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 397
    +y 201
    +w 100
    +h 20
    +controlPv "$(P)$(R).F64INP"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +autoHeight
    +format decimal
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 397
    +y 151
    +w 100
    +h 20
    +controlPv "$(P)$(R).F64OUT"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 417
    +y 126
    +w 60
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 17
    +useDisplayBg
    +value {
    + "Active"
    +}
    +visPv "CALC\\\{(A=3)\}($(P)$(R).IFACE)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 407
    +y 126
    +w 80
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 21
    +useDisplayBg
    +value {
    + "Inactive"
    +}
    +visPv "CALC\\\{(!(A=3))\}($(P)$(R).IFACE)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 392
    +y 101
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 21
    +useDisplayBg
    +value {
    + "Unsupported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).F64IV)"
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 402
    +y 101
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 17
    +useDisplayBg
    +value {
    + "Supported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).F64IV)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 412
    +y 76
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Float64"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 364
    +y 310
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "More..."
    +}
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 320
    +y 43
    +w 110
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).TMOD"
    +indicatorPv "$(P)$(R).TMOD"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 64
    +y 310
    +w 110
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).SCAN"
    +indicatorPv "$(P)$(R).SCAN"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Message Button)
    +object activeMessageButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 179
    +y 310
    +w 80
    +h 20
    +fgColor index 14
    +onColor index 51
    +offColor index 51
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).PROC"
    +pressValue "1"
    +releaseValue 
    +onLabel "Process"
    +offLabel "Process"
    +3d
    +useEnumNumeric
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 5
    +y 101
    +w 130
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).IFACE"
    +indicatorPv "$(P)$(R).IFACE"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Related Display)
    +object relatedDisplayClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 439
    +y 310
    +w 56
    +h 20
    +fgColor index 14
    +bgColor index 51
    +topShadowColor index 2
    +botShadowColor index 12
    +font "helvetica-medium-r-10.0"
    +icon
    +numPvs 0
    +numDsps 0
    +displayFileName {
    +}
    +menuLabel {
    +}
    +endObjectProperties
    +
    diff --git a/opi/edm/autoconvert/asynSerialPortSetup.edl b/opi/edm/autoconvert/asynSerialPortSetup.edl
    new file mode 100644
    index 0000000..a895df4
    --- /dev/null
    +++ b/opi/edm/autoconvert/asynSerialPortSetup.edl
    @@ -0,0 +1,518 @@
    +4 0 0
    +beginScreenProperties
    +major 4
    +minor 0
    +release 0
    +x 228
    +y 79
    +w 260
    +h 300
    +font "helvetica-medium-r-18.0"
    +ctlFont "helvetica-medium-r-8.0"
    +btnFont "helvetica-medium-r-18.0"
    +fgColor index 14
    +bgColor index 4
    +textColor index 14
    +ctlFgColor1 index 30
    +ctlFgColor2 index 32
    +ctlBgColor1 index 34
    +ctlBgColor2 index 35
    +topShadowColor index 37
    +botShadowColor index 44
    +snapToGrid
    +gridSize 5
    +endScreenProperties
    +
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 2
    +w 259
    +h 15
    +lineColor index 2
    +fill
    +fillColor index 2
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 2
    +w 260
    +h 16
    +font "helvetica-medium-r-8.0"
    +fontAlign "center"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "$(P)$(R)"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 148
    +y 25
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 17
    +useDisplayBg
    +value {
    + "Supported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).OPTIONIV)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 138
    +y 25
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 21
    +useDisplayBg
    +value {
    + "Unsupported"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).OPTIONIV)"
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 8
    +y 25
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "asynOption:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 43
    +y 51
    +w 100
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Baud rate:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 43
    +y 76
    +w 100
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Baud rate:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 43
    +y 101
    +w 100
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Data bits:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 43
    +y 126
    +w 100
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Stop bits:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 3
    +y 176
    +w 140
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Modem control:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 73
    +y 151
    +w 70
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Parity:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 13
    +y 201
    +w 130
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Flow control:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 23
    +y 226
    +w 120
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "XOFF output:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 33
    +y 251
    +w 110
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "XOFF input:"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 63
    +y 276
    +w 80
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "XON=any:"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 76
    +w 102
    +h 18
    +controlPv "$(P)$(R).LBAUD"
    +font "helvetica-medium-r-8.0"
    +smartRefresh
    +fastUpdate
    +fgColor index 14
    +bgColor index 51
    +editable
    +autoHeight
    +format decimal
    +motifWidget
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 51
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).BAUD"
    +indicatorPv "$(P)$(R).BAUD"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 101
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).DBIT"
    +indicatorPv "$(P)$(R).DBIT"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 126
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).SBIT"
    +indicatorPv "$(P)$(R).SBIT"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 151
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).PRTY"
    +indicatorPv "$(P)$(R).PRTY"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 176
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).MCTL"
    +indicatorPv "$(P)$(R).MCTL"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 201
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).FCTL"
    +indicatorPv "$(P)$(R).FCTL"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 226
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).IXON"
    +indicatorPv "$(P)$(R).IXON"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 251
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).IXOFF"
    +indicatorPv "$(P)$(R).IXOFF"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 150
    +y 276
    +w 102
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R).IXANY"
    +indicatorPv "$(P)$(R).IXANY"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    diff --git a/opi/edm/autoconvert/asynTimeSeries.edl b/opi/edm/autoconvert/asynTimeSeries.edl
    new file mode 100644
    index 0000000..df63c15
    --- /dev/null
    +++ b/opi/edm/autoconvert/asynTimeSeries.edl
    @@ -0,0 +1,353 @@
    +4 0 0
    +beginScreenProperties
    +major 4
    +minor 0
    +release 0
    +x 326
    +y 179
    +w 500
    +h 360
    +font "helvetica-medium-r-18.0"
    +ctlFont "helvetica-medium-r-8.0"
    +btnFont "helvetica-medium-r-18.0"
    +fgColor index 14
    +bgColor index 4
    +textColor index 14
    +ctlFgColor1 index 30
    +ctlFgColor2 index 32
    +ctlBgColor1 index 34
    +ctlBgColor2 index 35
    +topShadowColor index 37
    +botShadowColor index 44
    +snapToGrid
    +gridSize 5
    +endScreenProperties
    +
    +
    +# (Rectangle)
    +object activeRectangleClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 5
    +w 499
    +h 24
    +lineColor index 54
    +fill
    +fillColor index 54
    +lineWidth 0
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 0
    +y 5
    +w 500
    +h 25
    +font "helvetica-medium-r-8.0"
    +fontAlign "center"
    +fgColor index 0
    +useDisplayBg
    +value {
    + "$(P)$(R)"
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 42
    +y 40
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "center"
    +fgColor index 18
    +useDisplayBg
    +value {
    + "Acquiring"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).BUSY)"
    +visInvert
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 95
    +y 40
    +w 40
    +h 20
    +font "helvetica-medium-r-8.0"
    +fontAlign "center"
    +fgColor index 21
    +useDisplayBg
    +value {
    + "Done"
    +}
    +visPv "CALC\\\{(A)\}($(P)$(R).BUSY)"
    +visMin 0
    +visMax 1
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 142
    +y 40
    +w 60
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Status"
    +}
    +endObjectProperties
    +
    +# (Text Control)
    +object activeXTextDspClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 224
    +y 40
    +w 100
    +h 20
    +controlPv "$(P)$(R).NORD"
    +font "helvetica-medium-r-8.0"
    +fontAlign "right"
    +smartRefresh
    +fastUpdate
    +fgColor index 54
    +bgColor index 4
    +autoHeight
    +format decimal
    +nullColor index 32
    +useHexPrefix
    +objType "controls"
    +newPos
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 329
    +y 40
    +w 130
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Current point"
    +}
    +endObjectProperties
    +
    +# (X-Y Graph)
    +object xyGraphClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 10
    +y 92
    +w 480
    +h 230
    +# Appearance
    +border
    +graphTitle "$(P)$(R)"
    +xLabel "Time point"
    +yLabel "Value"
    +fgColor index 14
    +bgColor index 2
    +gridColor index 14
    +font "helvetica-medium-r-10.0"
    +# Operating Modes
    +plotMode "plotLastNPts"
    +nPts 1
    +#  X axis properties
    +showXAxis
    +xAxisSrc "AutoScale"
    +xLablePrecision 1
    +#  Y axis properties
    +showYAxis
    +yAxisSrc "AutoScale"
    +#  Trace Properties
    +numTraces 1
    +yPv {
    +  0 "$(P)$(R).VAL"
    +}
    +plotStyle {
    +  0 "line"
    +}
    +plotUpdateMode {
    +  0 "x"
    +}
    +plotSymbolType {
    +  0 "circle"
    +}
    +plotColor {
    +  0 index 27
    +}
    +endObjectProperties
    +
    +# (Static Text)
    +object activeXTextClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 117
    +y 329
    +w 90
    +h 20
    +font "helvetica-medium-r-8.0"
    +fgColor index 14
    +useDisplayBg
    +value {
    + "Read rate"
    +}
    +endObjectProperties
    +
    +# (Message Button)
    +object activeMessageButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 15
    +y 65
    +w 90
    +h 20
    +fgColor index 14
    +onColor index 51
    +offColor index 51
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).RARM"
    +pressValue "1"
    +releaseValue 
    +onLabel "Erase/Start"
    +offLabel "Erase/Start"
    +3d
    +useEnumNumeric
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Message Button)
    +object activeMessageButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 110
    +y 65
    +w 90
    +h 20
    +fgColor index 14
    +onColor index 51
    +offColor index 51
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).RARM"
    +pressValue "3"
    +releaseValue 
    +onLabel "Start"
    +offLabel "Start"
    +3d
    +useEnumNumeric
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Message Button)
    +object activeMessageButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 205
    +y 65
    +w 90
    +h 20
    +fgColor index 14
    +onColor index 51
    +offColor index 51
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R).RARM"
    +pressValue "2"
    +releaseValue 
    +onLabel "Stop"
    +offLabel "Stop"
    +3d
    +useEnumNumeric
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Menu Button)
    +object activeMenuButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 10
    +y 329
    +w 100
    +h 20
    +fgColor index 14
    +bgColor index 51
    +inconsistentColor index 12
    +topShadowColor index 2
    +botShadowColor index 12
    +controlPv "$(P)$(R)Read.SCAN"
    +indicatorPv "$(P)$(R)Read.SCAN"
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    +# (Message Button)
    +object activeMessageButtonClass
    +beginObjectProperties
    +major 4
    +minor 0
    +release 0
    +x 217
    +y 329
    +w 50
    +h 20
    +fgColor index 14
    +onColor index 51
    +offColor index 51
    +topShadowColor index 0
    +botShadowColor index 14
    +controlPv "$(P)$(R)Read.PROC"
    +pressValue "1"
    +releaseValue 
    +onLabel "Read"
    +offLabel "Read"
    +3d
    +useEnumNumeric
    +font "helvetica-medium-r-10.0"
    +endObjectProperties
    +
    diff --git a/opi/medm/asynGPIBSetup.adl b/opi/medm/asynGPIBSetup.adl
    index 12446ce..c682840 100644
    --- a/opi/medm/asynGPIBSetup.adl
    +++ b/opi/medm/asynGPIBSetup.adl
    @@ -1,12 +1,12 @@
     
     file {
    -	name="C:\Program Files\EPICS\adls\asynGPIBSetup.adl"
    -	version=020306
    +	name="/home/epics/devel/asyn-4-33/opi/medm/asynGPIBSetup.adl"
    +	version=030109
     }
     display {
     	object {
    -		x=288
    -		y=334
    +		x=456
    +		y=239
     		width=375
     		height=185
     	}
    @@ -87,77 +87,55 @@ display {
     		1a7309,
     	}
     }
    -composite {
    +rectangle {
     	object {
    -		x=86
    +		x=0
     		y=8
    -		width=203
    +		width=375
     		height=29
     	}
    -	"composite name"=""
    -	children {
    -		rectangle {
    -			object {
    -				x=86
    -				y=8
    -				width=203
    -				height=29
    -			}
    -			"basic attribute" {
    -				clr=2
    -			}
    -		}
    -		text {
    -			object {
    -				x=89
    -				y=12
    -				width=199
    -				height=21
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="$(P)$(R)"
    -			align="horiz. centered"
    -		}
    +	"basic attribute" {
    +		clr=2
    +	}
    +}
    +text {
    +	object {
    +		x=0
    +		y=12
    +		width=375
    +		height=25
    +	}
    +	"basic attribute" {
    +		clr=14
     	}
    +	textix="$(P)$(R)"
    +	align="horiz. centered"
     }
    -composite {
    +text {
     	object {
     		x=4
     		y=68
    -		width=210
    +		width=130
     		height=20
     	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=4
    -				y=68
    -				width=130
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="GPIB address:"
    -		}
    -		"text entry" {
    -			object {
    -				x=139
    -				y=68
    -				width=75
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).ADDR"
    -				clr=14
    -				bclr=51
    -			}
    -			limits {
    -			}
    -		}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="GPIB address:"
    +}
    +"text entry" {
    +	object {
    +		x=139
    +		y=68
    +		width=75
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).ADDR"
    +		clr=14
    +		bclr=51
    +	}
    +	limits {
     	}
     }
     text {
    @@ -188,76 +166,54 @@ text {
     	limits {
     	}
     }
    -composite {
    +text {
     	object {
     		x=4
     		y=126
    -		width=355
    +		width=170
     		height=20
     	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=4
    -				y=126
    -				width=170
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Universal Command"
    -		}
    -		menu {
    -			object {
    -				x=179
    -				y=126
    -				width=180
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).UCMD"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    +	"basic attribute" {
    +		clr=14
     	}
    +	textix="Universal Command"
     }
    -composite {
    +menu {
    +	object {
    +		x=179
    +		y=126
    +		width=180
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).UCMD"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
     	object {
     		x=4
     		y=151
    -		width=355
    +		width=170
     		height=20
     	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=4
    -				y=151
    -				width=170
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Addressed Command"
    -		}
    -		menu {
    -			object {
    -				x=179
    -				y=151
    -				width=180
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).ACMD"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Addressed Command"
    +}
    +menu {
    +	object {
    +		x=179
    +		y=151
    +		width=180
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).ACMD"
    +		clr=14
    +		bclr=51
     	}
     }
     text {
    @@ -296,7 +252,7 @@ text {
     	object {
     		x=4
     		y=42
    -		width=200
    +		width=190
     		height=20
     	}
     	"basic attribute" {
    diff --git a/opi/medm/asynIPPortSetup.adl b/opi/medm/asynIPPortSetup.adl
    index 682e358..fdd62ab 100644
    --- a/opi/medm/asynIPPortSetup.adl
    +++ b/opi/medm/asynIPPortSetup.adl
    @@ -1,12 +1,12 @@
     
     file {
    -	name="/home/epics/devel/asyn-4-28/opi/medm/asynIPPortSetup.adl"
    -	version=030107
    +	name="/home/epics/devel/asyn-4-33/opi/medm/asynIPPortSetup.adl"
    +	version=030109
     }
     display {
     	object {
    -		x=500
    -		y=77
    +		x=405
    +		y=149
     		width=260
     		height=410
     	}
    @@ -89,9 +89,9 @@ display {
     }
     rectangle {
     	object {
    -		x=29
    +		x=0
     		y=2
    -		width=203
    +		width=260
     		height=16
     	}
     	"basic attribute" {
    @@ -100,9 +100,9 @@ rectangle {
     }
     text {
     	object {
    -		x=35
    +		x=0
     		y=2
    -		width=190
    +		width=260
     		height=16
     	}
     	"basic attribute" {
    @@ -157,9 +157,9 @@ text {
     }
     text {
     	object {
    -		x=8
    +		x=13
     		y=51
    -		width=135
    +		width=130
     		height=20
     	}
     	"basic attribute" {
    @@ -170,9 +170,9 @@ text {
     }
     text {
     	object {
    -		x=8
    +		x=13
     		y=76
    -		width=135
    +		width=130
     		height=20
     	}
     	"basic attribute" {
    @@ -183,9 +183,9 @@ text {
     }
     text {
     	object {
    -		x=8
    +		x=43
     		y=101
    -		width=135
    +		width=100
     		height=20
     	}
     	"basic attribute" {
    @@ -194,326 +194,294 @@ text {
     	textix="Host info:"
     	align="horiz. right"
     }
    -composite {
    +"text entry" {
    +	object {
    +		x=150
    +		y=101
    +		width=102
    +		height=18
    +	}
    +	control {
    +		chan="$(P)$(R).HOSTINFO"
    +		clr=14
    +		bclr=51
    +	}
    +	format="string"
    +	limits {
    +	}
    +}
    +menu {
     	object {
     		x=150
     		y=76
     		width=102
    -		height=43
    -	}
    -	"composite name"=""
    -	children {
    -		"text entry" {
    -			object {
    -				x=150
    -				y=101
    -				width=102
    -				height=18
    -			}
    -			control {
    -				chan="$(P)$(R).HOSTINFO"
    -				clr=14
    -				bclr=51
    -			}
    -			limits {
    -			}
    -		}
    -		menu {
    -			object {
    -				x=150
    -				y=76
    -				width=102
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).DRTO"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -	}
    -}
    -composite {
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).DRTO"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=43
    +		y=206
    +		width=100
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Data bits:"
    +	align="horiz. right"
    +}
    +text {
    +	object {
    +		x=43
    +		y=231
    +		width=100
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Stop bits:"
    +	align="horiz. right"
    +}
    +text {
    +	object {
    +		x=3
    +		y=281
    +		width=140
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Modem control:"
    +	align="horiz. right"
    +}
    +text {
    +	object {
    +		x=73
    +		y=256
    +		width=70
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Parity:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=150
    +		y=206
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).DBIT"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +menu {
    +	object {
    +		x=150
    +		y=231
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).SBIT"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +menu {
    +	object {
    +		x=150
    +		y=256
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).PRTY"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +menu {
    +	object {
    +		x=150
    +		y=281
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).MCTL"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=13
    +		y=306
    +		width=130
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Flow control:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=150
    +		y=306
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).FCTL"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=23
    +		y=331
    +		width=120
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="XOFF output:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=150
    +		y=331
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).IXON"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=33
    +		y=356
    +		width=110
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="XOFF input:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=150
    +		y=356
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).IXOFF"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=63
    +		y=381
    +		width=80
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="XON=any:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=150
    +		y=381
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).IXANY"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=43
    +		y=181
    +		width=100
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Baud rate:"
    +	align="horiz. right"
    +}
    +"text entry" {
    +	object {
    +		x=150
    +		y=181
    +		width=102
    +		height=18
    +	}
    +	control {
    +		chan="$(P)$(R).LBAUD"
    +		clr=14
    +		bclr=51
    +	}
    +	limits {
    +	}
    +}
    +text {
    +	object {
    +		x=15
    +		y=151
    +		width=230
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="COM (RFC 2217) protocol"
    +	align="horiz. right"
    +}
    +text {
     	object {
     		x=5
     		y=130
     		width=250
    -		height=271
    -	}
    -	"composite name"=""
    -	children {
    -		composite {
    -			object {
    -				x=8
    -				y=181
    -				width=244
    -				height=220
    -			}
    -			"composite name"=""
    -			children {
    -				text {
    -					object {
    -						x=8
    -						y=206
    -						width=135
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=14
    -					}
    -					textix="Data bits:"
    -					align="horiz. right"
    -				}
    -				text {
    -					object {
    -						x=8
    -						y=231
    -						width=135
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=14
    -					}
    -					textix="Stop bits:"
    -					align="horiz. right"
    -				}
    -				text {
    -					object {
    -						x=8
    -						y=281
    -						width=135
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=14
    -					}
    -					textix="Modem control:"
    -					align="horiz. right"
    -				}
    -				text {
    -					object {
    -						x=8
    -						y=256
    -						width=135
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=14
    -					}
    -					textix="Parity:"
    -					align="horiz. right"
    -				}
    -				menu {
    -					object {
    -						x=150
    -						y=206
    -						width=102
    -						height=20
    -					}
    -					control {
    -						chan="$(P)$(R).DBIT"
    -						clr=14
    -						bclr=51
    -					}
    -				}
    -				menu {
    -					object {
    -						x=150
    -						y=231
    -						width=102
    -						height=20
    -					}
    -					control {
    -						chan="$(P)$(R).SBIT"
    -						clr=14
    -						bclr=51
    -					}
    -				}
    -				menu {
    -					object {
    -						x=150
    -						y=256
    -						width=102
    -						height=20
    -					}
    -					control {
    -						chan="$(P)$(R).PRTY"
    -						clr=14
    -						bclr=51
    -					}
    -				}
    -				menu {
    -					object {
    -						x=150
    -						y=281
    -						width=102
    -						height=20
    -					}
    -					control {
    -						chan="$(P)$(R).MCTL"
    -						clr=14
    -						bclr=51
    -					}
    -				}
    -				text {
    -					object {
    -						x=8
    -						y=306
    -						width=135
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=14
    -					}
    -					textix="Flow control:"
    -					align="horiz. right"
    -				}
    -				menu {
    -					object {
    -						x=150
    -						y=306
    -						width=102
    -						height=20
    -					}
    -					control {
    -						chan="$(P)$(R).FCTL"
    -						clr=14
    -						bclr=51
    -					}
    -				}
    -				text {
    -					object {
    -						x=8
    -						y=331
    -						width=135
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=14
    -					}
    -					textix="XOFF output:"
    -					align="horiz. right"
    -				}
    -				menu {
    -					object {
    -						x=150
    -						y=331
    -						width=102
    -						height=20
    -					}
    -					control {
    -						chan="$(P)$(R).IXON"
    -						clr=14
    -						bclr=51
    -					}
    -				}
    -				text {
    -					object {
    -						x=8
    -						y=356
    -						width=135
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=14
    -					}
    -					textix="XOFF input:"
    -					align="horiz. right"
    -				}
    -				menu {
    -					object {
    -						x=150
    -						y=356
    -						width=102
    -						height=20
    -					}
    -					control {
    -						chan="$(P)$(R).IXOFF"
    -						clr=14
    -						bclr=51
    -					}
    -				}
    -				text {
    -					object {
    -						x=8
    -						y=381
    -						width=135
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=14
    -					}
    -					textix="XON=any:"
    -					align="horiz. right"
    -				}
    -				menu {
    -					object {
    -						x=150
    -						y=381
    -						width=102
    -						height=20
    -					}
    -					control {
    -						chan="$(P)$(R).IXANY"
    -						clr=14
    -						bclr=51
    -					}
    -				}
    -				text {
    -					object {
    -						x=8
    -						y=181
    -						width=135
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=14
    -					}
    -					textix="Baud rate:"
    -					align="horiz. right"
    -				}
    -				"text entry" {
    -					object {
    -						x=150
    -						y=181
    -						width=102
    -						height=18
    -					}
    -					control {
    -						chan="$(P)$(R).LBAUD"
    -						clr=14
    -						bclr=51
    -					}
    -					limits {
    -					}
    -				}
    -			}
    -		}
    -		text {
    -			object {
    -				x=15
    -				y=151
    -				width=230
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="COM (RFC 2217) protocol"
    -			align="horiz. right"
    -		}
    -		text {
    -			object {
    -				x=5
    -				y=130
    -				width=250
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Parameters for ports with"
    -			align="horiz. right"
    -		}
    +		height=20
     	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Parameters for ports with"
    +	align="horiz. right"
     }
    diff --git a/opi/medm/asynOctet.adl b/opi/medm/asynOctet.adl
    index efad08b..2d192b5 100755
    --- a/opi/medm/asynOctet.adl
    +++ b/opi/medm/asynOctet.adl
    @@ -1,12 +1,12 @@
     
     file {
    -	name="/home/epics/devel/asyn/medm/asynOctet.adl"
    -	version=030102
    +	name="/home/epics/devel/asyn-4-33/opi/medm/asynOctet.adl"
    +	version=030109
     }
     display {
     	object {
    -		x=514
    -		y=515
    +		x=457
    +		y=494
     		width=442
     		height=350
     	}
    @@ -103,116 +103,83 @@ display {
     	limits {
     	}
     }
    -composite {
    +text {
     	object {
     		x=6
     		y=43
    -		width=424
    -		height=20
    -	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=6
    -				y=43
    -				width=140
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Timeout (sec):"
    -		}
    -		"text entry" {
    -			object {
    -				x=151
    -				y=43
    -				width=50
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).TMOT"
    -				clr=14
    -				bclr=51
    -			}
    -			limits {
    -			}
    -		}
    -		composite {
    -			object {
    -				x=225
    -				y=43
    -				width=205
    -				height=20
    -			}
    -			"composite name"=""
    -			children {
    -				menu {
    -					object {
    -						x=320
    -						y=43
    -						width=110
    -						height=20
    -					}
    -					control {
    -						chan="$(P)$(R).TMOD"
    -						clr=14
    -						bclr=51
    -					}
    -				}
    -				text {
    -					object {
    -						x=225
    -						y=43
    -						width=90
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=14
    -					}
    -					textix="Transfer:"
    -					align="horiz. right"
    -				}
    -			}
    -		}
    -	}
    -}
    -composite {
    -	object {
    -		x=109
    +		width=140
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Timeout (sec):"
    +}
    +"text entry" {
    +	object {
    +		x=151
    +		y=43
    +		width=50
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).TMOT"
    +		clr=14
    +		bclr=51
    +	}
    +	limits {
    +	}
    +}
    +menu {
    +	object {
    +		x=320
    +		y=43
    +		width=110
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).TMOD"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=225
    +		y=43
    +		width=90
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Transfer:"
    +	align="horiz. right"
    +}
    +rectangle {
    +	object {
    +		x=0
     		y=5
    -		width=241
    +		width=442
     		height=29
     	}
    -	"composite name"=""
    -	children {
    -		rectangle {
    -			object {
    -				x=109
    -				y=5
    -				width=241
    -				height=29
    -			}
    -			"basic attribute" {
    -				clr=2
    -			}
    -		}
    -		text {
    -			object {
    -				x=113
    -				y=9
    -				width=236
    -				height=21
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="$(P)$(R)"
    -			align="horiz. centered"
    -		}
    +	"basic attribute" {
    +		clr=2
     	}
     }
    +text {
    +	object {
    +		x=0
    +		y=9
    +		width=442
    +		height=21
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="$(P)$(R)"
    +	align="horiz. centered"
    +}
     "text entry" {
     	object {
     		x=78
    @@ -225,6 +192,7 @@ composite {
     		clr=14
     		bclr=51
     	}
    +	format="string"
     	limits {
     	}
     }
    @@ -313,6 +281,7 @@ text {
     		clr=14
     		bclr=51
     	}
    +	format="string"
     	limits {
     	}
     }
    @@ -386,7 +355,7 @@ text {
     	object {
     		x=10
     		y=297
    -		width=70
    +		width=110
     		height=20
     	}
     	"basic attribute" {
    @@ -398,7 +367,7 @@ text {
     	object {
     		x=217
     		y=297
    -		width=90
    +		width=130
     		height=20
     	}
     	"basic attribute" {
    @@ -419,6 +388,7 @@ text {
     		bclr=2
     	}
     	clrmod="alarm"
    +	format="string"
     	limits {
     	}
     }
    @@ -435,6 +405,7 @@ text {
     		bclr=2
     	}
     	clrmod="alarm"
    +	format="string"
     	limits {
     	}
     }
    @@ -450,57 +421,46 @@ rectangle {
     		fill="outline"
     	}
     }
    -composite {
    +text {
     	object {
     		x=9
     		y=323
    -		width=250
    -		height=20
    -	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=9
    -				y=323
    -				width=50
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Scan:"
    -			align="horiz. right"
    -		}
    -		menu {
    -			object {
    -				x=64
    -				y=323
    -				width=110
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).SCAN"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -		"message button" {
    -			object {
    -				x=179
    -				y=323
    -				width=80
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).PROC"
    -				clr=14
    -				bclr=51
    -			}
    -			label="Process"
    -			press_msg="1"
    -		}
    +		width=50
    +		height=20
     	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Scan:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=64
    +		y=323
    +		width=110
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).SCAN"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +"message button" {
    +	object {
    +		x=179
    +		y=323
    +		width=80
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).PROC"
    +		clr=14
    +		bclr=51
    +	}
    +	label="Process"
    +	press_msg="1"
     }
     text {
     	object {
    @@ -526,6 +486,7 @@ text {
     		clr=14
     		bclr=51
     	}
    +	format="string"
     	limits {
     	}
     }
    diff --git a/opi/medm/asynRecord.adl b/opi/medm/asynRecord.adl
    index 516c26b..4f71072 100644
    --- a/opi/medm/asynRecord.adl
    +++ b/opi/medm/asynRecord.adl
    @@ -1,7 +1,7 @@
     
     file {
    -	name="/home/epics/devel/asyn/opi/medm/asynRecord.adl"
    -	version=030107
    +	name="/home/epics/devel/asyn-4-33/opi/medm/asynRecord.adl"
    +	version=030109
     }
     display {
     	object {
    @@ -87,41 +87,30 @@ display {
     		1a7309,
     	}
     }
    -composite {
    +rectangle {
     	object {
    -		x=100
    +		x=0
     		y=8
    -		width=241
    +		width=440
     		height=29
     	}
    -	"composite name"=""
    -	children {
    -		rectangle {
    -			object {
    -				x=100
    -				y=8
    -				width=241
    -				height=29
    -			}
    -			"basic attribute" {
    -				clr=2
    -			}
    -		}
    -		text {
    -			object {
    -				x=104
    -				y=12
    -				width=236
    -				height=21
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="$(P)$(R)"
    -			align="horiz. centered"
    -		}
    +	"basic attribute" {
    +		clr=2
     	}
     }
    +text {
    +	object {
    +		x=0
    +		y=12
    +		width=440
    +		height=21
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="$(P)$(R)"
    +	align="horiz. centered"
    +}
     "text update" {
     	object {
     		x=75
    @@ -142,7 +131,7 @@ text {
     	object {
     		x=10
     		y=181
    -		width=70
    +		width=60
     		height=20
     	}
     	"basic attribute" {
    @@ -272,7 +261,7 @@ text {
     	object {
     		x=68
     		y=316
    -		width=96
    +		width=80
     		height=18
     	}
     	"basic attribute" {
    @@ -284,7 +273,7 @@ text {
     	object {
     		x=68
     		y=385
    -		width=96
    +		width=104
     		height=18
     	}
     	"basic attribute" {
    @@ -296,7 +285,7 @@ text {
     	object {
     		x=68
     		y=362
    -		width=96
    +		width=104
     		height=18
     	}
     	"basic attribute" {
    @@ -308,7 +297,7 @@ text {
     	object {
     		x=68
     		y=339
    -		width=96
    +		width=104
     		height=18
     	}
     	"basic attribute" {
    @@ -320,7 +309,7 @@ text {
     	object {
     		x=9
     		y=269
    -		width=100
    +		width=90
     		height=20
     	}
     	"basic attribute" {
    @@ -332,7 +321,7 @@ text {
     	object {
     		x=242
     		y=362
    -		width=100
    +		width=80
     		height=18
     	}
     	"basic attribute" {
    @@ -465,80 +454,59 @@ rectangle {
     	limits {
     	}
     }
    -composite {
    +text {
     	object {
     		x=6
     		y=97
    -		width=232
    +		width=80
     		height=20
     	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=6
    -				y=97
    -				width=80
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="drvInfo:"
    -		}
    -		"text entry" {
    -			object {
    -				x=88
    -				y=97
    -				width=150
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).DRVINFO"
    -				clr=14
    -				bclr=51
    -			}
    -			limits {
    -			}
    -		}
    -	}
    -}
    -composite {
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="drvInfo:"
    +}
    +"text entry" {
    +	object {
    +		x=88
    +		y=97
    +		width=150
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).DRVINFO"
    +		clr=14
    +		bclr=51
    +	}
    +	format="string"
    +	limits {
    +	}
    +}
    +menu {
    +	object {
    +		x=111
    +		y=122
    +		width=130
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).IFACE"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
     	object {
     		x=6
     		y=122
    -		width=235
    +		width=100
     		height=20
     	}
    -	"composite name"=""
    -	children {
    -		menu {
    -			object {
    -				x=111
    -				y=122
    -				width=130
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).IFACE"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -		text {
    -			object {
    -				x=6
    -				y=122
    -				width=100
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -				fill="outline"
    -			}
    -			textix="Interface:"
    -		}
    +	"basic attribute" {
    +		clr=14
    +		fill="outline"
     	}
    +	textix="Interface:"
     }
     "message button" {
     	object {
    @@ -582,197 +550,154 @@ text {
     	limits {
     	}
     }
    -composite {
    +text {
    +	object {
    +		x=25
    +		y=212
    +		width=90
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=62
    +	}
    +	"dynamic attribute" {
    +		vis="if not zero"
    +		chan="$(P)$(R).CNCT"
    +	}
    +	textix="Connected"
    +	align="horiz. right"
    +}
    +text {
     	object {
     		x=10
     		y=212
     		width=120
    -		height=42
    -	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=25
    -				y=212
    -				width=90
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=62
    -			}
    -			"dynamic attribute" {
    -				vis="if not zero"
    -				chan="$(P)$(R).CNCT"
    -			}
    -			textix="Connected"
    -			align="horiz. right"
    -		}
    -		text {
    -			object {
    -				x=10
    -				y=212
    -				width=120
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=20
    -			}
    -			"dynamic attribute" {
    -				vis="if zero"
    -				chan="$(P)$(R).CNCT"
    -			}
    -			textix="Disconnected"
    -			align="horiz. right"
    -		}
    -		menu {
    -			object {
    -				x=10
    -				y=234
    -				width=120
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).CNCT"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -	}
    -}
    -composite {
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=20
    +	}
    +	"dynamic attribute" {
    +		vis="if zero"
    +		chan="$(P)$(R).CNCT"
    +	}
    +	textix="Disconnected"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=10
    +		y=234
    +		width=120
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).CNCT"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
     	object {
     		x=6
     		y=47
    -		width=422
    +		width=50
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Port:"
    +}
    +"text entry" {
    +	object {
    +		x=61
    +		y=47
    +		width=150
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).PORT"
    +		clr=14
    +		bclr=51
    +	}
    +	format="string"
    +	limits {
    +	}
    +}
    +text {
    +	object {
    +		x=228
    +		y=47
    +		width=80
     		height=20
     	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=6
    -				y=47
    -				width=50
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Port:"
    -		}
    -		"text entry" {
    -			object {
    -				x=61
    -				y=47
    -				width=150
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).PORT"
    -				clr=14
    -				bclr=51
    -			}
    -			limits {
    -			}
    -		}
    -		text {
    -			object {
    -				x=228
    -				y=47
    -				width=80
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Address:"
    -		}
    -		"text entry" {
    -			object {
    -				x=318
    -				y=47
    -				width=110
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).ADDR"
    -				clr=14
    -				bclr=51
    -			}
    -			limits {
    -			}
    -		}
    -	}
    -}
    -composite {
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Address:"
    +}
    +"text entry" {
    +	object {
    +		x=318
    +		y=47
    +		width=110
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).ADDR"
    +		clr=14
    +		bclr=51
    +	}
    +	limits {
    +	}
    +}
    +menu {
     	object {
     		x=61
     		y=72
    -		width=287
    +		width=120
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).PCNCT"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=243
    +		y=72
    +		width=90
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=62
    +	}
    +	"dynamic attribute" {
    +		vis="if not zero"
    +		chan="$(P)$(R).PCNCT"
    +	}
    +	textix="Connected"
    +	align="horiz. right"
    +}
    +text {
    +	object {
    +		x=228
    +		y=72
    +		width=120
     		height=20
     	}
    -	"composite name"=""
    -	children {
    -		menu {
    -			object {
    -				x=61
    -				y=72
    -				width=120
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).PCNCT"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -		composite {
    -			object {
    -				x=228
    -				y=72
    -				width=120
    -				height=20
    -			}
    -			"composite name"=""
    -			children {
    -				text {
    -					object {
    -						x=243
    -						y=72
    -						width=90
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=62
    -					}
    -					"dynamic attribute" {
    -						vis="if not zero"
    -						chan="$(P)$(R).PCNCT"
    -					}
    -					textix="Connected"
    -					align="horiz. right"
    -				}
    -				text {
    -					object {
    -						x=228
    -						y=72
    -						width=120
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=20
    -					}
    -					"dynamic attribute" {
    -						vis="if zero"
    -						chan="$(P)$(R).PCNCT"
    -					}
    -					textix="Disconnected"
    -					align="horiz. right"
    -				}
    -			}
    -		}
    +	"basic attribute" {
    +		clr=20
     	}
    +	"dynamic attribute" {
    +		vis="if zero"
    +		chan="$(P)$(R).PCNCT"
    +	}
    +	textix="Disconnected"
    +	align="horiz. right"
     }
     text {
     	object {
    @@ -826,7 +751,7 @@ text {
     	object {
     		x=183
     		y=269
    -		width=100
    +		width=110
     		height=20
     	}
     	"basic attribute" {
    @@ -838,7 +763,7 @@ text {
     	object {
     		x=242
     		y=316
    -		width=100
    +		width=96
     		height=18
     	}
     	"basic attribute" {
    @@ -850,7 +775,7 @@ text {
     	object {
     		x=242
     		y=339
    -		width=100
    +		width=104
     		height=18
     	}
     	"basic attribute" {
    @@ -906,7 +831,7 @@ text {
     	object {
     		x=183
     		y=415
    -		width=100
    +		width=130
     		height=20
     	}
     	"basic attribute" {
    @@ -930,42 +855,32 @@ text {
     	limits {
     	}
     }
    -composite {
    +text {
     	object {
     		x=9
    +		y=557
    +		width=88
    +		height=18
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Trace file:"
    +}
    +"text entry" {
    +	object {
    +		x=99
     		y=555
    -		width=420
    +		width=330
     		height=20
     	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=9
    -				y=557
    -				width=80
    -				height=18
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Trace file:"
    -		}
    -		"text entry" {
    -			object {
    -				x=99
    -				y=555
    -				width=330
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).TFIL"
    -				clr=14
    -				bclr=51
    -			}
    -			limits {
    -			}
    -		}
    +	control {
    +		chan="$(P)$(R).TFIL"
    +		clr=14
    +		bclr=51
    +	}
    +	format="string"
    +	limits {
     	}
     }
     "choice button" {
    @@ -986,7 +901,7 @@ text {
     	object {
     		x=68
     		y=408
    -		width=96
    +		width=72
     		height=18
     	}
     	"basic attribute" {
    @@ -1024,7 +939,7 @@ text {
     	object {
     		x=242
     		y=485
    -		width=100
    +		width=104
     		height=18
     	}
     	"basic attribute" {
    @@ -1050,7 +965,7 @@ text {
     	object {
     		x=242
     		y=508
    -		width=100
    +		width=120
     		height=18
     	}
     	"basic attribute" {
    @@ -1076,7 +991,7 @@ text {
     	object {
     		x=242
     		y=462
    -		width=100
    +		width=104
     		height=18
     	}
     	"basic attribute" {
    @@ -1116,7 +1031,7 @@ text {
     	object {
     		x=242
     		y=531
    -		width=100
    +		width=120
     		height=18
     	}
     	"basic attribute" {
    diff --git a/opi/medm/asynRegister.adl b/opi/medm/asynRegister.adl
    index d70ff82..790b485 100755
    --- a/opi/medm/asynRegister.adl
    +++ b/opi/medm/asynRegister.adl
    @@ -1,12 +1,12 @@
     
     file {
    -	name="/home/epics/devel/asyn/medm/asynRegister.adl"
    -	version=030102
    +	name="/home/epics/devel/asyn-4-33/opi/medm/asynRegister.adl"
    +	version=030109
     }
     display {
     	object {
    -		x=570
    -		y=110
    +		x=344
    +		y=142
     		width=510
     		height=345
     	}
    @@ -87,80 +87,58 @@ display {
     		1a7309,
     	}
     }
    -composite {
    +text {
     	object {
     		x=6
     		y=43
    -		width=424
    -		height=20
    -	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=6
    -				y=43
    -				width=140
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Timeout (sec):"
    -		}
    -		"text entry" {
    -			object {
    -				x=151
    -				y=43
    -				width=50
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).TMOT"
    -				clr=14
    -				bclr=51
    -			}
    -			limits {
    -			}
    -		}
    -		composite {
    -			object {
    -				x=225
    -				y=43
    -				width=205
    -				height=20
    -			}
    -			"composite name"=""
    -			children {
    -				menu {
    -					object {
    -						x=320
    -						y=43
    -						width=110
    -						height=20
    -					}
    -					control {
    -						chan="$(P)$(R).TMOD"
    -						clr=14
    -						bclr=51
    -					}
    -				}
    -				text {
    -					object {
    -						x=225
    -						y=43
    -						width=90
    -						height=20
    -					}
    -					"basic attribute" {
    -						clr=14
    -					}
    -					textix="Transfer:"
    -					align="horiz. right"
    -				}
    -			}
    -		}
    +		width=140
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Timeout (sec):"
    +}
    +"text entry" {
    +	object {
    +		x=151
    +		y=43
    +		width=50
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).TMOT"
    +		clr=14
    +		bclr=51
    +	}
    +	limits {
    +	}
    +}
    +menu {
    +	object {
    +		x=320
    +		y=43
    +		width=110
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).TMOD"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=225
    +		y=43
    +		width=90
    +		height=20
     	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Transfer:"
    +	align="horiz. right"
     }
     text {
     	object {
    @@ -199,6 +177,7 @@ text {
     		bclr=2
     	}
     	clrmod="alarm"
    +	format="string"
     	limits {
     	}
     }
    @@ -215,6 +194,7 @@ text {
     		bclr=2
     	}
     	clrmod="alarm"
    +	format="string"
     	limits {
     	}
     }
    @@ -230,92 +210,70 @@ rectangle {
     		fill="outline"
     	}
     }
    -composite {
    +text {
     	object {
     		x=9
     		y=310
    -		width=250
    -		height=20
    -	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=9
    -				y=310
    -				width=50
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Scan:"
    -			align="horiz. right"
    -		}
    -		menu {
    -			object {
    -				x=64
    -				y=310
    -				width=110
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).SCAN"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -		"message button" {
    -			object {
    -				x=179
    -				y=310
    -				width=80
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).PROC"
    -				clr=14
    -				bclr=51
    -			}
    -			label="Process"
    -			press_msg="1"
    -		}
    -	}
    -}
    -composite {
    -	object {
    -		x=135
    +		width=50
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Scan:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=64
    +		y=310
    +		width=110
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).SCAN"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +"message button" {
    +	object {
    +		x=179
    +		y=310
    +		width=80
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).PROC"
    +		clr=14
    +		bclr=51
    +	}
    +	label="Process"
    +	press_msg="1"
    +}
    +rectangle {
    +	object {
    +		x=0
     		y=5
    -		width=241
    +		width=510
     		height=29
     	}
    -	"composite name"=""
    -	children {
    -		rectangle {
    -			object {
    -				x=135
    -				y=5
    -				width=241
    -				height=29
    -			}
    -			"basic attribute" {
    -				clr=2
    -			}
    -		}
    -		text {
    -			object {
    -				x=139
    -				y=9
    -				width=236
    -				height=21
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="$(P)$(R)"
    -			align="horiz. centered"
    -		}
    +	"basic attribute" {
    +		clr=2
    +	}
    +}
    +text {
    +	object {
    +		x=0
    +		y=9
    +		width=510
    +		height=21
    +	}
    +	"basic attribute" {
    +		clr=14
     	}
    +	textix="$(P)$(R)"
    +	align="horiz. centered"
     }
     text {
     	object {
    diff --git a/opi/medm/asynSerialPortSetup.adl b/opi/medm/asynSerialPortSetup.adl
    index e1b8503..3e5043a 100644
    --- a/opi/medm/asynSerialPortSetup.adl
    +++ b/opi/medm/asynSerialPortSetup.adl
    @@ -1,430 +1,419 @@
    -
    -file {
    -	name="/home/epics/devel/asyn-4-28/opi/medm/asynSerialPortSetup.adl"
    -	version=030107
    -}
    -display {
    -	object {
    -		x=154
    -		y=74
    -		width=260
    -		height=300
    -	}
    -	clr=14
    -	bclr=4
    -	cmap=""
    -	gridSpacing=5
    -	gridOn=0
    -	snapToGrid=0
    -}
    -"color map" {
    -	ncolors=65
    -	colors {
    -		ffffff,
    -		ececec,
    -		dadada,
    -		c8c8c8,
    -		bbbbbb,
    -		aeaeae,
    -		9e9e9e,
    -		919191,
    -		858585,
    -		787878,
    -		696969,
    -		5a5a5a,
    -		464646,
    -		2d2d2d,
    -		000000,
    -		00d800,
    -		1ebb00,
    -		339900,
    -		2d7f00,
    -		216c00,
    -		fd0000,
    -		de1309,
    -		be190b,
    -		a01207,
    -		820400,
    -		5893ff,
    -		597ee1,
    -		4b6ec7,
    -		3a5eab,
    -		27548d,
    -		fbf34a,
    -		f9da3c,
    -		eeb62b,
    -		e19015,
    -		cd6100,
    -		ffb0ff,
    -		d67fe2,
    -		ae4ebc,
    -		8b1a96,
    -		610a75,
    -		a4aaff,
    -		8793e2,
    -		6a73c1,
    -		4d52a4,
    -		343386,
    -		c7bb6d,
    -		b79d5c,
    -		a47e3c,
    -		7d5627,
    -		58340f,
    -		99ffff,
    -		73dfff,
    -		4ea5f9,
    -		2a63e4,
    -		0a00b8,
    -		ebf1b5,
    -		d4db9d,
    -		bbc187,
    -		a6a462,
    -		8b8239,
    -		73ff6b,
    -		52da3b,
    -		3cb420,
    -		289315,
    -		1a7309,
    -	}
    -}
    -rectangle {
    -	object {
    -		x=29
    -		y=2
    -		width=203
    -		height=16
    -	}
    -	"basic attribute" {
    -		clr=2
    -	}
    -}
    -text {
    -	object {
    -		x=35
    -		y=2
    -		width=190
    -		height=16
    -	}
    -	"basic attribute" {
    -		clr=14
    -	}
    -	textix="$(P)$(R)"
    -	align="horiz. centered"
    -}
    -text {
    -	object {
    -		x=148
    -		y=25
    -		width=90
    -		height=20
    -	}
    -	"basic attribute" {
    -		clr=17
    -	}
    -	"dynamic attribute" {
    -		vis="if not zero"
    -		chan="$(P)$(R).OPTIONIV"
    -	}
    -	textix="Supported"
    -}
    -text {
    -	object {
    -		x=138
    -		y=25
    -		width=110
    -		height=20
    -	}
    -	"basic attribute" {
    -		clr=21
    -	}
    -	"dynamic attribute" {
    -		vis="if zero"
    -		chan="$(P)$(R).OPTIONIV"
    -	}
    -	textix="Unsupported"
    -}
    -text {
    -	object {
    -		x=8
    -		y=25
    -		width=110
    -		height=20
    -	}
    -	"basic attribute" {
    -		clr=14
    -	}
    -	textix="asynOption:"
    -}
    -text {
    -	object {
    -		x=8
    -		y=51
    -		width=135
    -		height=20
    -	}
    -	"basic attribute" {
    -		clr=14
    -	}
    -	textix="Baud rate:"
    -	align="horiz. right"
    -}
    -menu {
    -	object {
    -		x=150
    -		y=51
    -		width=102
    -		height=20
    -	}
    -	control {
    -		chan="$(P)$(R).BAUD"
    -		clr=14
    -		bclr=51
    -	}
    -}
    -text {
    -	object {
    -		x=8
    -		y=76
    -		width=135
    -		height=20
    -	}
    -	"basic attribute" {
    -		clr=14
    -	}
    -	textix="Baud rate:"
    -	align="horiz. right"
    -}
    -composite {
    -	object {
    -		x=8
    -		y=101
    -		width=244
    -		height=195
    -	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=8
    -				y=101
    -				width=135
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Data bits:"
    -			align="horiz. right"
    -		}
    -		text {
    -			object {
    -				x=8
    -				y=126
    -				width=135
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Stop bits:"
    -			align="horiz. right"
    -		}
    -		text {
    -			object {
    -				x=8
    -				y=176
    -				width=135
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Modem control:"
    -			align="horiz. right"
    -		}
    -		text {
    -			object {
    -				x=8
    -				y=151
    -				width=135
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Parity:"
    -			align="horiz. right"
    -		}
    -		menu {
    -			object {
    -				x=150
    -				y=101
    -				width=102
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).DBIT"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -		menu {
    -			object {
    -				x=150
    -				y=126
    -				width=102
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).SBIT"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -		menu {
    -			object {
    -				x=150
    -				y=151
    -				width=102
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).PRTY"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -		menu {
    -			object {
    -				x=150
    -				y=176
    -				width=102
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).MCTL"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -		text {
    -			object {
    -				x=8
    -				y=201
    -				width=135
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Flow control:"
    -			align="horiz. right"
    -		}
    -		menu {
    -			object {
    -				x=150
    -				y=201
    -				width=102
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).FCTL"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -		text {
    -			object {
    -				x=8
    -				y=226
    -				width=135
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="XOFF output:"
    -			align="horiz. right"
    -		}
    -		menu {
    -			object {
    -				x=150
    -				y=226
    -				width=102
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).IXON"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -		text {
    -			object {
    -				x=8
    -				y=251
    -				width=135
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="XOFF input:"
    -			align="horiz. right"
    -		}
    -		menu {
    -			object {
    -				x=150
    -				y=251
    -				width=102
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).IXOFF"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -		text {
    -			object {
    -				x=8
    -				y=276
    -				width=135
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="XON=any:"
    -			align="horiz. right"
    -		}
    -		menu {
    -			object {
    -				x=150
    -				y=276
    -				width=102
    -				height=20
    -			}
    -			control {
    -				chan="$(P)$(R).IXANY"
    -				clr=14
    -				bclr=51
    -			}
    -		}
    -	}
    -}
    -"text entry" {
    -	object {
    -		x=150
    -		y=76
    -		width=102
    -		height=18
    -	}
    -	control {
    -		chan="$(P)$(R).LBAUD"
    -		clr=14
    -		bclr=51
    -	}
    -	limits {
    -	}
    -}
    +
    +file {
    +	name="/home/epics/devel/asyn-4-33/opi/medm/asynSerialPortSetup.adl"
    +	version=030109
    +}
    +display {
    +	object {
    +		x=228
    +		y=79
    +		width=260
    +		height=300
    +	}
    +	clr=14
    +	bclr=4
    +	cmap=""
    +	gridSpacing=5
    +	gridOn=0
    +	snapToGrid=0
    +}
    +"color map" {
    +	ncolors=65
    +	colors {
    +		ffffff,
    +		ececec,
    +		dadada,
    +		c8c8c8,
    +		bbbbbb,
    +		aeaeae,
    +		9e9e9e,
    +		919191,
    +		858585,
    +		787878,
    +		696969,
    +		5a5a5a,
    +		464646,
    +		2d2d2d,
    +		000000,
    +		00d800,
    +		1ebb00,
    +		339900,
    +		2d7f00,
    +		216c00,
    +		fd0000,
    +		de1309,
    +		be190b,
    +		a01207,
    +		820400,
    +		5893ff,
    +		597ee1,
    +		4b6ec7,
    +		3a5eab,
    +		27548d,
    +		fbf34a,
    +		f9da3c,
    +		eeb62b,
    +		e19015,
    +		cd6100,
    +		ffb0ff,
    +		d67fe2,
    +		ae4ebc,
    +		8b1a96,
    +		610a75,
    +		a4aaff,
    +		8793e2,
    +		6a73c1,
    +		4d52a4,
    +		343386,
    +		c7bb6d,
    +		b79d5c,
    +		a47e3c,
    +		7d5627,
    +		58340f,
    +		99ffff,
    +		73dfff,
    +		4ea5f9,
    +		2a63e4,
    +		0a00b8,
    +		ebf1b5,
    +		d4db9d,
    +		bbc187,
    +		a6a462,
    +		8b8239,
    +		73ff6b,
    +		52da3b,
    +		3cb420,
    +		289315,
    +		1a7309,
    +	}
    +}
    +rectangle {
    +	object {
    +		x=0
    +		y=2
    +		width=260
    +		height=16
    +	}
    +	"basic attribute" {
    +		clr=2
    +	}
    +}
    +text {
    +	object {
    +		x=0
    +		y=2
    +		width=260
    +		height=16
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="$(P)$(R)"
    +	align="horiz. centered"
    +}
    +text {
    +	object {
    +		x=148
    +		y=25
    +		width=90
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=17
    +	}
    +	"dynamic attribute" {
    +		vis="if not zero"
    +		chan="$(P)$(R).OPTIONIV"
    +	}
    +	textix="Supported"
    +}
    +text {
    +	object {
    +		x=138
    +		y=25
    +		width=110
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=21
    +	}
    +	"dynamic attribute" {
    +		vis="if zero"
    +		chan="$(P)$(R).OPTIONIV"
    +	}
    +	textix="Unsupported"
    +}
    +text {
    +	object {
    +		x=8
    +		y=25
    +		width=110
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="asynOption:"
    +}
    +text {
    +	object {
    +		x=43
    +		y=51
    +		width=100
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Baud rate:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=150
    +		y=51
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).BAUD"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=43
    +		y=76
    +		width=100
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Baud rate:"
    +	align="horiz. right"
    +}
    +text {
    +	object {
    +		x=43
    +		y=101
    +		width=100
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Data bits:"
    +	align="horiz. right"
    +}
    +text {
    +	object {
    +		x=43
    +		y=126
    +		width=100
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Stop bits:"
    +	align="horiz. right"
    +}
    +text {
    +	object {
    +		x=3
    +		y=176
    +		width=140
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Modem control:"
    +	align="horiz. right"
    +}
    +text {
    +	object {
    +		x=73
    +		y=151
    +		width=70
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Parity:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=150
    +		y=101
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).DBIT"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +menu {
    +	object {
    +		x=150
    +		y=126
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).SBIT"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +menu {
    +	object {
    +		x=150
    +		y=151
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).PRTY"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +menu {
    +	object {
    +		x=150
    +		y=176
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).MCTL"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=13
    +		y=201
    +		width=130
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Flow control:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=150
    +		y=201
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).FCTL"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=23
    +		y=226
    +		width=120
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="XOFF output:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=150
    +		y=226
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).IXON"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=33
    +		y=251
    +		width=110
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="XOFF input:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=150
    +		y=251
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).IXOFF"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +text {
    +	object {
    +		x=63
    +		y=276
    +		width=80
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="XON=any:"
    +	align="horiz. right"
    +}
    +menu {
    +	object {
    +		x=150
    +		y=276
    +		width=102
    +		height=20
    +	}
    +	control {
    +		chan="$(P)$(R).IXANY"
    +		clr=14
    +		bclr=51
    +	}
    +}
    +"text entry" {
    +	object {
    +		x=150
    +		y=76
    +		width=102
    +		height=18
    +	}
    +	control {
    +		chan="$(P)$(R).LBAUD"
    +		clr=14
    +		bclr=51
    +	}
    +	limits {
    +	}
    +}
    diff --git a/opi/medm/asynTimeSeries.adl b/opi/medm/asynTimeSeries.adl
    index 5a35d65..eaced44 100644
    --- a/opi/medm/asynTimeSeries.adl
    +++ b/opi/medm/asynTimeSeries.adl
    @@ -1,12 +1,12 @@
     
     file {
    -	name="/home/epics/devel/asyn/opi/medm/asynTimeSeries.adl"
    -	version=030105
    +	name="/home/epics/devel/asyn-4-33/opi/medm/asynTimeSeries.adl"
    +	version=030109
     }
     display {
     	object {
    -		x=469
    -		y=198
    +		x=326
    +		y=179
     		width=500
     		height=360
     	}
    @@ -89,9 +89,9 @@ display {
     }
     rectangle {
     	object {
    -		x=25
    +		x=0
     		y=5
    -		width=450
    +		width=500
     		height=25
     	}
     	"basic attribute" {
    @@ -100,9 +100,9 @@ rectangle {
     }
     text {
     	object {
    -		x=205
    +		x=0
     		y=5
    -		width=96
    +		width=500
     		height=25
     	}
     	"basic attribute" {
    @@ -111,101 +111,79 @@ text {
     	textix="$(P)$(R)"
     	align="horiz. centered"
     }
    -composite {
    +text {
     	object {
     		x=42
     		y=40
    -		width=160
    +		width=90
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=18
    +	}
    +	"dynamic attribute" {
    +		vis="if not zero"
    +		chan="$(P)$(R).BUSY"
    +	}
    +	textix="Acquiring"
    +	align="horiz. centered"
    +}
    +text {
    +	object {
    +		x=95
    +		y=40
    +		width=40
     		height=20
     	}
    -	"composite name"=""
    -	children {
    -		text {
    -			object {
    -				x=42
    -				y=40
    -				width=90
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=18
    -			}
    -			"dynamic attribute" {
    -				vis="if not zero"
    -				chan="$(P)$(R).BUSY"
    -			}
    -			textix="Acquiring"
    -			align="horiz. centered"
    -		}
    -		text {
    -			object {
    -				x=95
    -				y=40
    -				width=40
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=21
    -			}
    -			"dynamic attribute" {
    -				vis="if zero"
    -				chan="$(P)$(R).BUSY"
    -			}
    -			textix="Done"
    -			align="horiz. centered"
    -		}
    -		text {
    -			object {
    -				x=142
    -				y=40
    -				width=60
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Status"
    -		}
    +	"basic attribute" {
    +		clr=21
    +	}
    +	"dynamic attribute" {
    +		vis="if zero"
    +		chan="$(P)$(R).BUSY"
     	}
    +	textix="Done"
    +	align="horiz. centered"
     }
    -composite {
    +text {
    +	object {
    +		x=142
    +		y=40
    +		width=60
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="Status"
    +}
    +"text update" {
     	object {
     		x=224
     		y=40
    -		width=235
    +		width=100
     		height=20
     	}
    -	"composite name"=""
    -	children {
    -		"text update" {
    -			object {
    -				x=224
    -				y=40
    -				width=100
    -				height=20
    -			}
    -			monitor {
    -				chan="$(P)$(R).NORD"
    -				clr=54
    -				bclr=4
    -			}
    -			align="horiz. right"
    -			limits {
    -			}
    -		}
    -		text {
    -			object {
    -				x=329
    -				y=40
    -				width=130
    -				height=20
    -			}
    -			"basic attribute" {
    -				clr=14
    -			}
    -			textix="Current point"
    -		}
    +	monitor {
    +		chan="$(P)$(R).NORD"
    +		clr=54
    +		bclr=4
    +	}
    +	align="horiz. right"
    +	limits {
    +	}
    +}
    +text {
    +	object {
    +		x=329
    +		y=40
    +		width=130
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
     	}
    +	textix="Current point"
     }
     "cartesian plot" {
     	object {
    @@ -226,6 +204,7 @@ composite {
     	trace[0] {
     		ydata="$(P)$(R).VAL"
     		data_clr=27
    +		yaxis=0
     	}
     	x_axis {
     		rangeStyle="auto-scale"
    diff --git a/testErrorsApp/src/testErrors.cpp b/testErrorsApp/src/testErrors.cpp
    index 216e476..f45cc1a 100644
    --- a/testErrorsApp/src/testErrors.cpp
    +++ b/testErrorsApp/src/testErrors.cpp
    @@ -59,7 +59,7 @@ static void callbackTask(void *drvPvt);
     /** Constructor for the testErrors class.
       * Calls constructor for the asynPortDriver base class.
       * \param[in] portName The name of the asyn port driver to be created. */
    -testErrors::testErrors(const char *portName) 
    +testErrors::testErrors(const char *portName, int canBlock) 
        : asynPortDriver(portName, 
                         1, /* maxAddr */ 
                          /* Interface mask */
    @@ -70,7 +70,7 @@ testErrors::testErrors(const char *portName)
                         asynInt32Mask       | asynFloat64Mask    | asynUInt32DigitalMask | asynOctetMask | 
                           asynInt8ArrayMask | asynInt16ArrayMask | asynInt32ArrayMask    | asynFloat32ArrayMask | asynFloat64ArrayMask |
                           asynEnumMask,
    -                    0, /* asynFlags.  This driver does not block and it is not multi-device, so flag is 0 */
    +                    canBlock ? ASYN_CANBLOCK : 0, /* asynFlags */
                         1, /* Autoconnect */
                         0, /* Default priority */
                         0) /* Default stack size*/    
    @@ -289,6 +289,18 @@ void testErrors::setEnums()
                         MAX_UINT32_ENUMS, P_MultibitUInt32DigitalValue, 0);
     }
     
    +asynStatus testErrors::setStatusAndSeverity(asynUser *pasynUser)
    +{
    +    int status;
    +    
    +    getIntegerParam(P_StatusReturn, &status);
    +    getIntegerParam(P_AlarmStatus, &pasynUser->alarmStatus);
    +    getIntegerParam(P_AlarmSeverity, &pasynUser->alarmSeverity);
    +    setParamStatus(pasynUser->reason, (asynStatus) status);
    +    setParamAlarmStatus(pasynUser->reason, pasynUser->alarmStatus);
    +    setParamAlarmSeverity(pasynUser->reason, pasynUser->alarmSeverity);
    +    return (asynStatus) status;
    +}
     /** Called when asyn clients call pasynInt32->write().
       * This function sends a signal to the simTask thread if the value of P_Run has changed.
       * For all parameters it sets the value in the parameter library and calls any registered callbacks..
    @@ -298,7 +310,6 @@ asynStatus testErrors::writeInt32(asynUser *pasynUser, epicsInt32 value)
     {
         int function = pasynUser->reason;
         asynStatus status = asynSuccess;
    -    epicsInt32 itemp;
         const char *paramName;
         const char* functionName = "writeInt32";
     
    @@ -317,10 +328,8 @@ asynStatus testErrors::writeInt32(asynUser *pasynUser, epicsInt32 value)
             setEnums();
         }
         else {
    -        /* Set the parameter status in the parameter library except for the above commands with always return OK */
    -        /* Get the current error status */
    -        getIntegerParam(P_StatusReturn, &itemp); status = (asynStatus)itemp;
    -        setParamStatus(function, status);
    +        /* Set the parameter status in the parameter library except for the above commands which always return OK */
    +        status = setStatusAndSeverity(pasynUser);
         }
         
         /* Do callbacks so higher layers see any changes */
    @@ -344,20 +353,17 @@ asynStatus testErrors::writeFloat64(asynUser *pasynUser, epicsFloat64 value)
     {
         int function = pasynUser->reason;
         asynStatus status = asynSuccess;
    -    epicsInt32 itemp;
         const char *paramName;
         const char* functionName = "writeFloat64";
     
    -    /* Get the current error status */
    -    getIntegerParam(P_StatusReturn, &itemp);  status = (asynStatus)itemp;
    -
         /* Fetch the parameter string name for use in debugging */
         getParamName(function, ¶mName);
     
         /* Set the parameter in the parameter library. */
         setDoubleParam(function, value);
    -    /* Set the parameter status in the parameter library. */
    -    setParamStatus(function, status);
    +
    +    /* Set the parameter status in the parameter library */
    +    status = setStatusAndSeverity(pasynUser);
     
         /* Do callbacks so higher layers see any changes */
         callParamCallbacks();
    @@ -381,20 +387,17 @@ asynStatus testErrors::writeUInt32Digital(asynUser *pasynUser, epicsUInt32 value
     {
         int function = pasynUser->reason;
         asynStatus status = asynSuccess;
    -    epicsInt32 itemp;
         const char *paramName;
         const char* functionName = "writeUInt32D";
     
    -    /* Get the current error status */
    -    getIntegerParam(P_StatusReturn, &itemp); status = (asynStatus)itemp;
    -
         /* Fetch the parameter string name for use in debugging */
         getParamName(function, ¶mName);
     
         /* Set the parameter value in the parameter library. */
         setUIntDigitalParam(function, value, mask);
    -    /* Set the parameter status in the parameter library. */
    -    setParamStatus(function, status);
    +
    +    /* Set the parameter status in the parameter library */
    +    status = setStatusAndSeverity(pasynUser);
         
         /* Do callbacks so higher layers see any changes */
         callParamCallbacks();
    @@ -422,28 +425,28 @@ asynStatus testErrors::writeOctet(asynUser *pasynUser, const char *value,
     {
         int function = pasynUser->reason;
         asynStatus status = asynSuccess;
    -    epicsInt32 itemp;
    +    const char *paramName;
         const char *functionName = "writeOctet";
     
    -    /* Get the current error status */
    -    getIntegerParam(P_StatusReturn, &itemp); status = (asynStatus)itemp;
    +    /* Fetch the parameter string name for use in debugging */
    +    getParamName(function, ¶mName);
     
         /* Set the parameter in the parameter library. */
         setStringParam(function, (char *)value);
    -    /* Set the parameter status in the parameter library. */
    -    setParamStatus(function, status);
    +    /* Set the parameter status in the parameter library */
    +    status = setStatusAndSeverity(pasynUser);
     
          /* Do callbacks so higher layers see any changes */
         callParamCallbacks();
     
         if (status) 
             epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize, 
    -                  "%s:%s: status=%d, function=%d, value=%s", 
    -                  driverName, functionName, status, function, value);
    +                  "%s:%s: status=%d, function=%d, name=%s, value=%s", 
    +                  driverName, functionName, status, function, paramName, value);
         else        
             asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, 
    -              "%s:%s: function=%d, value=%s\n", 
    -              driverName, functionName, function, value);
    +              "%s:%s: function=%d, name=%s, value=%s\n", 
    +              driverName, functionName, function, paramName, value);
         *nActual = nChars;
         return status;
     }
    @@ -541,14 +544,12 @@ asynStatus testErrors::doReadArray(asynUser *pasynUser, epicsType *value,
         epicsTimeStamp timestamp;
         const char *functionName = "doReadArray";
     
    -    /* Get the current error status */
    -    getIntegerParam(P_StatusReturn, &status);
    -    
         /* Get the current timestamp */
         getTimeStamp(×tamp);
         pasynUser->timestamp = timestamp;
    -    getParamAlarmStatus(function, &pasynUser->alarmStatus);
    -    getParamAlarmSeverity(function, &pasynUser->alarmSeverity);
    +
    +    /* Set the parameter status in the parameter library */
    +    status = setStatusAndSeverity(pasynUser);
     
         if (nElements < ncopy) ncopy = nElements;
         if (function == paramIndex) {
    @@ -610,21 +611,22 @@ extern "C" {
     
     /** EPICS iocsh callable function to call constructor for the testErrors class.
       * \param[in] portName The name of the asyn port driver to be created. */
    -int testErrorsConfigure(const char *portName)
    +int testErrorsConfigure(const char *portName, int canBlock)
     {
    -    new testErrors(portName);
    -    return(asynSuccess);
    +    new testErrors(portName, canBlock);
    +    return asynSuccess;
     }
     
     
     /* EPICS iocsh shell commands */
     
    -static const iocshArg initArg0 = { "portName",iocshArgString};
    -static const iocshArg * const initArgs[] = {&initArg0};
    -static const iocshFuncDef initFuncDef = {"testErrorsConfigure",1,initArgs};
    +static const iocshArg initArg0 = { "portName", iocshArgString};
    +static const iocshArg initArg1 = { "canBlock", iocshArgInt};
    +static const iocshArg * const initArgs[] = {&initArg0, &initArg1};
    +static const iocshFuncDef initFuncDef = {"testErrorsConfigure", 2, initArgs};
     static void initCallFunc(const iocshArgBuf *args)
     {
    -    testErrorsConfigure(args[0].sval);
    +    testErrorsConfigure(args[0].sval, args[1].ival);
     }
     
     void testErrorsRegister(void)
    diff --git a/testErrorsApp/src/testErrors.h b/testErrorsApp/src/testErrors.h
    index 7518aac..d79cf8e 100644
    --- a/testErrorsApp/src/testErrors.h
    +++ b/testErrorsApp/src/testErrors.h
    @@ -44,7 +44,7 @@
       * scanned records. */
     class testErrors : public asynPortDriver {
     public:
    -    testErrors(const char *portName);
    +    testErrors(const char *portName, int canBlock);
                      
         /* These are the methods that we override from asynPortDriver */
         virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
    @@ -101,6 +101,7 @@ class testErrors : public asynPortDriver {
         int uint32EnumSeverities_[MAX_UINT32_ENUMS];
         epicsEventId eventId_;
         void setEnums();
    +    asynStatus setStatusAndSeverity(asynUser *pasynUser);
         epicsInt8     int8ArrayValue_   [MAX_ARRAY_POINTS];
         epicsInt16    int16ArrayValue_  [MAX_ARRAY_POINTS];
         epicsInt32    int32ArrayValue_  [MAX_ARRAY_POINTS];
    diff --git a/testIPServerApp/Db/Makefile b/testIPServerApp/Db/Makefile
    index e3d7750..83fb72c 100644
    --- a/testIPServerApp/Db/Makefile
    +++ b/testIPServerApp/Db/Makefile
    @@ -1,5 +1,6 @@
     TOP=../..
     include $(TOP)/configure/CONFIG
     DB += testIPServer.db
    +DB += testIPServer1.db
     DB += asynPortTest.db
     include $(TOP)/configure/RULES
    diff --git a/testIPServerApp/Db/testIPServer1.db b/testIPServerApp/Db/testIPServer1.db
    new file mode 100644
    index 0000000..c4e4381
    --- /dev/null
    +++ b/testIPServerApp/Db/testIPServer1.db
    @@ -0,0 +1,9 @@
    +record(stringin,"$(P)stringInput") {
    +    field(DTYP, "asynOctetRead")
    +    field(INP, "@asyn($(PORT),0,1)")
    +}
    +record(stringout,"$(P)stringOutput") {
    +    field(DTYP, "asynOctetWrite")
    +    field(OUT, "@asyn($(PORT),0,1)")
    +}
    +
    diff --git a/testOutputCallbackApp/Db/Makefile b/testOutputCallbackApp/Db/Makefile
    new file mode 100644
    index 0000000..50b0b56
    --- /dev/null
    +++ b/testOutputCallbackApp/Db/Makefile
    @@ -0,0 +1,4 @@
    +TOP=../..
    +include $(TOP)/configure/CONFIG
    +DB += testOutputCallback.db
    +include $(TOP)/configure/RULES
    diff --git a/testOutputCallbackApp/Db/testOutputCallback.db b/testOutputCallbackApp/Db/testOutputCallback.db
    new file mode 100644
    index 0000000..89d8af2
    --- /dev/null
    +++ b/testOutputCallbackApp/Db/testOutputCallback.db
    @@ -0,0 +1,106 @@
    +record(longout, "$(P)LongoutInt32")
    +{
    +   field(PINI, "$(PINI)")
    +   field(DTYP, "asynInt32")
    +   field(OUT,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))INT32_VALUE")
    +   info(asyn:READBACK,"1")
    +}
    +
    +record(longin, "$(P)LonginInt32")
    +{
    +   field(DTYP, "asynInt32")
    +   field(INP,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))INT32_VALUE")
    +   field(SCAN, "I/O Intr")
    +}
    +
    +record(bo, "$(P)BoInt32")
    +{
    +   field(PINI, "$(PINI)")
    +   field(DTYP, "asynInt32")
    +   field(OUT,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))INT32_BINARY_VALUE")
    +   field(ZNAM, "Zero")
    +   field(ONAM, "One")
    +  info(asyn:READBACK,"1")
    +}
    +
    +record(bi, "$(P)BiInt32")
    +{
    +   field(DTYP, "asynInt32")
    +   field(INP,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))INT32_BINARY_VALUE")
    +   field(ZNAM, "Zero")
    +   field(ONAM, "One")
    +   field(SCAN, "I/O Intr")
    +}
    +
    +record(longout, "$(P)LongoutUInt32D")
    +{
    +   field(PINI, "$(PINI)")
    +   field(DTYP, "asynUInt32Digital")
    +   field(OUT,  "@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))UINT32D_VALUE")
    +   info(asyn:READBACK,"1")
    +}
    +
    +record(longin, "$(P)LonginUInt32D")
    +{
    +   field(DTYP, "asynUInt32Digital")
    +   field(INP,  "@asynMask($(PORT),$(ADDR),0xFFFFFFFF,$(TIMEOUT))UINT32D_VALUE")
    +   field(SCAN, "I/O Intr")
    +}
    +
    +record(ao, "$(P)AoFloat64")
    +{
    +   field(PINI, "$(PINI)")
    +   field(DTYP, "asynFloat64")
    +   field(OUT,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))FLOAT64_VALUE")
    +   field(PREC, "1")
    +   info(asyn:READBACK,"1")
    +}
    +
    +record(ai, "$(P)AiFloat64")
    +{
    +   field(DTYP, "asynFloat64")
    +   field(INP,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))FLOAT64_VALUE")
    +   field(SCAN, "I/O Intr")
    +}
    +
    +record(stringout, "$(P)Stringout")
    +{
    +   field(PINI, "$(PINI)")
    +   field(DTYP, "asynOctetWrite")
    +   field(OUT,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))OCTET_VALUE")
    +   field(VAL,  "test")
    +   info(asyn:READBACK,"1")
    +   info(asyn:FIFO, "10")
    +}
    +
    +record(stringin, "$(P)Stringin")
    +{
    +   field(DTYP, "asynOctetRead")
    +   field(INP,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))OCTET_VALUE")
    +   field(SCAN, "I/O Intr")
    +   info(asyn:FIFO, "10")
    +}
    +
    +record(longout, "$(P)NumCallbacks")
    +{
    +   field(DTYP, "asynInt32")
    +   field(OUT,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))NUM_CALLBACKS")
    +   field(VAL,  "1")
    +}
    +
    +record(ao, "$(P)SleepTime")
    +{
    +   field(DTYP, "asynFloat64")
    +   field(OUT,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))SLEEP_TIME")
    +   field(PREC, "3")
    +   field(VAL,  "0.")
    +}
    +
    +record(bo, "$(P)TriggerCallbacks")
    +{
    +   field(DTYP, "asynInt32")
    +   field(OUT,  "@asyn($(PORT),$(ADDR),$(TIMEOUT))TRIGGER_CALLBACKS")
    +   field(VAL,  "1")
    +}
    +
    +
    diff --git a/testOutputCallbackApp/Makefile b/testOutputCallbackApp/Makefile
    new file mode 100644
    index 0000000..daafed6
    --- /dev/null
    +++ b/testOutputCallbackApp/Makefile
    @@ -0,0 +1,5 @@
    +TOP = ..
    +include $(TOP)/configure/CONFIG
    +DIRS += src
    +DIRS += Db
    +include $(TOP)/configure/RULES_DIRS
    diff --git a/testOutputCallbackApp/adl/testOutputCallback.adl b/testOutputCallbackApp/adl/testOutputCallback.adl
    new file mode 100644
    index 0000000..440fb48
    --- /dev/null
    +++ b/testOutputCallbackApp/adl/testOutputCallback.adl
    @@ -0,0 +1,631 @@
    +
    +file {
    +	name="/home/epics/devel/asyn/testOutputCallbackApp/adl/testOutputCallback.adl"
    +	version=030109
    +}
    +display {
    +	object {
    +		x=140
    +		y=123
    +		width=530
    +		height=300
    +	}
    +	clr=14
    +	bclr=4
    +	cmap=""
    +	gridSpacing=5
    +	gridOn=0
    +	snapToGrid=0
    +}
    +"color map" {
    +	ncolors=65
    +	colors {
    +		ffffff,
    +		ececec,
    +		dadada,
    +		c8c8c8,
    +		bbbbbb,
    +		aeaeae,
    +		9e9e9e,
    +		919191,
    +		858585,
    +		787878,
    +		696969,
    +		5a5a5a,
    +		464646,
    +		2d2d2d,
    +		000000,
    +		00d800,
    +		1ebb00,
    +		339900,
    +		2d7f00,
    +		216c00,
    +		fd0000,
    +		de1309,
    +		be190b,
    +		a01207,
    +		820400,
    +		5893ff,
    +		597ee1,
    +		4b6ec7,
    +		3a5eab,
    +		27548d,
    +		fbf34a,
    +		f9da3c,
    +		eeb62b,
    +		e19015,
    +		cd6100,
    +		ffb0ff,
    +		d67fe2,
    +		ae4ebc,
    +		8b1a96,
    +		610a75,
    +		a4aaff,
    +		8793e2,
    +		6a73c1,
    +		4d52a4,
    +		343386,
    +		c7bb6d,
    +		b79d5c,
    +		a47e3c,
    +		7d5627,
    +		58340f,
    +		99ffff,
    +		73dfff,
    +		4ea5f9,
    +		2a63e4,
    +		0a00b8,
    +		ebf1b5,
    +		d4db9d,
    +		bbc187,
    +		a6a462,
    +		8b8239,
    +		73ff6b,
    +		52da3b,
    +		3cb420,
    +		289315,
    +		1a7309,
    +	}
    +}
    +text {
    +	object {
    +		x=109
    +		y=5
    +		width=312
    +		height=25
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="asyn Output Callback Tests"
    +	align="horiz. centered"
    +}
    +composite {
    +	object {
    +		x=90
    +		y=55
    +		width=421
    +		height=20
    +	}
    +	"composite name"=""
    +	children {
    +		text {
    +			object {
    +				x=90
    +				y=55
    +				width=90
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=54
    +			}
    +			textix="asynInt32"
    +		}
    +		text {
    +			object {
    +				x=205
    +				y=55
    +				width=70
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=14
    +			}
    +			textix="longout"
    +			align="horiz. right"
    +		}
    +		"text entry" {
    +			object {
    +				x=280
    +				y=55
    +				width=80
    +				height=20
    +			}
    +			control {
    +				chan="$(P)LongoutInt32"
    +				clr=14
    +				bclr=2
    +			}
    +			limits {
    +			}
    +		}
    +		text {
    +			object {
    +				x=385
    +				y=55
    +				width=60
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=14
    +			}
    +			textix="longin"
    +			align="horiz. right"
    +		}
    +		"text update" {
    +			object {
    +				x=450
    +				y=56
    +				width=61
    +				height=18
    +			}
    +			monitor {
    +				chan="$(P)LonginInt32"
    +				clr=54
    +				bclr=2
    +			}
    +			align="horiz. centered"
    +			limits {
    +			}
    +		}
    +	}
    +}
    +composite {
    +	object {
    +		x=205
    +		y=80
    +		width=306
    +		height=20
    +	}
    +	"composite name"=""
    +	children {
    +		text {
    +			object {
    +				x=205
    +				y=80
    +				width=70
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=14
    +			}
    +			textix="bo"
    +			align="horiz. right"
    +		}
    +		"text entry" {
    +			object {
    +				x=280
    +				y=80
    +				width=80
    +				height=20
    +			}
    +			control {
    +				chan="$(P)BoInt32"
    +				clr=14
    +				bclr=2
    +			}
    +			limits {
    +			}
    +		}
    +		text {
    +			object {
    +				x=425
    +				y=80
    +				width=20
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=14
    +			}
    +			textix="bi"
    +			align="horiz. right"
    +		}
    +		"text update" {
    +			object {
    +				x=450
    +				y=81
    +				width=61
    +				height=18
    +			}
    +			monitor {
    +				chan="$(P)BiInt32"
    +				clr=54
    +				bclr=2
    +			}
    +			align="horiz. centered"
    +			limits {
    +			}
    +		}
    +	}
    +}
    +composite {
    +	object {
    +		x=10
    +		y=105
    +		width=501
    +		height=20
    +	}
    +	"composite name"=""
    +	children {
    +		text {
    +			object {
    +				x=205
    +				y=105
    +				width=70
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=14
    +			}
    +			textix="longout"
    +			align="horiz. right"
    +		}
    +		"text entry" {
    +			object {
    +				x=280
    +				y=105
    +				width=80
    +				height=20
    +			}
    +			control {
    +				chan="$(P)LongoutUInt32D"
    +				clr=14
    +				bclr=2
    +			}
    +			format="hexadecimal"
    +			limits {
    +			}
    +		}
    +		text {
    +			object {
    +				x=385
    +				y=105
    +				width=60
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=14
    +			}
    +			textix="longin"
    +			align="horiz. right"
    +		}
    +		"text update" {
    +			object {
    +				x=450
    +				y=106
    +				width=61
    +				height=18
    +			}
    +			monitor {
    +				chan="$(P)LonginUInt32D"
    +				clr=54
    +				bclr=2
    +			}
    +			align="horiz. centered"
    +			format="hexadecimal"
    +			limits {
    +			}
    +		}
    +		text {
    +			object {
    +				x=10
    +				y=105
    +				width=170
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=54
    +			}
    +			textix="asynUInt32Digital"
    +			align="horiz. centered"
    +		}
    +	}
    +}
    +composite {
    +	object {
    +		x=70
    +		y=130
    +		width=441
    +		height=20
    +	}
    +	"composite name"=""
    +	children {
    +		text {
    +			object {
    +				x=70
    +				y=130
    +				width=110
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=54
    +			}
    +			textix="asynFloat64"
    +		}
    +		text {
    +			object {
    +				x=255
    +				y=130
    +				width=20
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=14
    +			}
    +			textix="ao"
    +			align="horiz. right"
    +		}
    +		"text entry" {
    +			object {
    +				x=280
    +				y=130
    +				width=80
    +				height=20
    +			}
    +			control {
    +				chan="$(P)AoFloat64"
    +				clr=14
    +				bclr=2
    +			}
    +			limits {
    +			}
    +		}
    +		text {
    +			object {
    +				x=425
    +				y=130
    +				width=20
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=14
    +			}
    +			textix="ai"
    +			align="horiz. right"
    +		}
    +		"text update" {
    +			object {
    +				x=450
    +				y=131
    +				width=61
    +				height=18
    +			}
    +			monitor {
    +				chan="$(P)AiFloat64"
    +				clr=54
    +				bclr=2
    +			}
    +			align="horiz. centered"
    +			limits {
    +			}
    +		}
    +	}
    +}
    +text {
    +	object {
    +		x=90
    +		y=155
    +		width=90
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=54
    +	}
    +	textix="asynOctet"
    +	align="horiz. centered"
    +}
    +text {
    +	object {
    +		x=185
    +		y=155
    +		width=90
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="stringout"
    +	align="horiz. right"
    +}
    +"text entry" {
    +	object {
    +		x=280
    +		y=155
    +		width=80
    +		height=20
    +	}
    +	control {
    +		chan="$(P)Stringout"
    +		clr=14
    +		bclr=2
    +	}
    +	format="hexadecimal"
    +	limits {
    +	}
    +}
    +text {
    +	object {
    +		x=365
    +		y=155
    +		width=80
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="stringin"
    +	align="horiz. right"
    +}
    +"text update" {
    +	object {
    +		x=450
    +		y=156
    +		width=61
    +		height=18
    +	}
    +	monitor {
    +		chan="$(P)Stringin"
    +		clr=54
    +		bclr=2
    +	}
    +	align="horiz. centered"
    +	format="hexadecimal"
    +	limits {
    +	}
    +}
    +composite {
    +	object {
    +		x=46
    +		y=247
    +		width=313
    +		height=20
    +	}
    +	"composite name"=""
    +	children {
    +		text {
    +			object {
    +				x=46
    +				y=247
    +				width=170
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=14
    +			}
    +			textix="Trigger callbacks"
    +			align="horiz. right"
    +		}
    +		"message button" {
    +			object {
    +				x=221
    +				y=247
    +				width=138
    +				height=20
    +			}
    +			control {
    +				chan="$(P)TriggerCallbacks"
    +				clr=14
    +				bclr=51
    +			}
    +			label="Trigger callbacks"
    +			press_msg="1"
    +		}
    +	}
    +}
    +composite {
    +	object {
    +		x=174
    +		y=222
    +		width=185
    +		height=20
    +	}
    +	"composite name"=""
    +	children {
    +		text {
    +			object {
    +				x=174
    +				y=222
    +				width=100
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=14
    +			}
    +			textix="Sleep time"
    +			align="horiz. right"
    +		}
    +		"text entry" {
    +			object {
    +				x=279
    +				y=222
    +				width=80
    +				height=20
    +			}
    +			control {
    +				chan="$(P)SleepTime"
    +				clr=14
    +				bclr=2
    +			}
    +			limits {
    +			}
    +		}
    +	}
    +}
    +composite {
    +	object {
    +		x=164
    +		y=197
    +		width=195
    +		height=20
    +	}
    +	"composite name"=""
    +	children {
    +		text {
    +			object {
    +				x=164
    +				y=197
    +				width=110
    +				height=20
    +			}
    +			"basic attribute" {
    +				clr=14
    +			}
    +			textix="# callbacks"
    +			align="horiz. right"
    +		}
    +		"text entry" {
    +			object {
    +				x=279
    +				y=197
    +				width=80
    +				height=20
    +			}
    +			control {
    +				chan="$(P)NumCallbacks"
    +				clr=14
    +				bclr=2
    +			}
    +			limits {
    +			}
    +		}
    +	}
    +}
    +"related display" {
    +	object {
    +		x=259
    +		y=272
    +		width=100
    +		height=20
    +	}
    +	display[0] {
    +		label="asyn record"
    +		name="asynRecord.adl"
    +		args="P=testOutputCallback:,R=asyn1"
    +	}
    +	clr=14
    +	bclr=51
    +	label="asyn record"
    +}
    +text {
    +	object {
    +		x=144
    +		y=272
    +		width=110
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="asyn record"
    +	align="horiz. right"
    +}
    diff --git a/testOutputCallbackApp/adl/testOutputCallbackTop.adl b/testOutputCallbackApp/adl/testOutputCallbackTop.adl
    new file mode 100644
    index 0000000..c4df49a
    --- /dev/null
    +++ b/testOutputCallbackApp/adl/testOutputCallbackTop.adl
    @@ -0,0 +1,121 @@
    +
    +file {
    +	name="/home/epics/devel/asyn-4-32/testOutputCallbackApp/adl/testOutputCallbackTop.adl"
    +	version=030109
    +}
    +display {
    +	object {
    +		x=555
    +		y=59
    +		width=300
    +		height=50
    +	}
    +	clr=14
    +	bclr=4
    +	cmap=""
    +	gridSpacing=5
    +	gridOn=0
    +	snapToGrid=0
    +}
    +"color map" {
    +	ncolors=65
    +	colors {
    +		ffffff,
    +		ececec,
    +		dadada,
    +		c8c8c8,
    +		bbbbbb,
    +		aeaeae,
    +		9e9e9e,
    +		919191,
    +		858585,
    +		787878,
    +		696969,
    +		5a5a5a,
    +		464646,
    +		2d2d2d,
    +		000000,
    +		00d800,
    +		1ebb00,
    +		339900,
    +		2d7f00,
    +		216c00,
    +		fd0000,
    +		de1309,
    +		be190b,
    +		a01207,
    +		820400,
    +		5893ff,
    +		597ee1,
    +		4b6ec7,
    +		3a5eab,
    +		27548d,
    +		fbf34a,
    +		f9da3c,
    +		eeb62b,
    +		e19015,
    +		cd6100,
    +		ffb0ff,
    +		d67fe2,
    +		ae4ebc,
    +		8b1a96,
    +		610a75,
    +		a4aaff,
    +		8793e2,
    +		6a73c1,
    +		4d52a4,
    +		343386,
    +		c7bb6d,
    +		b79d5c,
    +		a47e3c,
    +		7d5627,
    +		58340f,
    +		99ffff,
    +		73dfff,
    +		4ea5f9,
    +		2a63e4,
    +		0a00b8,
    +		ebf1b5,
    +		d4db9d,
    +		bbc187,
    +		a6a462,
    +		8b8239,
    +		73ff6b,
    +		52da3b,
    +		3cb420,
    +		289315,
    +		1a7309,
    +	}
    +}
    +"related display" {
    +	object {
    +		x=195
    +		y=13
    +		width=80
    +		height=20
    +	}
    +	display[0] {
    +		label="testOutputCallback"
    +		name="testOutputCallback.adl"
    +		args="P=testOutputCallback:"
    +	}
    +	display[1] {
    +		label="asynRecord debug"
    +		name="asynRecord.adl"
    +		args="P=testOutputCallback:, R=asyn1"
    +	}
    +	clr=14
    +	bclr=51
    +}
    +text {
    +	object {
    +		x=6
    +		y=12
    +		width=180
    +		height=20
    +	}
    +	"basic attribute" {
    +		clr=14
    +	}
    +	textix="testOutputCallback"
    +}
    diff --git a/testOutputCallbackApp/src/Makefile b/testOutputCallbackApp/src/Makefile
    new file mode 100644
    index 0000000..0d18b57
    --- /dev/null
    +++ b/testOutputCallbackApp/src/Makefile
    @@ -0,0 +1,31 @@
    +TOP=../..
    +
    +include $(TOP)/configure/CONFIG
    +#----------------------------------------
    +#  ADD MACRO DEFINITIONS AFTER THIS LINE
    +#=============================
    +
    +DBD += testOutputCallback.dbd
    +
    +LIBRARY_IOC += testOutputCallbackSupport
    +testOutputCallbackSupport_SRCS += testOutputCallback.cpp
    +testOutputCallbackSupport_LIBS += asyn
    +testOutputCallbackSupport_LIBS += $(EPICS_BASE_IOC_LIBS)
    +
    +#=============================
    +
    +PROD_IOC += testOutputCallback
    +
    +# _registerRecordDeviceDriver.cpp will be created from .dbd
    +testOutputCallback_SRCS_DEFAULT += testOutputCallback_registerRecordDeviceDriver.cpp testOutputCallbackMain.cpp
    +testOutputCallbackVx_SRCS_vxWorks  += testOutputCallback_registerRecordDeviceDriver.cpp
    +testOutputCallback_LIBS += testOutputCallbackSupport asyn
    +testOutputCallback_LIBS += $(EPICS_BASE_IOC_LIBS)
    +
    +testOutputCallback_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary
    +
    +#===========================
    +
    +include $(TOP)/configure/RULES
    +#----------------------------------------
    +#  ADD RULES AFTER THIS LINE
    diff --git a/testOutputCallbackApp/src/testOutputCallback.cpp b/testOutputCallbackApp/src/testOutputCallback.cpp
    new file mode 100644
    index 0000000..9b1b014
    --- /dev/null
    +++ b/testOutputCallbackApp/src/testOutputCallback.cpp
    @@ -0,0 +1,229 @@
    +/*
    + * testOutputCallback.cpp
    + * 
    + * Asyn driver that inherits from the asynPortDriver class to test output records using callbacks
    + * The output records must have the info tag asyn:READBACK
    + * It tests the following:
    + *   Callbacks done in immediately in the writeXXX function
    + *   Callbacks done asynchronously in another driver thread
    + * Configuration parameters in the driver constructor control the following:
    + *   If the driver is synchronous or asynchronous
    + *   How many callbacks are done each time
    + * It does these tests on the asynInt32, asynUInt32Digital, asynFloat64, and asynOctet interfaces
    + * Author: Mark Rivers
    + *
    + * Created November 9, 2017
    + */
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +#include 
    +
    +#include 
    +#include "testOutputCallback.h"
    +
    +//static const char *driverName="testOutputCallback";
    +
    +#define UINT32_DIGITAL_MASK 0xFFFFFFFF
    +
    +static void callbackThreadC(void *pPvt)
    +{
    +    testOutputCallback *p = (testOutputCallback*)pPvt;
    +    p->callbackThread();
    +}
    +
    +/** Constructor for the testOutputCallback class.
    +  * Calls constructor for the asynPortDriver base class.
    +  * \param[in] portName The name of the asyn port driver to be created. */
    +testOutputCallback::testOutputCallback(const char *portName, int canBlock) 
    +   : asynPortDriver(portName, 
    +                    1, /* maxAddr */ 
    +                     /* Interface mask */
    +                    asynInt32Mask | asynFloat64Mask | asynUInt32DigitalMask | asynOctetMask | asynDrvUserMask,
    +                    /* Interrupt mask */
    +                    asynInt32Mask | asynFloat64Mask | asynUInt32DigitalMask | asynOctetMask,
    +                    canBlock ? ASYN_CANBLOCK : 0, /* asynFlags.  canblock is passed to constructor and multi-device is 0 */
    +                    1, /* Autoconnect */
    +                    0, /* Default priority */
    +                    0) /* Default stack size*/,
    +     numCallbacks_(1), sleepTime_(0.)  
    +{
    +    createParam(P_Int32ValueString,                 asynParamInt32,         &P_Int32Value);
    +    createParam(P_Int32BinaryValueString,           asynParamInt32,         &P_Int32BinaryValue);
    +    createParam(P_UInt32DigitalValueString,         asynParamUInt32Digital, &P_UInt32DigitalValue);
    +    createParam(P_Float64ValueString,               asynParamFloat64,       &P_Float64Value);
    +    createParam(P_OctetValueString,                 asynParamOctet,         &P_OctetValue);
    +    createParam(P_NumCallbacksString,               asynParamInt32,         &P_NumCallbacks);
    +    createParam(P_SleepTimeString,                  asynParamFloat64,       &P_SleepTime);
    +    createParam(P_TriggerCallbacksString,           asynParamInt32,         &P_TriggerCallbacks);
    +    
    +    setIntegerParam(P_NumCallbacks, numCallbacks_);
    +    setDoubleParam(P_SleepTime, sleepTime_);
    +    
    +    callbackEvent_ = epicsEventCreate(epicsEventEmpty);
    +    epicsThreadCreate("callbackThread",
    +        epicsThreadPriorityMedium,
    +        epicsThreadGetStackSize(epicsThreadStackSmall),
    +        (EPICSTHREADFUNC)callbackThreadC, this);
    +}
    +
    +asynStatus testOutputCallback::writeInt32(asynUser *pasynUser, epicsInt32 value)
    +{
    +    int function=pasynUser->reason;
    +
    +    setIntegerParam(function, value);
    +
    +    if (function == P_Int32Value) {
    +        doInt32Callbacks();
    +    }
    +    else if (function == P_Int32BinaryValue) {
    +        doInt32BinaryCallbacks();
    +    }
    +    else if (function == P_NumCallbacks) {
    +        numCallbacks_ = value;
    +    }
    +    else if (function == P_TriggerCallbacks) {
    +        epicsEventSignal(callbackEvent_);
    +    }
    +    return asynSuccess;
    +}
    +
    +asynStatus testOutputCallback::writeUInt32Digital(asynUser *pasynUser, epicsUInt32 value, epicsUInt32 mask)
    +{
    +    int function=pasynUser->reason;
    +    setUIntDigitalParam(function, value, mask);
    +    doUInt32DigitalCallbacks();
    +    return asynSuccess;
    +}
    +
    +asynStatus testOutputCallback::writeFloat64(asynUser *pasynUser, epicsFloat64 value)
    +{
    +    int function=pasynUser->reason;
    +    setDoubleParam(function, value);
    +    if (function == P_Float64Value) {
    +        doFloat64Callbacks();
    +    } 
    +    else if (function == P_SleepTime) {
    +        sleepTime_ = value;
    +    }
    +    return asynSuccess;
    +}
    +
    +asynStatus testOutputCallback::writeOctet(asynUser *pasynUser, const char *value, size_t maxChars, size_t *nActual)
    +{
    +    int function=pasynUser->reason;
    +    setStringParam(function, value);
    +    *nActual = strlen(value);
    +    doOctetCallbacks();
    +    return asynSuccess;
    +}
    +
    +void testOutputCallback::doInt32Callbacks()
    +{
    +    epicsInt32 value;
    +    for (int i=0; i 0) epicsThreadSleep(sleepTime_);
    +    }
    +}
    +
    +void testOutputCallback::doInt32BinaryCallbacks()
    +{
    +    epicsInt32 value;
    +    for (int i=0; i 0) epicsThreadSleep(sleepTime_);
    +    }
    +}
    +
    +void testOutputCallback::doUInt32DigitalCallbacks()
    +{
    +    epicsUInt32 value;
    +    for (int i=0; i 0) epicsThreadSleep(sleepTime_);
    +    }
    +}
    +
    +void testOutputCallback::doFloat64Callbacks()
    +{
    +    epicsFloat64 value;
    +    for (int i=0; i 0) epicsThreadSleep(sleepTime_);
    +    }
    +}
    +
    +void testOutputCallback::doOctetCallbacks()
    +{
    +    char value[100];
    +    static int counter;
    +    for (int i=0; i 0) epicsThreadSleep(sleepTime_);
    +    }
    +}
    +
    +void testOutputCallback::callbackThread()
    +{
    +    lock();
    +    while (1) {
    +        unlock();
    +        (void)epicsEventWait(callbackEvent_);
    +        lock();
    +        doInt32Callbacks();
    +        doInt32BinaryCallbacks();
    +        doUInt32DigitalCallbacks();
    +        doFloat64Callbacks();
    +        doOctetCallbacks();
    +    }
    +}
    +
    +
    +/* Configuration routine.  Called directly, or from the iocsh function below */
    +extern "C" {
    +
    +/** EPICS iocsh callable function to call constructor for the testOutputCallback class.
    +  * \param[in] portName The name of the asyn port driver to be created. */
    +int testOutputCallbackConfigure(const char *portName, int canBlock)
    +{
    +    new testOutputCallback(portName, canBlock);
    +    return asynSuccess ;
    +}
    +
    +
    +/* EPICS iocsh shell commands */
    +
    +static const iocshArg initArg0 = { "portName", iocshArgString};
    +static const iocshArg initArg1 = { "canBlock", iocshArgInt};
    +static const iocshArg * const initArgs[] = {&initArg0, &initArg1};
    +static const iocshFuncDef initFuncDef = {"testOutputCallbackConfigure",2,initArgs};
    +static void initCallFunc(const iocshArgBuf *args)
    +{
    +    testOutputCallbackConfigure(args[0].sval, args[1].ival);
    +}
    +
    +void testOutputCallbackRegister(void)
    +{
    +    iocshRegister(&initFuncDef,initCallFunc);
    +}
    +
    +epicsExportRegistrar(testOutputCallbackRegister);
    +
    +}
    +
    diff --git a/testOutputCallbackApp/src/testOutputCallback.h b/testOutputCallbackApp/src/testOutputCallback.h
    new file mode 100644
    index 0000000..e6f1250
    --- /dev/null
    +++ b/testOutputCallbackApp/src/testOutputCallback.h
    @@ -0,0 +1,55 @@
    +/*
    + * testOutputCallback.h
    + * 
    +* Asyn driver that inherits from the asynPortDriver class to test output records using callbacks
    +
    + *
    + * Author: Mark Rivers
    + *
    + * Created November 9, 2017
    + */
    + 
    +#include 
    +#include 
    +
    +/* These are the drvInfo strings that are used to identify the parameters.
    + * They are used by asyn clients, including standard asyn device support */
    +#define P_Int32ValueString                  "INT32_VALUE"             /* asynInt32,         r/w */
    +#define P_Int32BinaryValueString            "INT32_BINARY_VALUE"      /* asynInt32,         r/w */
    +#define P_UInt32DigitalValueString          "UINT32D_VALUE"           /* asynUInt32Digital, r/w */
    +#define P_Float64ValueString                "FLOAT64_VALUE"           /* asynFloat64,       r/w */
    +#define P_OctetValueString                  "OCTET_VALUE"             /* asynOctet,         r/w */
    +#define P_NumCallbacksString                "NUM_CALLBACKS"           /* asynInt32,         r/w */
    +#define P_SleepTimeString                   "SLEEP_TIME"              /* asynFloat64,       r/w */
    +#define P_TriggerCallbacksString            "TRIGGER_CALLBACKS"       /* asynInt32,         r/w */
    +
    +/** Class that tests error handing of the asynPortDriver base class using both normally scanned records and I/O Intr
    +  * scanned records. */
    +class testOutputCallback : public asynPortDriver {
    +public:
    +    testOutputCallback(const char *portName, int canBlock);
    +    asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
    +    asynStatus writeUInt32Digital(asynUser *pasynUser, epicsUInt32 value, epicsUInt32 mask);
    +    asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value);
    +    asynStatus writeOctet(asynUser *pasynUser, const char *value, size_t maxChars, size_t *nActual);
    +    void callbackThread();
    +
    +private:
    +    int P_Int32Value;
    +    int P_Int32BinaryValue;
    +    int P_UInt32DigitalValue;
    +    int P_Float64Value;
    +    int P_OctetValue;
    +    int P_TriggerCallbacks;
    +    int P_NumCallbacks;
    +    int P_SleepTime;
    +
    +    epicsEventId callbackEvent_;
    +    int numCallbacks_;
    +    epicsFloat64 sleepTime_;
    +    void doInt32Callbacks();
    +    void doInt32BinaryCallbacks();
    +    void doUInt32DigitalCallbacks();
    +    void doFloat64Callbacks();
    +    void doOctetCallbacks();
    +};
    diff --git a/testOutputCallbackApp/src/testOutputCallbackInclude.dbd b/testOutputCallbackApp/src/testOutputCallbackInclude.dbd
    new file mode 100644
    index 0000000..3b5c984
    --- /dev/null
    +++ b/testOutputCallbackApp/src/testOutputCallbackInclude.dbd
    @@ -0,0 +1,3 @@
    +include "base.dbd"
    +include "asyn.dbd"
    +registrar("testOutputCallbackRegister")
    diff --git a/testOutputCallbackApp/src/testOutputCallbackMain.cpp b/testOutputCallbackApp/src/testOutputCallbackMain.cpp
    new file mode 100644
    index 0000000..ae0ecb6
    --- /dev/null
    +++ b/testOutputCallbackApp/src/testOutputCallbackMain.cpp
    @@ -0,0 +1,23 @@
    +/* _APPNAME_Main.cpp */
    +/* Author:  Marty Kraimer Date:    17MAR2000 */
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +#include "epicsExit.h"
    +#include "epicsThread.h"
    +#include "iocsh.h"
    +
    +int main(int argc,char *argv[])
    +{
    +    if(argc>=2) {    
    +        iocsh(argv[1]);
    +        epicsThreadSleep(.2);
    +    }
    +    iocsh(NULL);
    +    epicsExit(0);
    +    return(0);
    +}