/* * cagft() * * ca get field test * * test ca get over the range of CA data types */ static int cagft(char *pname) { const unsigned maxTries = 1000ul; unsigned ntries = 0u; chid chan_id; int status; int i; /* * convert name to chan id */ status = ca_search(pname, &chan_id); SEVCHK(status,NULL); status = ca_pend_io(5.0); if(status != ECA_NORMAL){ SEVCHK(ca_clear_channel(chan_id),NULL); printf("Not Found %s\n", pname); return -1; } printf("name:\t%s\n", ca_name(chan_id)); printf("native type:\t%s\n", dbr_type_to_text(ca_field_type(chan_id))); printf("native count:\t%lu\n", ca_element_count(chan_id)); /* * fetch as each type */ for(i=0; i<=LAST_BUFFER_TYPE; i++){ if(ca_field_type(chan_id)==DBR_STRING) { if( (i!=DBR_STRING) && (i!=DBR_STS_STRING) && (i!=DBR_TIME_STRING) && (i!=DBR_GR_STRING) && (i!=DBR_CTRL_STRING)) { continue; } } /* ignore write only types */ if ( i == DBR_PUT_ACKT || i == DBR_PUT_ACKS ) { continue; } status = ca_array_get_callback( i, ca_element_count(chan_id), chan_id, printit, NULL); SEVCHK(status, NULL); outstanding++; } /* * wait for the operation to complete * before returning */ while ( ntries < maxTries ) { unsigned long oldOut; oldOut = outstanding; ca_pend_event ( 0.05 ); if ( ! outstanding ) { SEVCHK ( ca_clear_channel ( chan_id ), NULL ); printf ( "\n\n" ); return 0; } if ( outstanding == oldOut ) { ntries++; } } SEVCHK ( ca_clear_channel ( chan_id ), NULL ); return -1; }
static void exceptionCallback(struct exception_handler_args args) { const char *context = (args.ctx ? args.ctx : "unknown"); errlogPrintf("DB CA Link Exception: \"%s\", context \"%s\"\n", ca_message(args.stat), context); if (args.chid) { errlogPrintf( "DB CA Link Exception: channel \"%s\"\n", ca_name(args.chid)); if (ca_state(args.chid) == cs_conn) { errlogPrintf( "DB CA Link Exception: native T=%s, request T=%s," " native N=%ld, request N=%ld, " " access rights {%s%s}\n", dbr_type_to_text(ca_field_type(args.chid)), dbr_type_to_text(args.type), ca_element_count(args.chid), args.count, ca_read_access(args.chid) ? "R" : "", ca_write_access(args.chid) ? "W" : ""); } } }
/* Object command for a PV object */ static int InstanceCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj * const objv[]) { pvInfo *info = (pvInfo *) clientData; if (objc<2) { Tcl_WrongNumArgs(interp, 1, objv, "subcommand"); return TCL_ERROR; } Tcl_Obj *subcommand=objv[1]; int cmdindex; if (Tcl_GetIndexFromObj(interp, subcommand, pvcmdtable, "subcommand", 0, &cmdindex) != TCL_OK) { return TCL_ERROR; } switch (cmdindex) { case PUT: return PutCmd(interp, info, objc, objv); case GET: return GetCmd(interp, info, objc, objv); case MONITOR: return MonitorCmd(interp, info, objc, objv); case NAME: Tcl_SetObjResult(interp, Tcl_NewStringObj(info->name, -1)); return TCL_OK; case CONNECTED: Tcl_SetObjResult(interp, Tcl_NewBooleanObj(info->connected)); return TCL_OK; case NELEM: Tcl_SetObjResult(interp, Tcl_NewWideIntObj(info->nElem)); return TCL_OK; case CHID: Tcl_SetObjResult(interp, Tcl_NewWideIntObj((intptr_t)info->id)); return TCL_OK; case TYPE: Tcl_SetObjResult(interp, Tcl_NewStringObj(dbr_type_to_text(info->type), -1)); return TCL_OK; case DESTROY: { Tcl_Command self = Tcl_GetCommandFromObj(interp, objv[0]); if (self != NULL) { Tcl_DeleteCommandFromToken(interp, self); } return TCL_OK; } default: Tcl_SetObjResult(interp, Tcl_NewStringObj("Unknown error", -1)); return TCL_ERROR; } }