/* from "Writing Channel Access Clients */ /* caTest.c */ /* k.furukawa, aug.30.2000. */ /*from stdin read list of PVs to monitor*/ #include #include #include #include #include #define MAX_PV 1000 #define MAX_PV_NAME_LEN 40 typedef struct{ char value[20]; chid mychid; evid myevid; } MYNODE; static void printChidInfo(chid chid, char *message) { printf("\n%s\n",message); printf("pv: %s type(%d) nelements(%d) host(%s)", ca_name(chid),ca_field_type(chid), ca_element_count(chid), ca_host_name(chid)); printf(" read(%d) write(%d) state(%d)\n", ca_read_access(chid),ca_write_access(chid), ca_state(chid)); } static void exceptionCallback( struct exception_handler_args args) { chid chid = args.chid; MYNODE *pnode = (MYNODE *)ca_puser(chid); long type = args.type;/*type of value returned*/ long count = args.count; long stat = args.stat; printChidInfo(chid,"exceptionCallback"); printf("type(%d) count(%d) stat(%d)\n",type,count,stat); } static void connectionCallback(struct connection_handler_args args) { chid chid = args.chid; MYNODE *pnode = (MYNODE *)ca_puser(chid); printChidInfo(chid,"connectionCallback"); } static void accessRightsCallback( struct access_rights_handler_args args) { chid chid = args.chid; MYNODE *pnode = (MYNODE *)ca_puser(chid); printChidInfo(chid,"accessRightsCallback"); } static void eventCallback( struct event_handler_args eha) { chid chid = eha.chid; MYNODE *pnode = (MYNODE *)ca_puser(chid); long type = eha.type; long count = eha.count; if(eha.status!=ECA_NORMAL) { printChidInfo(chid,"eventCallback"); } else { char *pdata = (char *)eha.dbr; printf("Event Callback: %s = %s\n", ca_name(eha.chid),pdata); } } main() { int npv = 0; MYNODE *pnode; MYNODE *pmynode[MAX_PV]; char *pname[MAX_PV]; int status; int i; char tempStr[MAX_PV_NAME_LEN]; char *pstr; while(1) { if(npv >= MAX_PV ) break; pstr = fgets(tempStr,MAX_PV_NAME_LEN,stdin); if(!pstr) break; if(strlen(pstr) <=1) continue; pstr[strlen(pstr)-1] = '\0'; /*strip off newline*/ pname[npv] = calloc(1,strlen(pstr) + 1); strcpy(pname[npv],pstr); pmynode[npv] = (MYNODE *)calloc(1,sizeof(MYNODE)); npv++; } SEVCHK(ca_task_initialize(), "ca_task_initialize"); SEVCHK(ca_add_exception_event(exceptionCallback,NULL), "ca_add_exception_event"); for(i=0; imychid, connectionCallback,&pmynode[i]), "ca_search_and_connect"); SEVCHK(ca_replace_access_rights_event( pmynode[i]->mychid, accessRightsCallback), "ca_replace_access_rights_event"); SEVCHK(ca_add_event(DBR_STRING, pmynode[i]->mychid,eventCallback, pmynode[i],&pmynode[i]->myevid), "ca_add_event"); } /*Should never return from following call*/ SEVCHK(ca_pend_event(0.0),"ca_pend_event"); ca_task_exit(); }