From 161e66adc4022109ee6991d1f38914ee4fb1eb91 Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Tue, 29 Sep 1998 14:11:33 +0000 Subject: [PATCH] added dbCaGetTimeStamp --- src/db/Makefile.Vx | 1 + src/db/dbAccess.h | 4 +++- src/db/dbCa.c | 37 +++++++++++++++++++++++----------- src/db/dbCa.h | 1 + src/db/dbTest.c | 49 ++++++++++++++++++++++++++++++++++++++++++---- 5 files changed, 76 insertions(+), 16 deletions(-) diff --git a/src/db/Makefile.Vx b/src/db/Makefile.Vx index 20187b15c..ddec48b2c 100644 --- a/src/db/Makefile.Vx +++ b/src/db/Makefile.Vx @@ -2,6 +2,7 @@ TOP = ../../.. include $(TOP)/config/CONFIG_BASE USER_DBDFLAGS += -I .. +USR_CFLAGS += -ansi SRCS.c = \ ../dbLock.c\ diff --git a/src/db/dbAccess.h b/src/db/dbAccess.h index 5e69cc23f..3e2fb2308 100644 --- a/src/db/dbAccess.h +++ b/src/db/dbAccess.h @@ -255,7 +255,8 @@ void dbCaAddLink(struct link *plink); void dbCaRemoveLink(struct link *plink); long dbCaGetLink(struct link *plink,short dbrType,void *pbuffer, unsigned short *psevr,long *nRequest); -long dbCaPutLink(struct link *plink,short dbrType,const void *pbuffer,long nRequest); +long dbCaPutLink(struct link *plink,short dbrType, + const void *pbuffer,long nRequest); long dbCaGetAttributes(struct link *plink, void (*callback)(void *usrPvt),void *usrPvt); long dbCaGetControlLimits(struct link *plink,double *low, double *high); @@ -265,6 +266,7 @@ long dbCaGetAlarmLimits(struct link *plink, long dbCaGetNelements(struct link *plink,long *nelements); long dbCaGetPrecision(struct link *plink,short *precision); long dbCaGetSevr(struct link *plink,short *severity); +long dbCaGetTimeStamp(struct link *plink,TS_STAMP *pstamp); long dbCaGetUnits(struct link *plink,char *units,int unitsSize); int dbCaIsLinkConnected(struct link *plink); int dbCaGetLinkDBFtype(struct link *plink); diff --git a/src/db/dbCa.c b/src/db/dbCa.c index 55227e509..6e1c8bced 100644 --- a/src/db/dbCa.c +++ b/src/db/dbCa.c @@ -393,6 +393,18 @@ long dbCaGetSevr(struct link *plink,short *severity) return(0); } +long dbCaGetTimeStamp(struct link *plink,TS_STAMP *pstamp) +{ + caLink *pca; + + if(!plink) return(-1); + if(plink->type != CA_LINK) return(-1); + pca = (caLink *)plink->value.pv_link.pvt; + if(!pca->chid || ca_state(pca->chid)!=cs_conn) return(-1); + memcpy(pstamp,&pca->timeStamp,sizeof(TS_STAMP)); + return(0); +} + int dbCaIsLinkConnected(struct link *plink) { caLink *pca; @@ -427,6 +439,7 @@ static void eventCallback(struct event_handler_args arg) long size; STATUS semStatus; dbCommon *precord = 0; + struct dbr_time_double *pdbr_time_double; if(!pca) { epicsPrintf("eventCallback why was arg.usr NULL\n"); @@ -456,17 +469,17 @@ static void eventCallback(struct event_handler_args arg) goto done; } size = arg.count * dbr_value_size[arg.type]; - if((arg.type==DBR_STS_STRING) && (ca_field_type(pca->chid)==DBR_ENUM)) { + if((arg.type==DBR_TIME_STRING) && (ca_field_type(pca->chid)==DBR_ENUM)) { memcpy(pca->pgetString,dbr_value_ptr(arg.dbr,arg.type),size); pca->gotInString = TRUE; } else switch (arg.type){ - case DBR_STS_STRING: - case DBR_STS_SHORT: - case DBR_STS_FLOAT: - case DBR_STS_ENUM: - case DBR_STS_CHAR: - case DBR_STS_LONG: - case DBR_STS_DOUBLE: + case DBR_TIME_STRING: + case DBR_TIME_SHORT: + case DBR_TIME_FLOAT: + case DBR_TIME_ENUM: + case DBR_TIME_CHAR: + case DBR_TIME_LONG: + case DBR_TIME_DOUBLE: memcpy(pca->pgetNative,dbr_value_ptr(arg.dbr,arg.type),size); pca->gotInNative = TRUE; break; @@ -474,7 +487,9 @@ static void eventCallback(struct event_handler_args arg) errMessage(-1,"dbCa: eventCallback Logic Error\n"); break; } - pca->sevr=(unsigned short)((struct dbr_sts_double *)arg.dbr)->severity; + pdbr_time_double = (struct dbr_time_double *)arg.dbr; + pca->sevr = (unsigned short)pdbr_time_double->severity; + memcpy(&pca->timeStamp,&pdbr_time_double->stamp,sizeof(TS_STAMP)); if(precord) { struct pv_link *ppv_link = &(plink->value.pv_link); @@ -679,7 +694,7 @@ void dbCaTask() element_size = dbr_value_size[ca_field_type(pca->chid)]; pca->pgetNative = dbCalloc(pca->nelements,element_size); status = ca_add_array_event( - ca_field_type(pca->chid)+DBR_STS_STRING, + ca_field_type(pca->chid)+DBR_TIME_STRING, ca_element_count(pca->chid), pca->chid, eventCallback,pca,0.0,0.0,0.0, 0); @@ -689,7 +704,7 @@ void dbCaTask() } if(link_action&CA_MONITOR_STRING) { pca->pgetString = dbCalloc(MAX_STRING_SIZE,sizeof(char)); - status = ca_add_array_event(DBR_STS_STRING,1, + status = ca_add_array_event(DBR_TIME_STRING,1, pca->chid, eventCallback,pca,0.0,0.0,0.0, 0); if(status!=ECA_NORMAL) diff --git a/src/db/dbCa.h b/src/db/dbCa.h index 925df1220..e82573ac1 100644 --- a/src/db/dbCa.h +++ b/src/db/dbCa.h @@ -57,6 +57,7 @@ typedef struct caLink short dbrType; short link_action; unsigned short sevr; + TS_STAMP timeStamp; char gotInNative; char gotOutNative; char gotInString; diff --git a/src/db/dbTest.c b/src/db/dbTest.c index 08fa5c8a2..261b430ed 100644 --- a/src/db/dbTest.c +++ b/src/db/dbTest.c @@ -46,7 +46,7 @@ /* Global Database Test Routines - All can be invoked via vxWorks shell*/ long dba(char*pname); /*dbAddr info */ long dbel(char*pname); /*CA event list */ -long dbl(char *precordTypename,char *filename); /*list records*/ +long dbl(char *precordTypename,char *filename,char *fields); /*list records*/ long dbnr(int verbose); /*list number of records of each type*/ long dbgrep(char *pmask); /*list records with mask*/ long dbgf(char *pname); /*get field value*/ @@ -153,13 +153,39 @@ long dbel(char*pname) return(0); } -long dbl(char *precordTypename,char *filename) +long dbl(char *precordTypename,char *filename,char *fields) { DBENTRY dbentry; DBENTRY *pdbentry=&dbentry; long status; FILE *stream = NULL; + int nfields = 0; + int ifield; + char *fieldnames = 0; + char **papfields = 0; + if(fields) { + char *pnext; + + fieldnames = calloc(strlen(fields) + 1,sizeof(char)); + strcpy(fieldnames,fields); + nfields=1; + pnext=fieldnames; + while(*pnext && (pnext = strchr(pnext,' '))) { + nfields++; + while(*pnext == ' ') pnext++; + } + papfields = dbCalloc(nfields,sizeof(char *)); + pnext = fieldnames; + for(ifield=0; ifield0) { + free((void *)papfields); + free((void *)fieldnames); + } dbFinishEntry(pdbentry); if(stream) fclose(stream); return(0);