int epicsShareAPI dbIsLinkConnected(const struct link *plink) { switch(plink->type) { case DB_LINK: return(TRUE); case CA_LINK: return(dbCaIsLinkConnected(plink)); default: break; } return(FALSE); }
static void checkLinks(calcoutRecord *prec) { DBLINK *plink; rpvtStruct *prpvt = prec->rpvt; int i; int stat; int caLink = 0; int caLinkNc = 0; epicsEnum16 *plinkValid; if (calcoutRecDebug) printf("checkLinks() for %p\n", prec); plink = &prec->inpa; plinkValid = &prec->inav; for (i = 0; i<CALCPERFORM_NARGS+1; i++, plink++, plinkValid++) { if (plink->type == CA_LINK) { caLink = 1; stat = dbCaIsLinkConnected(plink); if (!stat && (*plinkValid == calcoutINAV_EXT_NC)) { caLinkNc = 1; } else if (!stat && (*plinkValid == calcoutINAV_EXT)) { *plinkValid = calcoutINAV_EXT_NC; db_post_events(prec, plinkValid, DBE_VALUE); caLinkNc = 1; } else if (stat && (*plinkValid == calcoutINAV_EXT_NC)) { *plinkValid = calcoutINAV_EXT; db_post_events(prec, plinkValid, DBE_VALUE); } } } if (caLinkNc) prpvt->caLinkStat = CA_LINKS_NOT_OK; else if (caLink) prpvt->caLinkStat = CA_LINKS_ALL_OK; else prpvt->caLinkStat = NO_CA_LINKS; if (!prpvt->cbScheduled && caLinkNc) { /* Schedule another CALLBACK */ prpvt->cbScheduled = 1; callbackRequestDelayed(&prpvt->checkLinkCb, .5); } }
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); } }