diff --git a/src/db/dbAccess.c b/src/db/dbAccess.c index a66d22d3d..2d49552dc 100644 --- a/src/db/dbAccess.c +++ b/src/db/dbAccess.c @@ -5780,7 +5780,7 @@ long (*put_convert_table[DBR_ENUM+1][DBF_DEVCHOICE+1])() = { putEnumEnum, putEnumEnum, putEnumEnum, putEnumEnum} }; -static long dbPut(paddr,dbrType,pbuffer,nRequest) +long dbPut(paddr,dbrType,pbuffer,nRequest) struct dbAddr *paddr; short dbrType; caddr_t pbuffer; diff --git a/src/db/dbTest.c b/src/db/dbTest.c index 723c2cd9d..7a9da3eed 100644 --- a/src/db/dbTest.c +++ b/src/db/dbTest.c @@ -1396,13 +1396,13 @@ static void dbprReportLink(pMsgBuff,pfield_name,plink,field_type, tab_size) } dbpr_msgOut(pMsgBuff,tab_size); break; - case CA_LINK: - sprintf(pmsg,"%4s: CA_LINK pp=%1d ms=%1d Not Yet Implemented", - pfield_name, - plink->value.ca_link.process_passive, - plink->value.ca_link.maximize_sevr); - dbpr_msgOut(pMsgBuff,tab_size); - break; +/* case CA_LINK: */ +/* sprintf(pmsg,"%4s: CA_LINK pp=%1d ms=%1d Not Yet Implemented", */ +/* pfield_name, */ +/* plink->value.ca_link.process_passive, */ +/* plink->value.ca_link.maximize_sevr); */ +/* dbpr_msgOut(pMsgBuff,tab_size); */ +/* break; */ default: sprintf(pmsg,"%4s: dbprReportLink: Illegal link.type", pfield_name); diff --git a/src/db/iocInit.c b/src/db/iocInit.c index b604648d8..08b24e012 100644 --- a/src/db/iocInit.c +++ b/src/db/iocInit.c @@ -207,6 +207,10 @@ static long initRecSup() recSup = calloc(1,nbytes); recSup->number = dbRecType->number; recSup->papRset = (void *)((long)recSup + (long)sizeof(struct recSup)); + + /* added for Channel Access Links */ + dbCaLinkInit((int) 1); + for(i=0; i< (recSup->number); i++) { if(dbRecType->papName[i] == NULL)continue; strcpy(name,"_"); @@ -227,6 +231,10 @@ static long initRecSup() if(status==0) status = rtnval; } } + + /* added for Channel Access Links */ + dbCaLinkInit((int) 2); + return(status); } @@ -377,16 +385,27 @@ static long initDatabase() *((struct dbAddr *)(plink->value.db_link.pdbAddr))=dbAddr; } else { - /*This will be replaced by channel access call*/ - strncpy(message,precord->name,PVNAME_SZ); - message[PVNAME_SZ]=0; - strcat(message,"."); - strncat(message,pfldDes->fldname,FLDNAME_SZ); - strcat(message,": link process variable ="); - strcat(message,name); - strcat(message," not found"); - status = S_db_notFound; - errMessage(status,message); + /* not a local pvar ... assuming a CA_LINK */ + /* only supporting NPP, Input MS/NMS, and */ + /* Output NMS links ... checking here. */ + + if (plink->value.db_link.process_passive + || (pfldDes->field_type == DBF_OUTLINK + && plink->value.db_link.maximize_sevr)) + { + /* link PP and/or Outlink MS ... */ + /* neither supported under CA_LINKs */ + strncpy(message,precord->name,PVNAME_SZ); + message[PVNAME_SZ]=0; + strcat(message,"."); + strncat(message,pfldDes->fldname,FLDNAME_SZ); + strcat(message,": link process variable ="); + strcat(message,name); + strcat(message," not found"); + status = S_db_notFound; + errMessage(status,message); + if(rtnval==OK) rtnval=status; + } } } } diff --git a/src/dev/devAoSoft.c b/src/dev/devAoSoft.c index 40922e30f..ba5832bdc 100644 --- a/src/dev/devAoSoft.c +++ b/src/dev/devAoSoft.c @@ -50,6 +50,11 @@ #include #include +/* added for Channel Access Links */ +void dbCaAddOutlink(); +long dbCaPutLink(); +long init_record(); + /* Create the dset for devAoSoft */ long write_ao(); struct { @@ -64,17 +69,41 @@ struct { 6, NULL, NULL, - NULL, + init_record, NULL, write_ao, NULL}; +static long init_record(pao) +struct aoRecord *pao; +{ + +char source_pvarname[((PVNAME_SZ)+(FLDNAME_SZ)+2)]; +struct dbAddr source_dbaddr; + + if (pao->out.type == PV_LINK) + { + sprintf(source_pvarname, "%s.OVAL", pao->name); + + if (dbNameToAddr(source_pvarname, &source_dbaddr)) + printf("ERROR: devAoSoft.c init_record() problem in dbNameToAddr()\n"); + else + dbCaAddOutlink(&(pao->out), (void *) pao, "OVAL"); + } /* endif */ + + return ((long) 0); + +} /* end init_record() */ + static long write_ao(pao) struct aoRecord *pao; { char message[100]; long status; +/* added for Channel Access Links */ +long options; +long nrequest; /* ao.out must be a CONSTANT or a DB_LINK or a CA_LINK*/ switch (pao->out.type) { @@ -88,6 +117,9 @@ static long write_ao(pao) } break; case (CA_LINK) : + options = (long) 0; + nrequest = (long) 1; + status = dbCaPutLink(&(pao->out), &options, &nrequest); break; default : if(recGblSetSevr(pao,SOFT_ALARM,VALID_ALARM)){ diff --git a/src/dev/devAoSoftRaw.c b/src/dev/devAoSoftRaw.c index b7b0422be..db57007bc 100644 --- a/src/dev/devAoSoftRaw.c +++ b/src/dev/devAoSoftRaw.c @@ -49,6 +49,11 @@ #include #include +/* added for Channel Access Links */ +void dbCaAddOutlink(); +long dbCaPutLink(); +long init_record(); + /* Create the dset for devAoSoftRaw */ static long write_ao(); static long special_linconv(); @@ -64,17 +69,39 @@ struct { 6, NULL, NULL, - NULL, + init_record, NULL, write_ao, special_linconv}; +static long init_record(pao) +struct aoRecord *pao; +{ + +char source_pvarname[((PVNAME_SZ)+(FLDNAME_SZ)+2)]; +struct dbAddr source_dbaddr; + + if (pao->out.type == PV_LINK) + { + sprintf(source_pvarname, "%s.RVAL", pao->name); + if (dbNameToAddr(source_pvarname, &source_dbaddr)) + printf("ERROR: devAoSoftRaw.c init_record() problem in dbNameToAddr()\n"); + else + dbCaAddOutlink(&(pao->out), (void *) pao, "RVAL"); + } /* endif */ + + return ((long) 0); + +} /* end init_record() */ static long write_ao(pao) struct aoRecord *pao; { char message[100]; long status; +/* added for Channel Access Links */ +long options; +long nrequest; /* ao.out must be a CONSTANT or a DB_LINK or a CA_LINK*/ switch (pao->out.type) { @@ -88,6 +115,9 @@ static long write_ao(pao) } break; case (CA_LINK) : + options = (long) 0; + nrequest = (long) 1; + status = dbCaPutLink(&(pao->out), &options, &nrequest); break; default : if(recGblSetSevr(pao,SOFT_ALARM,VALID_ALARM)){ diff --git a/src/rec/recCalc.c b/src/rec/recCalc.c index 84f8e1c8b..490113c19 100644 --- a/src/rec/recCalc.c +++ b/src/rec/recCalc.c @@ -124,6 +124,14 @@ long calcPerform(); long postfix(); int fetch_values(); #define ARG_MAX 12 +/* Database Channel Access Link Functions */ +void dbCaAddInlink(); +long dbCaGetLink(); + + /* Fldnames should have as many as ARG_MAX */ + static char Fldnames[ARG_MAX][FLDNAME_SZ] = + {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"}; + static long init_record(pcalc) struct calcRecord *pcalc; @@ -135,10 +143,22 @@ static long init_record(pcalc) short error_number; char rpbuf[80]; +char dest_pvarname[((PVNAME_SZ)+(FLDNAME_SZ)+2)]; +struct dbAddr dest_dbaddr; + plink = &pcalc->inpa; pvalue = &pcalc->a; for(i=0; itype==CONSTANT) *pvalue = plink->value.value; + if (plink->type == PV_LINK) + { + sprintf(dest_pvarname, "%s.%s", pcalc->name, Fldnames[i]); + + if (dbNameToAddr(dest_pvarname, &dest_dbaddr)) + printf("ERROR: recCalc.c init_record() problem in dbNameToAddr()\n"); + else + dbCaAddInlink(plink, (void *) pcalc, Fldnames[i]); + } /* endif */ } status=postfix(pcalc->calc,rpbuf,&error_number); if(status) return(status); @@ -369,16 +389,24 @@ struct calcRecord *pcalc; long status; for(i=0, plink=&pcalc->inpa, pvalue=&pcalc->a; itype!=DB_LINK) continue; - options=0; - nRequest=1; - status = dbGetLink(&plink->value.db_link,(struct dbCommon *)pcalc,DBR_DOUBLE, - pvalue,&options,&nRequest); - if(status!=0) { - recGblSetSevr(pcalc,LINK_ALARM,VALID_ALARM); - return(-1); - } - + if (plink->type == CA_LINK) + { + if (dbCaGetLink(plink)) + printf("fetch_values() problem in dbCaGetLink()\n"); + } + else + { + if(plink->type==DB_LINK) + { + options=0; + nRequest=1; + status = dbGetLink(&plink->value.db_link,(struct dbCommon *)pcalc,DBR_DOUBLE, pvalue,&options,&nRequest); + if(status!=0) { + recGblSetSevr(pcalc,LINK_ALARM,VALID_ALARM); + return(-1); + } + } /* endif */ + } /* endif */ } return(0); }