int epicsShareAPI dbGetLinkDBFtype(const struct link *plink) { switch(plink->type) { case DB_LINK: { DBADDR *paddr = (DBADDR *)plink->value.pv_link.pvt; return((int)paddr->field_type); } case CA_LINK: return(dbCaGetLinkDBFtype(plink)); default: break; } return(-1); }
static void checkLinks(acalcoutRecord *pcalc) { DBLINK *plink; rpvtStruct *prpvt = (rpvtStruct *)pcalc->rpvt; int i; int isCaLink = 0; int isCaLinkNc = 0; unsigned short *plinkValid; dbAddr Addr; dbAddr *pAddr = &Addr; if (aCalcoutRecordDebug >= 10) printf("checkLinks() for %p\n", (void *)pcalc); plink = &pcalc->inpa; plinkValid = &pcalc->inav; for (i=0; i<MAX_FIELDS+ARRAY_MAX_FIELDS+1; i++, plink++, plinkValid++) { if (plink->type == CA_LINK) { isCaLink = 1; if (dbCaIsLinkConnected(plink)) { if (*plinkValid == acalcoutINAV_EXT_NC) { *plinkValid = acalcoutINAV_EXT; db_post_events(pcalc,plinkValid,DBE_VALUE); } /* If this is the outlink, get the type of field it's connected to. If it's connected * to a link field, and the outlink is not a CA link, complain, because this won't work. * Also, if .WAIT, then the link must be a CA link. */ if (plink == &pcalc->out) { prpvt->outlink_field_type = dbCaGetLinkDBFtype(plink); if (aCalcoutRecordDebug >= 10) printf("acalcout:checkLinks: outlink type = %d\n", prpvt->outlink_field_type); if (!dbNameToAddr(plink->value.pv_link.pvname, pAddr)) { if ((pAddr->field_type >= DBF_INLINK) && (pAddr->field_type <= DBF_FWDLINK)) { if (!(plink->value.pv_link.pvlMask & pvlOptCA)) { printf("aCalcoutRecord(%s):checkLinks:non-CA link to link field\n", plink->value.pv_link.pvname); } } } if (pcalc->wait && !(plink->value.pv_link.pvlMask & pvlOptCA)) { printf("aCalcoutRecord(%s):checkLinks: Can't wait with non-CA link attribute\n", plink->value.pv_link.pvname); } } } else { if (*plinkValid == acalcoutINAV_EXT_NC) { isCaLinkNc = 1; } else if (*plinkValid == acalcoutINAV_EXT) { *plinkValid = acalcoutINAV_EXT_NC; db_post_events(pcalc,plinkValid,DBE_VALUE); isCaLinkNc = 1; } if (plink == &pcalc->out) prpvt->outlink_field_type = DBF_NOACCESS; /* don't know type */ } } } if (isCaLinkNc) prpvt->caLinkStat = CA_LINKS_NOT_OK; else if (isCaLink) prpvt->caLinkStat = CA_LINKS_ALL_OK; else prpvt->caLinkStat = NO_CA_LINKS; if (!prpvt->wd_id_1_LOCK && isCaLinkNc) { /* Schedule another CALLBACK */ prpvt->wd_id_1_LOCK = 1; callbackRequestDelayed(&prpvt->checkLinkCb,.5); } }