192 lines
5.1 KiB
C
192 lines
5.1 KiB
C
/*recDynLinkTest.c */
|
||
/*****************************************************************
|
||
COPYRIGHT NOTIFICATION
|
||
*****************************************************************
|
||
|
||
(C) COPYRIGHT 1993 UNIVERSITY OF CHICAGO
|
||
|
||
This software was developed under a United States Government license
|
||
described on the COPYRIGHT_UniversityOfChicago file included as part
|
||
of this distribution.
|
||
***********************************************************************/
|
||
#include <vxWorks.h>
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
#include <stddef.h>
|
||
#include <stdio.h>
|
||
|
||
#include <dbDefs.h>
|
||
#include <tsDefs.h>
|
||
#include <recDynLink.h>
|
||
#include <dbAccess.h>
|
||
|
||
/*The remainder of this source module is test code */
|
||
typedef struct userPvt {
|
||
char *pvname;
|
||
double *pbuffer;
|
||
size_t nRequest;
|
||
}userPvt;
|
||
|
||
LOCAL void mymonitorCallback(recDynLink *precDynLink)
|
||
{
|
||
userPvt *puserPvt;
|
||
long status;
|
||
size_t nRequest;
|
||
TS_STAMP timestamp;
|
||
short AlarmStatus,AlarmSeverity;
|
||
int i;
|
||
char timeStr[40];
|
||
|
||
puserPvt = (userPvt *)precDynLink->puserPvt;
|
||
printf("mymonitorCallback: %s\n",puserPvt->pvname);
|
||
if(recDynLinkConnectionStatus(precDynLink)!=0) {
|
||
printf(" not connected\n");
|
||
return;
|
||
}
|
||
nRequest = puserPvt->nRequest;
|
||
status = recDynLinkGet(precDynLink,puserPvt->pbuffer,&nRequest,
|
||
×tamp,&AlarmStatus,&AlarmSeverity);
|
||
if(status) {
|
||
printf("recDynLinkGet returned illegal status\n");
|
||
return;
|
||
}
|
||
tsStampToText(×tamp,TS_TEXT_MMDDYY,timeStr);
|
||
printf("date %s status %hd severity %hd ",
|
||
timeStr,AlarmStatus,AlarmSeverity);
|
||
for(i=0; i<puserPvt->nRequest; i++) {
|
||
printf(" %f",puserPvt->pbuffer[i]);
|
||
}
|
||
printf("\n");
|
||
}
|
||
|
||
LOCAL void mysearchCallback(recDynLink *precDynLink)
|
||
{
|
||
userPvt *puserPvt;
|
||
size_t nelem;
|
||
double controlLow,controlHigh;
|
||
double graphicLow,graphicHigh;
|
||
int prec;
|
||
char units[20];
|
||
long status;
|
||
|
||
puserPvt = (userPvt *)precDynLink->puserPvt;
|
||
printf("mysearchCallback: %s ",puserPvt->pvname);
|
||
if(recDynLinkConnectionStatus(precDynLink)==0) {
|
||
printf("connected\n");
|
||
status = recDynLinkGetNelem(precDynLink,&nelem);
|
||
if(status) {
|
||
printf("recDynLinkGetNelem failed\n");
|
||
}else{
|
||
printf("nelem = %u\n",nelem);
|
||
}
|
||
status=recDynLinkGetControlLimits(precDynLink,&controlLow,&controlHigh);
|
||
if(status) {
|
||
printf("recDynLinkGetControlLimits failed\n");
|
||
}else{
|
||
printf("controlLow %f controlHigh %f\n",controlLow,controlHigh);
|
||
}
|
||
status=recDynLinkGetGraphicLimits(precDynLink,&graphicLow,&graphicHigh);
|
||
if(status) {
|
||
printf("recDynLinkGetGraphicLimits failed\n");
|
||
}else{
|
||
printf("graphicLow %f graphicHigh %f\n",graphicLow,graphicHigh);
|
||
}
|
||
status = recDynLinkGetPrecision(precDynLink,&prec);
|
||
if(status) {
|
||
printf("recDynLinkGetPrecision failed\n");
|
||
}else{
|
||
printf("prec = %d\n",prec);
|
||
}
|
||
status = recDynLinkGetUnits(precDynLink,units,20);
|
||
if(status) {
|
||
printf("recDynLinkGetUnits failed\n");
|
||
}else{
|
||
printf("units = %s\n",units);
|
||
}
|
||
} else {
|
||
printf(" not connected\n");
|
||
}
|
||
}
|
||
|
||
LOCAL recDynLink getDynlink = {NULL,NULL};
|
||
LOCAL recDynLink putDynlink = {NULL,NULL};
|
||
|
||
int recDynTestInput(char *pvname,int nRequest)
|
||
{
|
||
userPvt *puserPvt= getDynlink.puserPvt;
|
||
long status;
|
||
int options=0;
|
||
|
||
if(puserPvt) {
|
||
recDynLinkClear(&getDynlink);
|
||
free(puserPvt->pbuffer);
|
||
free(getDynlink.puserPvt);
|
||
getDynlink.puserPvt = NULL;
|
||
}
|
||
getDynlink.puserPvt = puserPvt = (userPvt *)calloc(1,sizeof(userPvt));
|
||
puserPvt->pbuffer = calloc(nRequest,sizeof(double));
|
||
puserPvt->nRequest = nRequest;
|
||
puserPvt->pvname = pvname;
|
||
if(nRequest==1) options=rdlSCALAR;;
|
||
status = recDynLinkAddInput(&getDynlink,pvname,
|
||
DBR_DOUBLE,options,
|
||
mysearchCallback,mymonitorCallback);
|
||
if(status) return(status);
|
||
return(status);
|
||
}
|
||
|
||
int recDynTestNewOutput(char *pvname,int nRequest)
|
||
{
|
||
userPvt *puserPvt= putDynlink.puserPvt;
|
||
long status;
|
||
int options=0;
|
||
|
||
if(puserPvt) {
|
||
recDynLinkClear(&putDynlink);
|
||
free(puserPvt->pbuffer);
|
||
free(putDynlink.puserPvt);
|
||
putDynlink.puserPvt = NULL;
|
||
}
|
||
putDynlink.puserPvt = puserPvt = (userPvt *)calloc(1,sizeof(userPvt));
|
||
puserPvt->pbuffer = calloc(nRequest,sizeof(double));
|
||
puserPvt->nRequest = nRequest;
|
||
puserPvt->pvname = pvname;
|
||
if(nRequest==1) options=rdlSCALAR;;
|
||
status = recDynLinkAddOutput(&putDynlink,pvname,
|
||
DBR_DOUBLE,options,mysearchCallback);
|
||
return(status);
|
||
}
|
||
|
||
int recDynTestOutput(int startValue)
|
||
{
|
||
userPvt *puserPvt= putDynlink.puserPvt;
|
||
long status;
|
||
int i;
|
||
|
||
for(i=0; i<puserPvt->nRequest; i++) puserPvt->pbuffer[i] = startValue + i;
|
||
status = recDynLinkPut(&putDynlink,puserPvt->pbuffer,puserPvt->nRequest);
|
||
return(status);
|
||
}
|
||
|
||
int recDynTestClearInput(void)
|
||
{
|
||
userPvt *puserPvt= getDynlink.puserPvt;
|
||
|
||
recDynLinkClear(&getDynlink);
|
||
free(puserPvt->pbuffer);
|
||
free(getDynlink.puserPvt);
|
||
getDynlink.puserPvt = NULL;
|
||
return(0);
|
||
}
|
||
|
||
int recDynTestClearOutput(void)
|
||
{
|
||
userPvt *puserPvt= putDynlink.puserPvt;
|
||
|
||
recDynLinkClear(&putDynlink);
|
||
free(puserPvt->pbuffer);
|
||
free(putDynlink.puserPvt);
|
||
putDynlink.puserPvt = NULL;
|
||
return(0);
|
||
}
|