⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gatepv.cc

📁 EPICS CA gateway, base on channel access protocol
💻 CC
📖 第 1 页 / 共 4 页
字号:
	if(!strncmp(HISTNAME,name(),HISTNUM)) {		printf("%s gatePvData::life: loop_count=%lu %s state=%s\n",		  timeStamp(),mrg->loop_count,name(),getStateName());	}#endif	switch(getState())	{	case gatePvConnect:		gateDebug1(3,"gatePvData::life() %s PV\n",getStateName());		setTimes();		// Add PV from the connect pending list to PV list		// The server's connectCleanup() routine will just delete active		// PVs from the connecting PV list		mrg->pvAdd(pv_name,*this);		if(needAddRemove())	{			if(vc) {				setState(gatePvActive);#ifdef STAT_PVS				mrg->setStat(statConnecting,--mrg->total_connecting);				mrg->setStat(statUnconnected,--mrg->total_unconnected);				mrg->setStat(statActive,++mrg->total_active);				mrg->setStat(statAlive,++mrg->total_alive);#endif				get();			}		} else {			setState(gatePvInactive);#ifdef STAT_PVS			mrg->setStat(statConnecting,--mrg->total_connecting);			mrg->setStat(statUnconnected,--mrg->total_unconnected);			mrg->setStat(statInactive,++mrg->total_inactive);			mrg->setStat(statAlive,++mrg->total_alive);#endif			markNoAbort();		}		// Flush any accumulated exist tests		if(eio.count()) flushAsyncETQueue(pverExistsHere);#if DEBUG_PV_LIST		{		    printf("%s gatePvData::life: [%lu|%lu|%lu,%lu|%lu,%lu,%lu]: name=%s "				   "state=%s\n",		      timeStamp(),			  mrg->total_vc,mrg->total_pv,mrg->total_active,mrg->total_inactive,			  mrg->total_connecting,mrg->total_dead,mrg->total_disconnected,			  name,getStateName());		}#endif		break;	case gatePvDisconnect:		gateDebug1(3,"gatePvData::life() %s PV\n",getStateName());		setReconnectTime();		setAliveTime();		setState(gatePvInactive);#ifdef STAT_PVS		mrg->setStat(statDisconnected,--mrg->total_disconnected);		mrg->setStat(statUnconnected,--mrg->total_unconnected);		mrg->setStat(statInactive,++mrg->total_inactive);		mrg->setStat(statAlive,++mrg->total_alive);#endif		// Generate a beacon anomaly.  Rely on the gateServer to prevent		// this from happening too frequently.		mrg->generateBeaconAnomaly();		break;	case gatePvDead:		gateDebug1(3,"gatePvData::life() %s PV\n",getStateName());		setAliveTime();		setState(gatePvInactive);#ifdef STAT_PVS		mrg->setStat(statDead,--mrg->total_dead);		mrg->setStat(statUnconnected,--mrg->total_unconnected);		mrg->setStat(statInactive,++mrg->total_inactive);		mrg->setStat(statAlive,++mrg->total_alive);#endif		break;	case gatePvInactive:	case gatePvActive:		gateDebug1(2,"gatePvData::life() %s PV ?\n",getStateName());		rc=-1;		break;	default:		break;	}	return rc;}// Called in the connectCB if ca_state is not cs_conn// or from the gateServer's connectCleanup if the connect timeout has elapsedint gatePvData::death(void){	int rc=0;	event_count=0;	gateDebug1(5,"gatePvData::death() name=%s\n",name());	gateDebug1(3,"gatePvData::death() %s PV\n",getStateName());#if DEBUG_DELAY	if(!strncmp("Xorbit",name(),6)) {		printf("%s gatePvData::death: loop_count=%d %s state=%d\n",		  timeStamp(),mrg->loop_count,name(),getState());	}#endif#if DEBUG_HISTORY	if(!strncmp(HISTNAME,name(),HISTNUM)) {		printf("%s gatePvData::death: loop_count=%lu %s state=%s\n",		  timeStamp(),mrg->loop_count,name(),getStateName());	}#endif	switch(getState())	{	case gatePvActive:		// Get rid of VC		if(vc) {			delete vc;			vc=NULL;		}		setState(gatePvDisconnect);#ifdef STAT_PVS		mrg->setStat(statActive,--mrg->total_active);		mrg->setStat(statAlive,--mrg->total_alive);		mrg->setStat(statDisconnected,++mrg->total_disconnected);		mrg->setStat(statUnconnected,++mrg->total_unconnected);#endif		break;	case gatePvInactive:		setState(gatePvDisconnect);#ifdef STAT_PVS		mrg->setStat(statInactive,--mrg->total_inactive);		mrg->setStat(statAlive,--mrg->total_alive);		mrg->setStat(statDisconnected,++mrg->total_disconnected);		mrg->setStat(statUnconnected,++mrg->total_unconnected);#endif		break;	case gatePvConnect:		// Flush any accumulated exist tests		if(eio.count()) flushAsyncETQueue(pverDoesNotExistHere);		if(needAddRemove() && vc) {			// Should never be the case			delete vc;			vc=NULL;		}		// Leave PV on connecting list, add to the PV list as dead		// Server's connectCleanup() will remove the PV from the		// connecting PV list		mrg->pvAdd(pv_name,*this);		setState(gatePvDead);#ifdef STAT_PVS		mrg->setStat(statConnecting,--mrg->total_connecting);		mrg->setStat(statDead,++mrg->total_dead);#endif#if DEBUG_PV_LIST		printf("%s gatePvData::death: [%lu|%lu|%lu,%lu|%lu,%lu,%lu]: name=%s state=%s\n",		  timeStamp(),		  mrg->total_vc,mrg->total_pv,mrg->total_active,mrg->total_inactive,		  mrg->total_connecting,mrg->total_dead,mrg->total_disconnected,		  name,getStateName());#endif		break;	default:		rc=-1;		break;	}	vc=NULL;	setDeathTime();	markNoAbort();	markAddRemoveNotNeeded();	markNoGetPending();	unmonitor();	alhUnmonitor();	return rc;}int gatePvData::unmonitor(void){	gateDebug1(5,"gatePvData::unmonitor() name=%s\n",name());	int rc=0;	if(monitored())	{#ifdef USE_313		rc=ca_clear_event(evID);		if(rc != ECA_NORMAL) {			fprintf(stderr,"%s gatePvData::unmonitor: ca_clear_event failed "			  "for %s:\n"			  " %s\n",			  timeStamp(),name()?name():"Unknown",ca_message(rc));		} else {			rc=0;		}#else		rc=ca_clear_subscription(evID);		if(rc != ECA_NORMAL) {			fprintf(stderr,"%s gatePvData::unmonitor: ca_clear_subscription failed "			  "for %s:\n"			  " %s\n",			  timeStamp(),name()?name():"Unknown",ca_message(rc));		} else {			rc=0;		}#endif		markNotMonitored();	}	return rc;}int gatePvData::alhUnmonitor(void){	gateDebug1(5,"gatePvData::alhUnmonitor() name=%s\n",name());	int rc=0;	if(alhMonitored())	{#ifdef USE_313		rc=ca_clear_event(alhID);		if(rc != ECA_NORMAL) {			fprintf(stderr,"%s gatePvData::alhUnmonitor: ca_clear_event failed "			  "for %s:\n"			  " %s\n",			  timeStamp(),name()?name():"Unknown",ca_message(rc));		} else {			rc=0;		}#else		rc=ca_clear_subscription(alhID);		if(rc != ECA_NORMAL) {			fprintf(stderr,"%s gatePvData::alhUnmonitor: "			  "ca_clear_subscription failed for %s:\n"			  " %s\n",			  timeStamp(),name()?name():"Unknown",ca_message(rc));		} else {			rc=0;		}#endif		markAlhNotMonitored();	}	return rc;}int gatePvData::monitor(void){	gateDebug1(5,"gatePvData::monitor() name=%s\n",name());	int rc=0;#if DEBUG_DELAY	if(!strncmp("Xorbit",name(),6)) {		printf("%s gatePvData::monitor: %s state=%d\n",timeStamp(),name(),		  getState());	}#endif	if(!monitored())	{		// gets only 1 element:		// rc=ca_add_event(eventType(),chID,eventCB,this,&event);		// gets native element count number of elements:		if(ca_read_access(chID)) {			gateDebug1(5,"gatePvData::monitor() type=%ld\n",eventType());#ifdef USE_313			rc=ca_add_masked_array_event(eventType(),0,chID,::eventCB,this,			  0.0,0.0,0.0,&evID,GR->eventMask());			if(rc != ECA_NORMAL) {				fprintf(stderr,"%s gatePvData::monitor: "				  "ca_add_masked_array_event failed for %s:\n"				  " %s\n",				  timeStamp(),name()?name():"Unknown",ca_message(rc));				rc=-1;			} else {				rc=0;				markMonitored();#if OMIT_CHECK_EVENT#else				checkEvent();#endif			}#else			rc=ca_create_subscription(eventType(),0,chID,GR->eventMask(),			  ::eventCB,this,&evID);			if(rc != ECA_NORMAL) {				fprintf(stderr,"%s gatePvData::monitor: "				  "ca_create_subscription failed for %s:\n"				  " %s\n",				  timeStamp(),name()?name():"Unknown",ca_message(rc));				rc=-1;			} else {				rc=0;				markMonitored();#if OMIT_CHECK_EVENT#else				checkEvent();#endif			}#endif		} else {			rc=-1;		}	}	return rc;}int gatePvData::alhMonitor(void){	gateDebug1(5,"gatePvData::alhMonitor() name=%s\n",name());	int rc=0;	if(!alhMonitored())	{		if(ca_read_access(chID))		{			gateDebug1(5,"gatePvData::alhMonitor() type=%d\n",DBR_STSACK_STRING);#ifdef USE_313			rc=ca_add_masked_array_event(DBR_STSACK_STRING,0,chID,::alhCB,this,				0.0,0.0,0.0,&alhID,DBE_ALARM);			if(rc != ECA_NORMAL) {				fprintf(stderr,"%s gatePvData::alhMonitor: "				  "ca_add_masked_array_event failed for %s:\n"				  " %s\n",				  timeStamp(),name()?name():"Unknown",ca_message(rc));				rc=-1;			} else {				rc=0;				markAlhMonitored();#if OMIT_CHECK_EVENT#else				checkEvent();#endif			}#else			rc=ca_create_subscription(DBR_STSACK_STRING,0,chID,DBE_ALARM,			  ::alhCB,this,&alhID);			if(rc != ECA_NORMAL) {				fprintf(stderr,"%s gatePvData::alhMonitor: "				  "ca_create_subscription failed for %s:\n"				  " %s\n",				  timeStamp(),name()?name():"Unknown",ca_message(rc));				rc=-1;			} else {				rc=0;				markAlhMonitored();#if OMIT_CHECK_EVENT#else				checkEvent();#endif			}#endif		} else {			rc=-1;		}	}	return rc;}int gatePvData::get(void){	gateDebug1(5,"gatePvData::get() name=%s\n",name());	int rc=ECA_NORMAL;		// only one active get allowed at once	switch(getState())	{	case gatePvActive:		gateDebug1(3,"gatePvData::get() %s PV\n",getStateName());		if(!pendingGet()) {			gateDebug0(3,"gatePvData::get() doing ca_array_get_callback\n");			setTransTime();			markGetPending();			// always get only one element, the monitor will get			// all the rest of the elements			rc=ca_array_get_callback(dataType(),1 /*totalElements()*/,				chID,::getCB,this);			if(rc != ECA_NORMAL) {				fprintf(stderr,"%s gatePvData::get: ca_array_get_callback "				  "failed for %s:\n"				  " %s\n",				  timeStamp(),name()?name():"Unknown",ca_message(rc));			}#if OMIT_CHECK_EVENT#else			checkEvent();#endif		}		break;	default:		gateDebug1(2,"gatePvData::get() %s PV ?\n",getStateName());		break;	}	if(rc==ECA_NORMAL) return 0;	if(rc==ECA_NORDACCESS) return 1;	return -1;}// Called by gateVcData::write() and gateVcData::flushAsyncWriteQueue.// Does a ca_array_put_callback or ca_array_put depending on// docallback.  The former is used unless the vc is not expected to// remain around (e.g. in its destructor).  The callback will// eventually update the gateVcData's event_data if all goes well and// not do so otherwise.  Returns S_casApp_success for a successful put// and as good an error code as we can generate otherwise.  There is// unfortunately no S_casApp return code defined for failure.int gatePvData::put(const gdd* dd, int docallback){	gateDebug2(5,"gatePvData::put(dd=%p) name=%s\n",(void *)dd,name());	// KE: Check for valid index here !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!	chtype cht;	gatePvCallbackId *cbid;	aitString* str;	const void *pValue;	unsigned long count;	static int full=0;	switch(dd->applicationType())	{	case gddAppType_ackt:		cht = DBR_PUT_ACKT;		break;	case gddAppType_acks:		cht = DBR_PUT_ACKS;		break;	default:		cht = gddAitToDbr[dd->primitiveType()];		break;	}#if DEBUG_GDD	printf("gatePvData::put(%s): at=%d pt=%d dbr=%ld ft=%ld[%s] name=%s\n",		   docallback?"callback":"nocallback",		   dd->applicationType(),		   dd->primitiveType(),		   cht,		   fieldType(),dbr_type_to_text(fieldType()),		   ca_name(chID));#endif		switch(getState())	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -