/* testOverrunBitSet.cpp */ /** * Copyright - See the COPYRIGHT that is included with this distribution. * EPICS pvData is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. */ /* Author: Marty Kraimer Date: 2013.09.16 */ #include #include #include #include #include #include #include #include #include #include #include using namespace epics::pvData; using std::string; using std::cout; using std::endl; static StandardPVFieldPtr standardPVField = getStandardPVField(); void test() { string buffer; string properties("alarm,timeStamp,display"); PVStructurePtr pvStructure = standardPVField->scalar(pvDouble,properties); PVDoublePtr pvValue = pvStructure->getSubField("value"); uint32 valueOffset = (uint32) pvValue->getFieldOffset(); PVStructurePtr pvAlarm = pvStructure->getSubField("alarm"); PVIntPtr pvSeverity = pvAlarm->getSubField("severity"); PVStringPtr pvMessage = pvAlarm->getSubField("message"); uint32 severityOffset = (uint32) pvSeverity->getFieldOffset(); uint32 messageOffset = (uint32) pvMessage->getFieldOffset(); PVStructurePtr pvTimeStamp = pvStructure->getSubField("timeStamp"); PVLongPtr pvSeconds = pvTimeStamp->getSubField("secondsPastEpoch"); PVIntPtr pvNanoseconds = pvTimeStamp->getSubField("nanoseconds"); PVIntPtr pvUserTag = pvTimeStamp->getSubField("userTag"); uint32 timeStampOffset = (uint32) pvTimeStamp->getFieldOffset(); uint32 secondsOffset = (uint32) pvSeconds->getFieldOffset(); uint32 nanosecondsOffset = (uint32) pvNanoseconds->getFieldOffset(); uint32 userTagOffset = (uint32) pvUserTag->getFieldOffset(); uint32 nfields = (uint32) pvStructure->getNumberFields(); BitSetPtr changeBitSet = BitSet::create(nfields); BitSetPtr userChangeBitSet = BitSet::create(nfields); BitSetPtr userOverrunBitSet = BitSet::create(nfields); pvValue->put(1.0); changeBitSet->set(valueOffset); pvSeverity->put(2); changeBitSet->set(severityOffset); pvMessage->put("error"); changeBitSet->set(messageOffset); pvSeconds->put(1); changeBitSet->set(secondsOffset); pvNanoseconds->put(1000000); changeBitSet->set(nanosecondsOffset); pvUserTag->put(1); changeBitSet->set(userTagOffset); userOverrunBitSet->or_and(*changeBitSet.get(),*userChangeBitSet.get()); (*userChangeBitSet)|=(*changeBitSet.get()); changeBitSet->clear(); pvValue->put(2.0); changeBitSet->set(valueOffset); pvSeverity->put(0); changeBitSet->set(severityOffset); pvMessage->put(""); changeBitSet->set(messageOffset); pvSeconds->put(2); changeBitSet->set(secondsOffset); pvNanoseconds->put(0); changeBitSet->set(nanosecondsOffset); pvUserTag->put(0); changeBitSet->set(userTagOffset); userOverrunBitSet->or_and(*changeBitSet.get(),*userChangeBitSet.get()); (*userChangeBitSet)|=(*changeBitSet.get()); testOk1(userChangeBitSet->cardinality()==6); testOk1(userChangeBitSet->get(valueOffset)); testOk1(userChangeBitSet->get(severityOffset)); testOk1(userChangeBitSet->get(messageOffset)); testOk1(userChangeBitSet->get(secondsOffset)); testOk1(userChangeBitSet->get(nanosecondsOffset)); testOk1(userChangeBitSet->get(userTagOffset)); testOk1(userOverrunBitSet->cardinality()==6); testOk1(userOverrunBitSet->get(valueOffset)); testOk1(userOverrunBitSet->get(severityOffset)); testOk1(userOverrunBitSet->get(messageOffset)); testOk1(userOverrunBitSet->get(secondsOffset)); testOk1(userOverrunBitSet->get(nanosecondsOffset)); testOk1(userOverrunBitSet->get(userTagOffset)); BitSetUtil::compress(userChangeBitSet,pvStructure); BitSetUtil::compress(userOverrunBitSet,pvStructure); testOk1(userChangeBitSet->cardinality()==4); testOk1(userChangeBitSet->get(valueOffset)); testOk1(userChangeBitSet->get(severityOffset)); testOk1(userChangeBitSet->get(messageOffset)); testOk1(userChangeBitSet->get(timeStampOffset)); testOk1(userOverrunBitSet->cardinality()==4); testOk1(userOverrunBitSet->get(valueOffset)); testOk1(userOverrunBitSet->get(severityOffset)); testOk1(userOverrunBitSet->get(messageOffset)); testOk1(userOverrunBitSet->get(timeStampOffset)); changeBitSet->clear(); userChangeBitSet->clear(); userOverrunBitSet->clear(); pvValue->put(1.0); changeBitSet->set(valueOffset); pvSeconds->put(3); changeBitSet->set(secondsOffset); pvNanoseconds->put(0); changeBitSet->set(nanosecondsOffset); userOverrunBitSet->or_and(*changeBitSet.get(),*userChangeBitSet.get()); (*userChangeBitSet)|=(*changeBitSet.get()); testOk1(userChangeBitSet->cardinality()==3); testOk1(userChangeBitSet->get(valueOffset)); testOk1(userChangeBitSet->get(secondsOffset)); testOk1(userChangeBitSet->get(nanosecondsOffset)); testOk1(userOverrunBitSet->cardinality()==0); changeBitSet->clear(); pvValue->put(2.0); changeBitSet->set(valueOffset); userOverrunBitSet->or_and(*changeBitSet.get(),*userChangeBitSet.get()); (*userChangeBitSet)|=(*changeBitSet.get()); testOk1(userChangeBitSet->cardinality()==3); testOk1(userChangeBitSet->get(valueOffset)); testOk1(userChangeBitSet->get(secondsOffset)); testOk1(userChangeBitSet->get(nanosecondsOffset)); testOk1(userOverrunBitSet->cardinality()==1); testOk1(userOverrunBitSet->get(valueOffset)); BitSetUtil::compress(userChangeBitSet,pvStructure); BitSetUtil::compress(userOverrunBitSet,pvStructure); testOk1(userChangeBitSet->cardinality()==3); testOk1(userChangeBitSet->get(valueOffset)); testOk1(userChangeBitSet->get(secondsOffset)); testOk1(userChangeBitSet->get(nanosecondsOffset)); testOk1(userOverrunBitSet->cardinality()==1); testOk1(userOverrunBitSet->get(valueOffset)); } MAIN(testOverrunBitSet) { testPlan(41); testDiag("Tests for changeBitSet and overrunBitSet"); test(); return testDone(); }