📄 gatepv.cc
字号:
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 + -