#include #include #include #include #include #include #include #include "helper.h" #include "pvif.h" #include "utilities.h" namespace pvd = epics::pvData; extern "C" void p2pTestIoc_registerRecordDeviceDriver(struct dbBase *); namespace { void testScalar() { testDiag("======= testScalar() ======"); TestIOC IOC; testdbReadDatabase("p2pTestIoc.dbd", NULL, NULL); p2pTestIoc_registerRecordDeviceDriver(pdbbase); testdbReadDatabase("testpvif.db", NULL, NULL); longinRecord *prec_li = (longinRecord*)testdbRecordPtr("test:li"); stringinRecord *prec_si = (stringinRecord*)testdbRecordPtr("test:si"); aiRecord *prec_ai = (aiRecord*)testdbRecordPtr("test:ai"); mbbiRecord *prec_mbbi = (mbbiRecord*)testdbRecordPtr("test:mbbi"); IOC.init(); testdbGetFieldEqual("test:mbbi", DBR_STRING, "one"); testdbGetFieldEqual("test:mbbi", DBR_SHORT, 1); DBCH chan_li("test:li"); DBCH chan_si("test:si"); DBCH chan_ai("test:ai"); DBCH chan_ai_rval("test:ai.RVAL"); DBCH chan_mbbi("test:mbbi"); testEqual(dbChannelFieldType(chan_li), DBR_LONG); testEqual(dbChannelFieldType(chan_si), DBR_STRING); testEqual(dbChannelFieldType(chan_ai), DBR_DOUBLE); testEqual(dbChannelFieldType(chan_ai_rval), DBR_LONG); testEqual(dbChannelFieldType(chan_mbbi), DBR_ENUM); testEqual(dbChannelFinalFieldType(chan_li), DBR_LONG); testEqual(dbChannelFinalFieldType(chan_ai), DBR_DOUBLE); testEqual(dbChannelFinalFieldType(chan_ai_rval), DBR_LONG); testEqual(dbChannelFinalFieldType(chan_mbbi), DBR_ENUM); ScalarBuilder builder; pvd::FieldConstPtr dtype_li(builder.dtype(chan_li)); pvd::FieldConstPtr dtype_si(builder.dtype(chan_si)); pvd::FieldConstPtr dtype_ai(builder.dtype(chan_ai)); pvd::FieldConstPtr dtype_ai_rval(builder.dtype(chan_ai_rval)); pvd::FieldConstPtr dtype_mbbi(builder.dtype(chan_mbbi)); pvd::StructureConstPtr dtype_root(pvd::getFieldCreate()->createFieldBuilder() ->add("li", dtype_li) ->add("si", dtype_si) ->add("ai", dtype_ai) ->add("ai_rval", dtype_ai_rval) ->add("mbbi", dtype_mbbi) ->createStructure()); pvd::PVStructurePtr root(pvd::getPVDataCreate()->createPVStructure(dtype_root)); p2p::auto_ptr pvif_li(builder.attach(chan_li, root, FieldName("li"))); p2p::auto_ptr pvif_si(builder.attach(chan_si, root, FieldName("si"))); p2p::auto_ptr pvif_ai(builder.attach(chan_ai, root, FieldName("ai"))); p2p::auto_ptr pvif_ai_rval(builder.attach(chan_ai_rval, root, FieldName("ai_rval"))); p2p::auto_ptr pvif_mbbi(builder.attach(chan_mbbi, root, FieldName("mbbi"))); pvd::BitSet mask; dbScanLock((dbCommon*)prec_li); prec_li->time.secPastEpoch = 0x12345678; prec_li->time.nsec = 12345678; pvif_li->put(mask, DBE_VALUE|DBE_ALARM|DBE_PROPERTY, NULL); dbScanUnlock((dbCommon*)prec_li); testEqual(toString(mask), "{2, 4, 5, 8, 9, 12, 13, 16, 18, 19}"); mask.clear(); dbScanLock((dbCommon*)prec_si); prec_si->time.secPastEpoch = 0x12345678; prec_si->time.nsec = 12345678; pvif_si->put(mask, DBE_VALUE|DBE_ALARM|DBE_PROPERTY, NULL); dbScanUnlock((dbCommon*)prec_si); testEqual(toString(mask), "{22, 24, 25, 28, 29, 32, 33, 36, 38, 39}"); mask.clear(); dbScanLock((dbCommon*)prec_ai); prec_ai->time.secPastEpoch = 0x12345678; prec_ai->time.nsec = 12345678; pvif_ai->put(mask, DBE_VALUE|DBE_ALARM|DBE_PROPERTY, NULL); pvif_ai_rval->put(mask, DBE_VALUE|DBE_ALARM|DBE_PROPERTY, NULL); dbScanUnlock((dbCommon*)prec_ai); testEqual(toString(mask), "{42, 44, 45, 48, 49, 52, 53, 56, 58, 59, 62, 64, 65, 68, 69, 72, 73, 76, 78, 79}"); mask.clear(); dbScanLock((dbCommon*)prec_mbbi); prec_mbbi->time.secPastEpoch = 0x12345678; prec_mbbi->time.nsec = 0x12345678; pvif_mbbi->put(mask, DBE_VALUE|DBE_ALARM|DBE_PROPERTY, NULL); dbScanUnlock((dbCommon*)prec_mbbi); testEqual(toString(mask), "{83, 84, 86, 87, 90, 91, 92}"); mask.clear(); testFieldEqual(root, "li.value", 102042); testFieldEqual(root, "li.alarm.severity", 1); testFieldEqual(root, "li.timeStamp.secondsPastEpoch", 0x12345678+POSIX_TIME_AT_EPICS_EPOCH); testFieldEqual(root, "li.timeStamp.nanoseconds", 12345678); testFieldEqual(root, "li.display.limitHigh", 100.0); testFieldEqual(root, "li.display.limitLow", 10.0); testFieldEqual(root, "li.display.units", "arb"); testFieldEqual(root, "si.value", "hello"); testFieldEqual(root, "si.alarm.severity", 0); testFieldEqual(root, "si.timeStamp.secondsPastEpoch", 0x12345678+POSIX_TIME_AT_EPICS_EPOCH); testFieldEqual(root, "si.timeStamp.nanoseconds", 12345678); testFieldEqual(root, "ai.value", 42.2); testFieldEqual(root, "ai.alarm.severity", 2); testFieldEqual(root, "ai.timeStamp.secondsPastEpoch", 0x12345678+POSIX_TIME_AT_EPICS_EPOCH); testFieldEqual(root, "ai.timeStamp.nanoseconds", 12345678); testFieldEqual(root, "ai.display.limitHigh", 200.0); testFieldEqual(root, "ai.display.limitLow", 20.0); testFieldEqual(root, "ai.display.format", ""); testFieldEqual(root, "ai.display.units", "foo"); testFieldEqual(root, "ai_rval.value", 1234); testFieldEqual(root, "ai_rval.alarm.severity", 2); testFieldEqual(root, "ai_rval.timeStamp.secondsPastEpoch", 0x12345678+POSIX_TIME_AT_EPICS_EPOCH); testFieldEqual(root, "ai_rval.timeStamp.nanoseconds", 12345678); testFieldEqual(root, "ai_rval.timeStamp.userTag", 0); testFieldEqual(root, "ai_rval.display.limitHigh", 2147483647.0); testFieldEqual(root, "ai_rval.display.limitLow", -2147483648.0); testFieldEqual(root, "ai_rval.display.format", ""); testFieldEqual(root, "ai_rval.display.units", ""); testFieldEqual(root, "mbbi.value.index", 1); testFieldEqual(root, "mbbi.alarm.severity", 0); testFieldEqual(root, "mbbi.timeStamp.secondsPastEpoch", 0x12345678+POSIX_TIME_AT_EPICS_EPOCH); testFieldEqual(root, "mbbi.timeStamp.nanoseconds", 0x12345670); testFieldEqual(root, "mbbi.timeStamp.userTag", 0x8); { pvd::PVStringArray::const_svector choices(root->getSubFieldT("mbbi.value.choices")->view()); testOk1(choices.size()==3); testOk1(choices.size()>0 && choices[0]=="zero"); testOk1(choices.size()>1 && choices[1]=="one"); testOk1(choices.size()>2 && choices[2]=="two"); } root->getSubFieldT("li.value")->put(102043); root->getSubFieldT("si.value")->put("world"); root->getSubFieldT("ai.value")->put(44.4); root->getSubFieldT("ai_rval.value")->put(2143); root->getSubFieldT("mbbi.value.index")->put(2); dbScanLock((dbCommon*)prec_li); mask.clear(); mask.set(root->getSubFieldT("li.value")->getFieldOffset()); pvif_li->get(mask); testEqual(prec_li->val, 102043); dbScanUnlock((dbCommon*)prec_li); dbScanLock((dbCommon*)prec_si); mask.clear(); mask.set(root->getSubFieldT("si.value")->getFieldOffset()); pvif_si->get(mask); testOk(strcmp(prec_si->val, "world")==0, "\"%s\" == \"%s\"", prec_si->val, "world"); dbScanUnlock((dbCommon*)prec_si); dbScanLock((dbCommon*)prec_ai); mask.clear(); mask.set(root->getSubFieldT("ai.value")->getFieldOffset()); pvif_ai->get(mask); testEqual(prec_ai->val, 44.4); dbScanUnlock((dbCommon*)prec_ai); dbScanLock((dbCommon*)prec_ai); mask.clear(); mask.set(root->getSubFieldT("ai_rval.value")->getFieldOffset()); pvif_ai_rval->get(mask); testEqual(prec_ai->rval, 2143); dbScanUnlock((dbCommon*)prec_ai); dbScanLock((dbCommon*)prec_mbbi); mask.clear(); mask.set(root->getSubFieldT("mbbi.value.index")->getFieldOffset()); pvif_mbbi->get(mask); testEqual(prec_mbbi->val, 2); dbScanUnlock((dbCommon*)prec_mbbi); iocshCmd("stopPVAServer"); } void testPlain() { testDiag("testPlain()"); TestIOC IOC; testdbReadDatabase("p2pTestIoc.dbd", NULL, NULL); p2pTestIoc_registerRecordDeviceDriver(pdbbase); testdbReadDatabase("testpvif.db", NULL, NULL); longinRecord *prec_li = (longinRecord*)testdbRecordPtr("test:li"); stringinRecord *prec_si = (stringinRecord*)testdbRecordPtr("test:si"); aiRecord *prec_ai = (aiRecord*)testdbRecordPtr("test:ai"); mbbiRecord *prec_mbbi = (mbbiRecord*)testdbRecordPtr("test:mbbi"); IOC.init(); DBCH chan_li("test:li"); DBCH chan_si("test:si"); DBCH chan_ai("test:ai"); DBCH chan_mbbi("test:mbbi"); p2p::auto_ptr builder; { builder.reset(PVIFBuilder::create("plain")); } pvd::FieldConstPtr dtype_li(builder->dtype(chan_li)); pvd::FieldConstPtr dtype_si(builder->dtype(chan_si)); pvd::FieldConstPtr dtype_ai(builder->dtype(chan_ai)); pvd::FieldConstPtr dtype_mbbi(builder->dtype(chan_mbbi)); pvd::StructureConstPtr dtype_root(pvd::getFieldCreate()->createFieldBuilder() ->add("li", dtype_li) ->add("si", dtype_si) ->add("ai", dtype_ai) ->add("mbbi", dtype_mbbi) ->createStructure()); pvd::PVStructurePtr root(pvd::getPVDataCreate()->createPVStructure(dtype_root)); p2p::auto_ptr pvif_li(builder->attach(chan_li, root, FieldName("li"))); p2p::auto_ptr pvif_si(builder->attach(chan_si, root, FieldName("si"))); p2p::auto_ptr pvif_ai(builder->attach(chan_ai, root, FieldName("ai"))); p2p::auto_ptr pvif_mbbi(builder->attach(chan_mbbi, root, FieldName("mbbi"))); pvd::BitSet mask; mask.clear(); dbScanLock((dbCommon*)prec_li); pvif_li->put(mask, DBE_VALUE, NULL); dbScanUnlock((dbCommon*)prec_li); testEqual(mask, pvd::BitSet().set(root->getSubFieldT("li")->getFieldOffset())); testFieldEqual(root, "li", 102042); mask.clear(); dbScanLock((dbCommon*)prec_si); pvif_si->put(mask, DBE_VALUE, NULL); dbScanUnlock((dbCommon*)prec_si); testEqual(mask, pvd::BitSet().set(root->getSubFieldT("si")->getFieldOffset())); testFieldEqual(root, "si", "hello"); mask.clear(); dbScanLock((dbCommon*)prec_ai); pvif_ai->put(mask, DBE_VALUE, NULL); dbScanUnlock((dbCommon*)prec_ai); testEqual(mask, pvd::BitSet().set(root->getSubFieldT("ai")->getFieldOffset())); testFieldEqual(root, "ai", 42.2); mask.clear(); dbScanLock((dbCommon*)prec_mbbi); pvif_mbbi->put(mask, DBE_VALUE, NULL); dbScanUnlock((dbCommon*)prec_mbbi); testEqual(mask, pvd::BitSet().set(root->getSubFieldT("mbbi")->getFieldOffset())); testFieldEqual(root, "mbbi", 1); root->getSubFieldT("li")->put(102043); root->getSubFieldT("si")->put("world"); root->getSubFieldT("ai")->put(44.4); root->getSubFieldT("mbbi")->put(2); dbScanLock((dbCommon*)prec_li); mask.clear(); mask.set(root->getSubFieldT("li")->getFieldOffset()); pvif_li->get(mask); testEqual(prec_li->val, 102043); dbScanUnlock((dbCommon*)prec_li); dbScanLock((dbCommon*)prec_si); mask.clear(); mask.set(root->getSubFieldT("si")->getFieldOffset()); pvif_si->get(mask); testOk(strcmp(prec_si->val, "world")==0, "\"%s\" == \"%s\"", prec_si->val, "world"); dbScanUnlock((dbCommon*)prec_si); dbScanLock((dbCommon*)prec_ai); mask.clear(); mask.set(root->getSubFieldT("ai")->getFieldOffset()); pvif_ai->get(mask); testEqual(prec_ai->val, 44.4); dbScanUnlock((dbCommon*)prec_ai); dbScanLock((dbCommon*)prec_mbbi); mask.clear(); mask.set(root->getSubFieldT("mbbi")->getFieldOffset()); pvif_mbbi->get(mask); testEqual(prec_mbbi->val, 2); dbScanUnlock((dbCommon*)prec_mbbi); } } // namespace MAIN(testpvif) { testPlan(69); testScalar(); testPlain(); return testDone(); }