still early version

This commit is contained in:
Marty Kraimer
2012-12-12 08:49:06 -05:00
parent 179d45e264
commit 7a0fda88ef
10 changed files with 1767 additions and 522 deletions
+26 -4
View File
@@ -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();
}
}}
+9 -2
View File
@@ -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;
};
}}
+96 -14
View File
@@ -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();