still early version
This commit is contained in:
@@ -32,13 +32,17 @@ using std::tr1::static_pointer_cast;
|
||||
|
||||
TestRecord::~TestRecord(){}
|
||||
|
||||
PVRecordPtr TestRecord::create(String const & recordName)
|
||||
PVRecordPtr TestRecord::create(
|
||||
String const & recordName)
|
||||
{
|
||||
String properties("alarm,timeStamp,display,control,valueAlarm");
|
||||
PVStructurePtr pvStructure = getStandardPVField()->scalar(pvLong,properties);
|
||||
PVLongPtr pvValue = pvStructure->getLongField("value");
|
||||
PVRecordPtr pvRecord(new TestRecord(recordName,pvStructure,pvValue));
|
||||
TestRecordPtr pvRecord(
|
||||
new TestRecord(recordName,pvStructure,pvValue));
|
||||
pvRecord->init();
|
||||
PVFieldPtr pvField = pvStructure->getSubField("display.description");
|
||||
pvRecord->immediatePutOK = pvField;
|
||||
return pvRecord;
|
||||
}
|
||||
|
||||
@@ -50,8 +54,6 @@ TestRecord::TestRecord(
|
||||
pvValue(pvValue)
|
||||
{}
|
||||
|
||||
bool TestRecord::isSynchronous() {return true;}
|
||||
|
||||
void TestRecord::process(
|
||||
RecordProcessRequesterPtr const &processRequester,bool alreadyLocked)
|
||||
{
|
||||
@@ -63,6 +65,26 @@ void TestRecord::process(
|
||||
dequeueProcessRequest(processRequester);
|
||||
}
|
||||
|
||||
bool TestRecord::isSynchronous() {return true;}
|
||||
|
||||
void TestRecord::destroy()
|
||||
{
|
||||
PVRecord::destroy();
|
||||
pvValue.reset();
|
||||
immediatePutOK.reset();
|
||||
}
|
||||
|
||||
bool TestRecord::requestImmediatePut(PVFieldPtr const &pvField)
|
||||
{
|
||||
if(pvField!=immediatePutOK) return false;
|
||||
lock();
|
||||
return true;
|
||||
}
|
||||
|
||||
void TestRecord::immediatePutDone()
|
||||
{
|
||||
unlock();
|
||||
}
|
||||
|
||||
}}
|
||||
|
||||
|
||||
@@ -19,23 +19,30 @@
|
||||
namespace epics { namespace pvDatabase {
|
||||
|
||||
class TestRecord;
|
||||
typedef std::tr1::shared_ptr<TestRecord> TestRecordPtr;
|
||||
|
||||
class TestRecord :
|
||||
public virtual PVRecord
|
||||
{
|
||||
public:
|
||||
POINTER_DEFINITIONS(TestRecord);
|
||||
static PVRecordPtr create(epics::pvData::String const & recordName);
|
||||
static PVRecordPtr create(
|
||||
epics::pvData::String const & recordName);
|
||||
virtual ~TestRecord();
|
||||
virtual bool isSynchronous();
|
||||
virtual void process(
|
||||
epics::pvDatabase::RecordProcessRequesterPtr const &processRequester,
|
||||
bool alreadyLocked);
|
||||
virtual bool isSynchronous();
|
||||
virtual void destroy();
|
||||
virtual bool requestImmediatePut(epics::pvData::PVFieldPtr const &pvField);
|
||||
virtual void immediatePutDone();
|
||||
private:
|
||||
TestRecord(epics::pvData::String const & recordName,
|
||||
epics::pvData::PVStructurePtr const & pvStructure,
|
||||
epics::pvData::PVLongPtr const &pvValue);
|
||||
|
||||
epics::pvData::PVLongPtr pvValue;
|
||||
epics::pvData::PVFieldPtr immediatePutOK;
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
@@ -44,6 +44,9 @@ typedef std::tr1::shared_ptr<MyPVListener> MyPVListenerPtr;
|
||||
class MyProcessRequester;
|
||||
typedef std::tr1::shared_ptr<MyProcessRequester> MyProcessRequesterPtr;
|
||||
|
||||
class MyPutRequester;
|
||||
typedef std::tr1::shared_ptr<MyPutRequester> MyPutRequesterPtr;
|
||||
|
||||
class MyPVListener :
|
||||
public PVListener,
|
||||
public std::tr1::enable_shared_from_this<MyPVListener>
|
||||
@@ -61,6 +64,10 @@ public:
|
||||
return pvPVListener;
|
||||
}
|
||||
virtual ~MyPVListener() {}
|
||||
virtual void detach(PVRecordPtr const & pvRecord)
|
||||
{
|
||||
printf("%s MyPVListener::detach\n",requesterName.c_str());
|
||||
}
|
||||
virtual void dataPut(PVRecordFieldPtr const & pvRecordField)
|
||||
{
|
||||
String fieldName = pvRecordField->getFullFieldName();
|
||||
@@ -107,6 +114,7 @@ private:
|
||||
pvRecordField(pvRecordField)
|
||||
{}
|
||||
void init() {
|
||||
pvRecord->addPVRecordClient(getPtrSelf());
|
||||
pvRecord->addListener(getPtrSelf());
|
||||
pvRecordField->addListener(getPtrSelf());
|
||||
}
|
||||
@@ -120,7 +128,6 @@ private:
|
||||
class MyProcessRequester :
|
||||
public virtual Requester,
|
||||
public virtual RecordProcessRequester,
|
||||
public PVRecordClient,
|
||||
public std::tr1::enable_shared_from_this<MyProcessRequester>
|
||||
{
|
||||
public:
|
||||
@@ -160,6 +167,11 @@ public:
|
||||
message.c_str(),
|
||||
messageTypeName.c_str());
|
||||
}
|
||||
virtual void recordDestroyed()
|
||||
{
|
||||
printf("%s MyProcessRequester::recordDestroyed\n",
|
||||
requesterName.c_str());
|
||||
}
|
||||
virtual void becomeProcessor()
|
||||
{
|
||||
pvRecord->process(getPtrSelf(),false);
|
||||
@@ -198,6 +210,37 @@ private:
|
||||
PVRecordPtr pvRecord;
|
||||
};
|
||||
|
||||
class MyPutRequester :
|
||||
public virtual RecordPutRequester,
|
||||
public std::tr1::enable_shared_from_this<MyPutRequester>
|
||||
{
|
||||
public:
|
||||
MyPutRequester(PVRecordPtr const & pvRecord)
|
||||
: pvRecord(pvRecord),
|
||||
result(false)
|
||||
{}
|
||||
virtual ~MyPutRequester() {}
|
||||
virtual void requestResult(bool result)
|
||||
{
|
||||
this->result = result;
|
||||
event.signal();
|
||||
}
|
||||
bool makeRequest()
|
||||
{
|
||||
pvRecord->queuePutRequest(getPtrSelf());
|
||||
event.wait();
|
||||
return result;
|
||||
}
|
||||
private:
|
||||
MyPutRequesterPtr getPtrSelf()
|
||||
{
|
||||
return shared_from_this();
|
||||
}
|
||||
Event event;
|
||||
PVRecordPtr pvRecord;
|
||||
bool result;
|
||||
};
|
||||
|
||||
|
||||
|
||||
void dumpPVRecordField(PVRecordFieldPtr pvRecordField)
|
||||
@@ -253,17 +296,22 @@ int main(int argc,char *argv[])
|
||||
"listenTop", pvRecord, pvRecord->getPVRecordStructure());
|
||||
MyPVListenerPtr listenValue = MyPVListener::create(
|
||||
"listenValue", pvRecord,recordFieldValue);
|
||||
PVFieldPtr pvValueAlarm = pvStructure->getSubField("valueAlarm");
|
||||
PVRecordFieldPtr recordFieldValueAlarm =
|
||||
pvRecord->findPVRecordField(pvValueAlarm);
|
||||
MyPVListenerPtr listenValueAlarm = MyPVListener::create(
|
||||
"listenValueAlarm", pvRecord,recordFieldValueAlarm);
|
||||
PVIntPtr pvHighAlarmSeverity =
|
||||
pvStructure->getIntField("valueAlarm.highAlarmSeverity");
|
||||
PVRecordFieldPtr recordFieldHighAlarmSeverity =
|
||||
pvRecord->findPVRecordField(pvHighAlarmSeverity);
|
||||
MyPVListenerPtr listenHighAlarmSeverity = MyPVListener::create(
|
||||
"listenHighAlarmSeverity", pvRecord,recordFieldHighAlarmSeverity);
|
||||
|
||||
PVFieldPtr pvDisplay = pvStructure->getSubField("display");
|
||||
PVRecordFieldPtr recordFieldDisplay =
|
||||
pvRecord->findPVRecordField(pvDisplay);
|
||||
MyPVListenerPtr listenDisplay = MyPVListener::create(
|
||||
"listenDisplay", pvRecord,recordFieldDisplay);
|
||||
|
||||
PVStringPtr pvDisplayDescription =
|
||||
pvStructure->getStringField("display.description");
|
||||
PVRecordFieldPtr recordFieldDisplayDescription =
|
||||
pvRecord->findPVRecordField(pvDisplayDescription);
|
||||
MyPVListenerPtr listenDisplayDescription = MyPVListener::create(
|
||||
"listenDisplayDescription", pvRecord,recordFieldDisplayDescription);
|
||||
|
||||
recordFieldDisplayDescription->message("test message",infoMessage);
|
||||
|
||||
MyProcessRequesterPtr process1 =
|
||||
MyProcessRequester::create("process1",pvRecord);
|
||||
MyProcessRequesterPtr process2 =
|
||||
@@ -276,8 +324,42 @@ int main(int argc,char *argv[])
|
||||
builder.clear();
|
||||
pvValue->toString(&builder);
|
||||
printf("%s\n",builder.c_str());
|
||||
pvHighAlarmSeverity->put(3);
|
||||
recordFieldHighAlarmSeverity->message("test message",infoMessage);
|
||||
bool requestResult;
|
||||
requestResult = pvRecord->requestImmediatePut(pvValue);
|
||||
if(requestResult) {
|
||||
printf("error requestImmediatePut for pvValue returned true");
|
||||
pvRecord->immediatePutDone();
|
||||
}
|
||||
requestResult = pvRecord->requestImmediatePut(pvDisplayDescription);
|
||||
if(!requestResult) {
|
||||
printf("error requestImmediatePut for pvDisplayDescription returned false");
|
||||
} else {
|
||||
pvDisplayDescription->put("this is description");
|
||||
pvRecord->immediatePutDone();
|
||||
}
|
||||
|
||||
MyPutRequesterPtr myPut(new MyPutRequester(pvRecord));
|
||||
requestResult = myPut->makeRequest();
|
||||
if(!requestResult) {
|
||||
printf("error myPut->makeRequest() returned false");
|
||||
} else {
|
||||
pvDisplayDescription->put("this is new description");
|
||||
pvValue->put(1000);
|
||||
PVIntPtr pvSeverity = pvStructure->getIntField("alarm.severity");
|
||||
pvSeverity->put(3);
|
||||
PVIntPtr pvStatus = pvStructure->getIntField("alarm.status");
|
||||
pvStatus->put(2);
|
||||
PVStringPtr pvMessage = pvStructure->getStringField("alarm.message");
|
||||
pvMessage->put("alarmMessage");
|
||||
pvRecord->putDone(myPut);
|
||||
}
|
||||
|
||||
builder.clear();
|
||||
pvStructure->toString(&builder);
|
||||
printf("pvStructure\n%s\n",builder.c_str());
|
||||
builder.clear();
|
||||
|
||||
pvRecord->destroy();
|
||||
printf("all done\n");
|
||||
#ifdef XXXXXX
|
||||
PVDatabasePtr pvDatabase = PVDatabase::getMaster();
|
||||
|
||||
Reference in New Issue
Block a user