void test_invalid() { testDiag("Test test_invalid()"); FieldCreatePtr fieldCreate = getFieldCreate(); try { fieldCreate->createFieldBuilder()-> add("f1", pvByte)-> endNested(); testFail("endNested() allowed in non-nested FieldBuilder"); } catch (std::runtime_error& re) { // ok testPass("endNested() disallowed in non-nested FieldBuilder"); } try { fieldCreate->createFieldBuilder()-> add("f1", pvByte)-> addNestedStructure("nested")-> add("n1", pvUInt)-> createStructure(); testFail("createStructure() allowed in nested FieldBuilder"); } catch (std::runtime_error& re) { // ok testPass("createStructure() disallowed in nested FieldBuilder"); } }
static PVStructurePtr createPowerSupply() { FieldCreatePtr fieldCreate = getFieldCreate(); StandardFieldPtr standardField = getStandardField(); PVDataCreatePtr pvDataCreate = getPVDataCreate(); size_t nfields = 5; StringArray names; names.reserve(nfields); FieldConstPtrArray powerSupply; powerSupply.reserve(nfields); names.push_back("alarm"); powerSupply.push_back(standardField->alarm()); names.push_back("timeStamp"); powerSupply.push_back(standardField->timeStamp()); string properties("alarm,display"); names.push_back("voltage"); powerSupply.push_back(standardField->scalar(pvDouble,properties)); names.push_back("power"); powerSupply.push_back(standardField->scalar(pvDouble,properties)); names.push_back("current"); powerSupply.push_back(standardField->scalar(pvDouble,properties)); return pvDataCreate->createPVStructure( fieldCreate->createStructure(names,powerSupply)); }
PowerSupplyRecordPtr PowerSupplyRecord::create( string const & recordName) { FieldCreatePtr fieldCreate = getFieldCreate(); StandardFieldPtr standardField = getStandardField(); PVDataCreatePtr pvDataCreate = getPVDataCreate(); StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> add("alarm",standardField->alarm()) -> add("timeStamp",standardField->timeStamp()) -> addNestedStructure("power") -> add("value",pvDouble) -> endNested()-> addNestedStructure("voltage") -> add("value",pvDouble) -> endNested()-> addNestedStructure("current") -> add("value",pvDouble) -> endNested()-> createStructure(); PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); PowerSupplyRecordPtr pvRecord( new PowerSupplyRecord(recordName,pvStructure)); if(!pvRecord->init()) pvRecord.reset(); return pvRecord; }
void test_builder() { testDiag("test_builder"); NTTableBuilderPtr builder = NTTable::createBuilder(); testOk(builder.get() != 0, "Got builder"); StructureConstPtr structure = builder-> addColumn("column0", pvDouble)-> addColumn("column1", pvString)-> addColumn("column2", pvInt)-> addDescriptor()-> addAlarm()-> addTimeStamp()-> add("extra1",fieldCreate->createScalar(pvString)) -> add("extra2",fieldCreate->createScalarArray(pvString)) -> createStructure(); testOk1(structure.get() != 0); if (!structure) return; testOk1(NTTable::is_a(structure)); testOk1(structure->getID() == NTTable::URI); testOk1(structure->getNumberFields() == 7); testOk1(structure->getField("labels").get() != 0); testOk1(structure->getField("value").get() != 0); testOk1(structure->getField("descriptor").get() != 0); testOk1(structure->getField("alarm").get() != 0); testOk1(structure->getField("timeStamp").get() != 0); testOk1(structure->getField("extra1").get() != 0); testOk1(structure->getField("extra2").get() != 0); StructureConstPtr s = dynamic_pointer_cast<const Structure>(structure->getField("value")); #define TEST_COLUMN(name, type) \ testOk(s.get() != 0 && \ s->getField(name).get() != 0 && \ dynamic_pointer_cast<const ScalarArray>(s->getField(name)).get() != 0 && \ dynamic_pointer_cast<const ScalarArray>(s->getField(name))->getElementType() == type, \ name " check"); TEST_COLUMN("column0", pvDouble); TEST_COLUMN("column1", pvString); TEST_COLUMN("column2", pvInt); #undef TEST_COLUMN std::cout << *structure << std::endl; // duplicate test try { structure = builder-> addColumn("column0", pvDouble)-> addColumn("column0", pvString)-> createStructure(); testFail("duplicate column name"); } catch (std::runtime_error &) { testPass("duplicate column name"); } }
static StructureConstPtr createResultField() { FieldCreatePtr fieldCreate = getFieldCreate(); StringArray fieldNames; fieldNames.push_back("c"); FieldConstPtrArray fields; fields.push_back(fieldCreate->createScalar(pvDouble)); return fieldCreate->createStructure(fieldNames, fields); }
// TODO replace with non-locking singleton pattern FieldCreatePtr FieldCreate::getFieldCreate() { LOCAL_STATIC_LOCK; static FieldCreatePtr fieldCreate; static Mutex mutex; Lock xx(mutex); if(fieldCreate.get()==0) fieldCreate = FieldCreatePtr(new FieldCreate()); return fieldCreate; }
void test_nestedStructureArray() { testDiag("Test test_nestedStructureArray()"); FieldCreatePtr fieldCreate = getFieldCreate(); string NESTED_ID = "nestedID"; StructureConstPtr s = fieldCreate->createFieldBuilder()-> add("double", pvDouble)-> addNestedStructureArray("nested")-> setId(NESTED_ID)-> add("short", pvShort)-> add("long", pvLong)-> endNested()-> addArray("intArray", pvInt)-> createStructure(); testOk1(s.get() != 0); testOk1(Structure::DEFAULT_ID == s->getID()); testOk1(3 == s->getFields().size()); FieldConstPtr f0 = s->getField(0); testOk1(scalar == f0->getType()); testOk1("double" == s->getFieldName(0)); testOk(pvDouble == static_pointer_cast<const Scalar>(f0)->getScalarType(), "f0 scalar type == double"); FieldConstPtr f1 = s->getField(1); testOk1(structureArray == f1->getType()); testOk1("nested" == s->getFieldName(1)); { StructureConstPtr s2 = static_pointer_cast<const StructureArray>(f1)->getStructure(); testOk1(s2.get() != 0); testOk1(NESTED_ID == s2->getID()); testOk1(2 == s2->getFields().size()); FieldConstPtr f20 = s2->getField(0); testOk1(scalar == f20->getType()); testOk1("short" == s2->getFieldName(0)); testOk(pvShort == static_pointer_cast<const Scalar>(f20)->getScalarType(), "f20 scalar type == short"); FieldConstPtr f21 = s2->getField(1); testOk1(scalar == f21->getType()); testOk1("long" == s2->getFieldName(1)); testOk(pvLong == static_pointer_cast<const Scalar>(f21)->getScalarType(), "f21 element type == long"); } FieldConstPtr f2 = s->getField(2); testOk1(scalarArray == f2->getType()); testOk1("intArray" == s->getFieldName(2)); testOk(pvInt == static_pointer_cast<const ScalarArray>(f2)->getElementType(), "f2 element type == int"); }
static void createVariantUnionRecord( PVDatabasePtr const &master, string const &recordName) { StructureConstPtr top = fieldCreate->createFieldBuilder()-> add("value",fieldCreate->createVariantUnion())-> createStructure(); PVStructurePtr pvStructure = pvDataCreate->createPVStructure(top); PVRecordPtr pvRecord = PVRecord::create(recordName,pvStructure); bool result = master->addRecord(pvRecord); if(!result) cout<< "record " << recordName << " not added" << endl; }
void test_factory() { testDiag("Test test_factory()"); FieldCreatePtr fieldCreate = getFieldCreate(); FieldBuilderPtr fb = fieldCreate->createFieldBuilder(); testOk1(fb.get() != 0); FieldBuilderPtr fb2 = fieldCreate->createFieldBuilder(); testOk1(fb.get() != fb2.get()); }
// returns this service's result structure type definition. StructureConstPtr makeResponseStructure() { FieldCreatePtr factory = getFieldCreate(); FieldConstPtrArray fields; StringArray names; names.push_back("greeting"); fields.push_back(factory->createScalar(pvString)); return factory->createStructure(names, fields); }
RPCService::shared_pointer ExampleHelloRPC::create() { FieldCreatePtr fieldCreate = getFieldCreate(); PVDataCreatePtr pvDataCreate = getPVDataCreate(); StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> add("value",pvString)-> createStructure(); PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); ExampleHelloRPCPtr hello( new ExampleHelloRPC(pvStructure)); return hello; }
void test_structure() { testDiag("Test test_structure()"); FieldCreatePtr fieldCreate = getFieldCreate(); FieldBuilderPtr fb = fieldCreate->createFieldBuilder(); // test with simple (non-nested) structure string ID = "testStructureID"; StructureConstPtr s = fb->setId(ID)-> add("double", pvDouble)-> addArray("intArray", pvInt)-> createStructure(); testOk1(s.get() != 0); testOk1(ID == s->getID()); testOk1(2 == s->getFields().size()); FieldConstPtr f0 = s->getField(0); testOk1(scalar == f0->getType()); testOk1("double" == s->getFieldName(0)); testOk(pvDouble == static_pointer_cast<const Scalar>(f0)->getScalarType(), "f0 scalar type == double"); FieldConstPtr f1 = s->getField(1); testOk1(scalarArray == f1->getType()); testOk1("intArray" == s->getFieldName(1)); testOk(pvInt == static_pointer_cast<const ScalarArray>(f1)->getElementType(), "f1 element type == int"); // test reuse with empty structure StructureConstPtr emptyStructure = fb->createStructure(); testOk1(emptyStructure.get() != 0); testOk1(Structure::DEFAULT_ID == emptyStructure->getID()); testOk1(0 == emptyStructure->getFields().size()); // test add/addArray with Field StructureConstPtr s2 = fb->add("s", s)-> addArray("sArray", s)-> createStructure(); testOk1(s2.get()!=0); testOk1(Structure::DEFAULT_ID == s2->getID()); testOk1(2 == s2->getFields().size()); f0 = s2->getField(0); testOk1(structure == f0->getType()); testOk1("s" == s2->getFieldName(0)); testOk1(s.get() == f0.get()); f1 = s2->getField(1); testOk1(structureArray == f1->getType()); testOk1("sArray" == s2->getFieldName(1)); testOk(s.get() == static_pointer_cast<const StructureArray>(f1)->getStructure().get(), "array element is given structure"); }
void test_builder() { testDiag("test_builder"); NTScalarArrayBuilderPtr builder = NTScalarArray::createBuilder(); testOk(builder.get() != 0, "Got builder"); StructureConstPtr structure = builder-> value(pvDouble)-> addDescriptor()-> addAlarm()-> addTimeStamp()-> addDisplay()-> addControl()-> add("extra1",fieldCreate->createScalar(pvString)) -> add("extra2",fieldCreate->createScalarArray(pvString)) -> createStructure(); testOk1(structure.get() != 0); if (!structure) return; testOk1(NTScalarArray::is_a(structure)); testOk1(structure->getID() == NTScalarArray::URI); testOk1(structure->getNumberFields() == 8); testOk1(structure->getField("value").get() != 0); testOk1(structure->getField("descriptor").get() != 0); testOk1(structure->getField("alarm").get() != 0); testOk1(structure->getField("timeStamp").get() != 0); testOk1(structure->getField("display").get() != 0); testOk1(structure->getField("control").get() != 0); testOk(dynamic_pointer_cast<const ScalarArray>(structure->getField("value")).get() != 0 && dynamic_pointer_cast<const ScalarArray>(structure->getField("value"))->getElementType() == pvDouble, "value type"); std::cout << *structure << std::endl; // no value set try { structure = builder-> addDescriptor()-> addAlarm()-> addTimeStamp()-> addDisplay()-> addControl()-> createStructure(); testFail("no value type set"); } catch (std::runtime_error &) { testPass("no value type set"); } }
void test_arraySizeTypes() { testDiag("Test test_arraySizeTypes()"); FieldCreatePtr fieldCreate = getFieldCreate(); StructureConstPtr s = fieldCreate->createFieldBuilder()-> addArray("variableArray", pvDouble)-> addFixedArray("fixedArray", pvDouble, 10)-> addBoundedArray("boundedArray", pvDouble, 1024)-> createStructure(); testOk1(s.get() != 0); testOk1(Structure::DEFAULT_ID == s->getID()); testOk1(3 == s->getFields().size()); }
static void createDumbPowerSupplyRecord( PVDatabasePtr const &master, string const &recordName) { StructureConstPtr top = fieldCreate->createFieldBuilder()-> add("alarm",standardField->alarm()) -> add("timeStamp",standardField->timeStamp()) -> addNestedStructure("power") -> add("value",pvDouble) -> add("alarm",standardField->alarm()) -> endNested()-> addNestedStructure("voltage") -> add("value",pvDouble) -> add("alarm",standardField->alarm()) -> endNested()-> addNestedStructure("current") -> add("value",pvDouble) -> add("alarm",standardField->alarm()) -> endNested()-> createStructure(); PVStructurePtr pvStructure = pvDataCreate->createPVStructure(top); PVRecordPtr pvRecord = PVRecord::create(recordName,pvStructure); bool result = master->addRecord(pvRecord); if(!result) cout<< "record " << recordName << " not added" << endl; }
void test_builder() { testDiag("test_builder"); NTEnumBuilderPtr builder = NTEnum::createBuilder(); testOk(builder.get() != 0, "Got builder"); StructureConstPtr structure = builder-> addDescriptor()-> addAlarm()-> addTimeStamp()-> add("valueAlarm",standardField->doubleAlarm()) -> add("extra",fieldCreate->createScalarArray(pvString)) -> createStructure(); testOk1(structure.get() != 0); if (!structure) return; testOk1(NTEnum::is_a(structure)); testOk1(structure->getID() == NTEnum::URI); testOk1(structure->getNumberFields() == 6); testOk1(structure->getField("value").get() != 0); testOk1(structure->getField("descriptor").get() != 0); testOk1(structure->getField("alarm").get() != 0); testOk1(structure->getField("timeStamp").get() != 0); FieldConstPtr valueField = structure->getField("value"); testOk(valueField.get() != 0 && ntField->isEnumerated(valueField), "value is enum"); std::cout << *structure << std::endl; }
void test_builder(bool extraFields) { testDiag("test_builder"); NTNDArrayBuilderPtr builder = NTNDArray::createBuilder(); testOk(builder.get() != 0, "Got builder"); builder->addDescriptor()-> addTimeStamp()-> addAlarm()-> addDisplay(); if (extraFields) { builder->add("extra1",fieldCreate->createScalar(pvString))-> add("extra2",fieldCreate->createScalarArray(pvString)); } StructureConstPtr structure = builder->createStructure(); testOk1(structure.get() != 0); if (!structure) return; testOk1(NTNDArray::is_a(structure)); testOk1(structure->getID() == NTNDArray::URI); testOk1(structure->getField("value").get() != 0); testOk1(structure->getField("compressedSize").get() != 0); testOk1(structure->getField("uncompressedSize").get() != 0); testOk1(structure->getField("codec").get() != 0); testOk1(structure->getField("dimension").get() != 0); testOk1(structure->getField("uniqueId").get() != 0); testOk1(structure->getField("dataTimeStamp").get() != 0); testOk1(structure->getField("attribute").get() != 0); testOk1(structure->getField("descriptor").get() != 0); testOk1(structure->getField("alarm").get() != 0); testOk1(structure->getField("timeStamp").get() != 0); testOk1(structure->getField("display").get() != 0); if (extraFields) { testOk1(structure->getField("extra1").get() != 0); testOk1(structure->getField("extra2").get() != 0); } std::cout << *structure << std::endl; }
void test_all() { testDiag("test_builder"); NTNDArrayBuilderPtr builder = NTNDArray::createBuilder(); testOk(builder.get() != 0, "Got builder"); PVStructurePtr pvStructure = builder-> addDescriptor()-> addTimeStamp()-> addAlarm()-> addDisplay()-> add("extra1",fieldCreate->createScalar(pvString)) -> add("extra2",fieldCreate->createScalarArray(pvString)) -> createPVStructure(); testOk1(NTNDArray::is_a(pvStructure)==true); testOk1(NTNDArray::isCompatible(pvStructure)==true); }
RecordListRecordPtr RecordListRecord::create( std::string const & recordName) { FieldCreatePtr fieldCreate = getFieldCreate(); PVDataCreatePtr pvDataCreate = getPVDataCreate(); StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> addNestedStructure("argument")-> add("database",pvString)-> add("regularExpression",pvString)-> endNested()-> addNestedStructure("result") -> add("status",pvString) -> addArray("names",pvString) -> endNested()-> createStructure(); PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); RecordListRecordPtr pvRecord( new RecordListRecord(recordName,pvStructure)); if(!pvRecord->init()) pvRecord.reset(); return pvRecord; }
void test_builder() { testDiag("test_builder"); NTContinuumBuilderPtr builder = NTContinuum::createBuilder(); testOk(builder.get() != 0, "Got builder"); StructureConstPtr structure = builder-> addDescriptor()-> addAlarm()-> addTimeStamp()-> add("extra1",fieldCreate->createScalar(pvString)) -> add("extra2",fieldCreate->createScalarArray(pvString)) -> createStructure(); testOk1(structure.get() != 0); if (!structure) return; testOk1(NTContinuum::is_a(structure)); testOk1(structure->getID() == NTContinuum::URI); testOk1(structure->getNumberFields() == 8); testOk1(structure->getField("base").get() != 0); testOk1(structure->getField("value").get() != 0); testOk1(structure->getField("units").get() != 0); testOk1(structure->getField("descriptor").get() != 0); testOk1(structure->getField("alarm").get() != 0); testOk1(structure->getField("timeStamp").get() != 0); testOk(dynamic_pointer_cast<const ScalarArray>(structure->getField("base")).get() != 0 && dynamic_pointer_cast<const ScalarArray>(structure->getField("base"))->getElementType() == pvDouble, "base array element type"); testOk(dynamic_pointer_cast<const ScalarArray>(structure->getField("value")).get() != 0 && dynamic_pointer_cast<const ScalarArray>(structure->getField("value"))->getElementType() == pvDouble, "value array element type"); testOk(dynamic_pointer_cast<const ScalarArray>(structure->getField("units")).get() != 0 && dynamic_pointer_cast<const ScalarArray>(structure->getField("units"))->getElementType() == pvString, "units array element type"); std::cout << *structure << std::endl; }
ExampleHelloPtr ExampleHello::create( string const & recordName) { StandardFieldPtr standardField = getStandardField(); FieldCreatePtr fieldCreate = getFieldCreate(); PVDataCreatePtr pvDataCreate = getPVDataCreate(); StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> addNestedStructure("argument")-> add("value",pvString)-> endNested()-> addNestedStructure("result") -> add("value",pvString) -> add("timeStamp",standardField->timeStamp()) -> endNested()-> createStructure(); PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); ExampleHelloPtr pvRecord( new ExampleHello(recordName,pvStructure)); if(!pvRecord->init()) pvRecord.reset(); return pvRecord; }
static void createRegularUnionArrayRecord( PVDatabasePtr const &master, string const &recordName) { StructureConstPtr top = fieldCreate->createFieldBuilder()-> addNestedUnionArray("value")-> add("string",pvString)-> addArray("stringArray",pvString)-> endNested()-> createStructure(); PVStructurePtr pvStructure = pvDataCreate->createPVStructure(top); PVRecordPtr pvRecord = PVRecord::create(recordName,pvStructure); bool result = master->addRecord(pvRecord); if(!result) cout<< "record " << recordName << " not added" << endl; }
PVStructurePtr createPowerSupply() { FieldCreatePtr fieldCreate = getFieldCreate(); StandardFieldPtr standardField = getStandardField(); PVDataCreatePtr pvDataCreate = getPVDataCreate(); return pvDataCreate->createPVStructure( fieldCreate->createFieldBuilder()-> add("alarm",standardField->alarm()) -> add("timeStamp",standardField->timeStamp()) -> addNestedStructure("power") -> add("value",pvDouble) -> add("alarm",standardField->alarm()) -> endNested()-> addNestedStructure("voltage") -> add("value",pvDouble) -> add("alarm",standardField->alarm()) -> endNested()-> addNestedStructure("current") -> add("value",pvDouble) -> add("alarm",standardField->alarm()) -> endNested()-> createStructure()); }
static void testRequest() { StringArray nullNames; FieldConstPtrArray nullFields; StringArray optionNames(1); FieldConstPtrArray optionFields(1); optionNames[0] = "process"; optionFields[0] = fieldCreate->createScalar(pvString); StringArray recordNames(1); FieldConstPtrArray recordFields(1); recordNames[0] = "_options"; recordFields[0] = fieldCreate->createStructure(optionNames,optionFields); StringArray fieldNames(2); FieldConstPtrArray fieldFields(2); fieldNames[0] = "alarm"; fieldFields[0] = fieldCreate->createStructure(nullNames,nullFields); fieldNames[1] = "timeStamp"; fieldFields[1] = fieldCreate->createStructure(nullNames,nullFields); StringArray topNames(2); FieldConstPtrArray topFields(2); topNames[0] = "record"; topFields[0] = fieldCreate->createStructure(recordNames,recordFields); topNames[1] = "field"; topFields[1] = fieldCreate->createStructure(fieldNames,fieldFields); StructureConstPtr topStructure = fieldCreate->createStructure( topNames,topFields); cout << *topStructure << endl; PVStructurePtr pvTop = pvDataCreate->createPVStructure(topStructure); cout << *pvTop << endl; cout << *pvTop->getStructure() << endl; PVStructurePtr xxx = pvTop->getSubField<PVStructure>("record"); cout << *xxx << endl; xxx = pvTop->getSubField<PVStructure>("field"); cout << *xxx << endl; PVStringPtr pvString = pvTop->getSubField<PVString>("record._options.process"); pvString->put("true"); cout << *pvTop << endl; string subName("record._options.process"); PVFieldPtr pvField = pvTop->getSubField<PVString>(subName); string fieldName = pvField->getFieldName(); string fullName = pvField->getFullName(); cout << "fieldName " << fieldName << " fullName " << fullName << endl; testOk1(fieldName.compare("process")==0); testOk1(fullName.compare(subName)==0); }
void test_builder() { testDiag("test_builder"); NTNDArrayAttributeBuilderPtr builder = NTNDArrayAttribute::createBuilder(); testOk(builder.get() != 0, "Got builder"); StructureConstPtr structure = builder-> addTags()-> addAlarm()-> addTimeStamp()-> add("extra",fieldCreate->createScalar(pvString)) -> createStructure(); testOk1(structure.get() != 0); if (!structure) return; testOk1(NTNDArrayAttribute::is_a(structure)); testOk1(structure->getID() == NTNDArrayAttribute::URI); testOk1(structure->getNumberFields() == 9); testOk1(structure->getField("name").get() != 0); testOk1(structure->getField("value").get() != 0); testOk1(structure->getField("tags").get() != 0); testOk1(structure->getField("descriptor").get() != 0); testOk1(structure->getField("alarm").get() != 0); testOk1(structure->getField("timeStamp").get() != 0); testOk1(structure->getField("sourceType").get() != 0); testOk1(structure->getField("source").get() != 0); ScalarConstPtr nameField = structure->getField<Scalar>("name"); testOk(nameField.get() != 0 && nameField->getScalarType() == pvString, "name is string"); UnionConstPtr valueField = structure->getField<Union>("value"); testOk(valueField.get() != 0, "value is enum"); ScalarArrayConstPtr tagsField = structure->getField<ScalarArray>("tags"); testOk(tagsField.get() != 0 && tagsField->getElementType() == pvString, "tags is string[]"); std::cout << *structure << std::endl; }
static void testPostPut() { testDiag("== testPostPut =="); StructureConstPtr structure = fieldCreate->createFieldBuilder()-> add("alarm",standardField->alarm()) -> add("timeStamp",standardField->timeStamp()) -> addNestedStructure("power") -> add("value",pvDouble) -> add("alarm",standardField->alarm()) -> endNested()-> addNestedStructure("voltage") -> add("value",pvDouble) -> add("alarm",standardField->alarm()) -> endNested()-> addNestedStructure("current") -> add("value",pvDouble) -> add("alarm",standardField->alarm()) -> endNested()-> createStructure(); PvaClientPutDataPtr pvaData = PvaClientPutData::create(structure); PVStructurePtr pvStructure = pvaData->getPVStructure(); BitSetPtr change = pvaData->getChangedBitSet(); PVDoublePtr powerValue = pvStructure->getSubField<PVDouble>("power.value"); PVDoublePtr voltageValue = pvStructure->getSubField<PVDouble>("voltage.value"); PVDoublePtr currentValue = pvStructure->getSubField<PVDouble>("current.value"); size_t powerOffset = powerValue->getFieldOffset(); size_t voltageOffset = voltageValue->getFieldOffset(); size_t currentOffset = currentValue->getFieldOffset(); change->clear(); powerValue->put(1.0); voltageValue->put(2.0); currentValue->put(.5); testOk(change->cardinality()==3,"3 fields changed"); testOk(change->get(powerOffset),"power changed"); testOk(change->get(voltageOffset),"voltage changed"); testOk(change->get(currentOffset),"current changed"); }
void test() { RPCClientPtr channelRPC = RPCClientPtr(RPCClient::create(channelName)); bool result = channelRPC->connect(1.0); if(!result) { cout<< "connect failed\n"; return; } NTNameValueBuilderPtr builder = NTNameValue::createBuilder(); NTNameValuePtr ntnamevalue = builder -> value(pvString) -> add("function",fieldCreate->createScalar(pvString)) -> create(); PVStructurePtr pv = ntnamevalue->getPVStructure(); PVStringPtr pvFunction = pv->getSubField<PVString>("function"); PVStringArrayPtr pvNames = pv->getSubField<PVStringArray>("name"); PVStringArrayPtr pvValues = pv->getSubField<PVStringArray>("value"); size_t n = 2; shared_vector<string> name(n); shared_vector<string> value(n); name[0] = string("configname"); name[1] = string("servicename"); value[0] = string("test"); value[1] = string("masar"); pvNames->replace(freeze(name)); pvValues->replace(freeze(value)); pvFunction->put("retrieveSnapshot"); try { cout << *ntnamevalue->getPVStructure() << endl; PVStructurePtr pvResponse = channelRPC->request(ntnamevalue->getPVStructure()); cout << *pvResponse << endl; } catch (std::exception &e) { cout << e.what() << endl; return; } channelRPC->destroy(); }
namespace epics { namespace pvaClient { static FieldCreatePtr fieldCreate = getFieldCreate(); static const string pvaClientName = "pvaClient"; static const string defaultProvider = "pva"; static UnionConstPtr variantUnion = fieldCreate->createVariantUnion(); namespace pvaClientPvt { static size_t numberPvaClient = 0; static bool firstTime = true; static Mutex mutex; class StartStopClientFactory { public: static void PvaClientBeingConstructed() { bool saveFirst = false; { Lock xx(mutex); ++numberPvaClient; saveFirst = firstTime; firstTime = false; } if(saveFirst) { ClientFactory::start(); CAClientFactory::start(); } } static void PvaClientBeingDestroyed() { size_t numLeft = 0; { Lock xx(mutex); --numberPvaClient; numLeft = numberPvaClient; } if(numLeft<=0) { ClientFactory::stop(); CAClientFactory::stop(); } } }; } // namespace pvaClientPvt class PvaClientChannelCache { public: PvaClientChannelCache(){} ~PvaClientChannelCache(){ destroy(); } void destroy() { pvaClientChannelMap.clear(); } PvaClientChannelPtr getChannel( string const & channelName, string const & providerName); void addChannel(PvaClientChannelPtr const & pvaClientChannel); void removeChannel(string const & channelName,string const & providerName); void showCache(); size_t cacheSize(); private: map<string,PvaClientChannelPtr> pvaClientChannelMap; }; PvaClientChannelPtr PvaClientChannelCache::getChannel( string const & channelName, string const & providerName) { string name = channelName + providerName; map<string,PvaClientChannelPtr>::iterator iter = pvaClientChannelMap.find(name); if(iter!=pvaClientChannelMap.end()) return iter->second; return PvaClientChannelPtr(); } void PvaClientChannelCache::addChannel(PvaClientChannelPtr const & pvaClientChannel) { Channel::shared_pointer channel = pvaClientChannel->getChannel(); string name = channel->getChannelName() + channel->getProvider()->getProviderName(); pvaClientChannelMap.insert(std::pair<string,PvaClientChannelPtr>( name,pvaClientChannel)); } void PvaClientChannelCache::removeChannel( string const & channelName, string const & providerName) { string name = channelName + providerName; map<string,PvaClientChannelPtr>::iterator iter = pvaClientChannelMap.find(name); if(iter!=pvaClientChannelMap.end()) pvaClientChannelMap.erase(iter); } void PvaClientChannelCache::showCache() { map<string,PvaClientChannelPtr>::iterator iter; for(iter = pvaClientChannelMap.begin(); iter != pvaClientChannelMap.end(); ++iter) { PvaClientChannelPtr pvaChannel = iter->second; Channel::shared_pointer channel = pvaChannel->getChannel(); string channelName = channel->getChannelName(); string providerName = channel->getProvider()->getProviderName(); cout << "channel " << channelName << " provider " << providerName << endl; cout << " get and put cacheSize " << pvaChannel->cacheSize() << endl; pvaChannel->showCache(); } } size_t PvaClientChannelCache::cacheSize() { return pvaClientChannelMap.size(); } using namespace epics::pvaClient::pvaClientPvt; PvaClientPtr PvaClient::create() { PvaClientPtr xx(new PvaClient()); StartStopClientFactory::PvaClientBeingConstructed(); return xx; } PvaClient::PvaClient() : pvaClientChannelCache(new PvaClientChannelCache()), isDestroyed(false) { } PvaClient::~PvaClient() { destroy(); } void PvaClient::destroy() { { Lock xx(mutex); if(isDestroyed) return; isDestroyed = true; } pvaClientChannelCache.reset(); StartStopClientFactory::PvaClientBeingDestroyed(); } string PvaClient:: getRequesterName() { static string name("pvaClient"); RequesterPtr req = requester.lock(); if(req) { return req->getRequesterName(); } return name; } void PvaClient::message( string const & message, MessageType messageType) { RequesterPtr req = requester.lock(); if(req) { req->message(message,messageType); return; } cout << getMessageTypeName(messageType) << " " << message << endl; } PvaClientChannelPtr PvaClient::channel( std::string const & channelName, std::string const & providerName, double timeOut) { PvaClientChannelPtr pvaClientChannel = pvaClientChannelCache->getChannel(channelName,providerName); if(pvaClientChannel) return pvaClientChannel; pvaClientChannel = createChannel(channelName,providerName); pvaClientChannel->connect(timeOut); pvaClientChannelCache->addChannel(pvaClientChannel); return pvaClientChannel; } PvaClientChannelPtr PvaClient::createChannel(string const & channelName, string const & providerName) { return PvaClientChannel::create(getPtrSelf(),channelName,providerName); } void PvaClient::setRequester(RequesterPtr const & requester) { this->requester = requester; } void PvaClient::clearRequester() { requester = Requester::weak_pointer(); } void PvaClient::showCache() { pvaClientChannelCache->showCache(); } size_t PvaClient::cacheSize() { return pvaClientChannelCache->cacheSize(); } }}
static void test() { NTMultiChannelBuilderPtr builder = NTMultiChannel::createBuilder(); testOk(builder.get() != 0, "Got builder"); NTMultiChannelPtr multiChannel = builder-> addDescriptor()-> addAlarm()-> addTimeStamp()-> addSeverity() -> add("extra1",fieldCreate->createScalar(pvString)) -> add("extra2",fieldCreate->createScalarArray(pvString)) -> create(); testOk1(multiChannel.get() != 0); PVStructurePtr pvStructure = multiChannel->getPVStructure(); testOk1(pvStructure.get()!=NULL); testOk1(NTMultiChannel::is_a(pvStructure->getStructure())); size_t nchan = 3; shared_vector<string> names(nchan); names[0] = "channel 0"; names[1] = "channel 1"; names[2] = "channel 2"; shared_vector<const string> channelNames(freeze(names)); PVStringArrayPtr pvChannelName = multiChannel->getChannelName(); pvChannelName->replace(channelNames); if(debug) {cout << *pvStructure << endl;} UnionConstPtr unionPtr = fieldCreate->createFieldBuilder()-> add("doubleValue", pvDouble)-> add("intValue", pvInt)-> createUnion(); multiChannel = builder-> value(unionPtr) -> addDescriptor()-> addAlarm()-> addTimeStamp()-> addSeverity() -> addIsConnected() -> create(); testOk1(multiChannel.get() != 0); pvStructure = multiChannel->getPVStructure(); if(debug) {cout << *pvStructure << endl;} pvChannelName = multiChannel->getChannelName(); pvChannelName->replace(channelNames); PVUnionArrayPtr pvValue = multiChannel->getValue(); shared_vector<PVUnionPtr> unions(nchan); unions[0] = pvDataCreate->createPVUnion(unionPtr); unions[1] = pvDataCreate->createPVUnion(unionPtr); unions[2] = pvDataCreate->createPVUnion(unionPtr); unions[0]->select("doubleValue"); unions[1]->select("intValue"); unions[2]->select("intValue"); PVDoublePtr pvDouble = unions[0]->get<PVDouble>(); pvDouble->put(1.235); PVIntPtr pvInt = unions[1]->get<PVInt>(); pvInt->put(5); pvInt = unions[2]->get<PVInt>(); pvInt->put(7); pvValue->replace(freeze(unions)); shared_vector<int32> severities(nchan); severities[0] = 0; severities[1] = 1; severities[2] = 2; PVIntArrayPtr pvSeverity = multiChannel->getSeverity(); pvSeverity->replace(freeze(severities)); if(debug) {cout << *pvStructure << endl;} PVBooleanArrayPtr pvIsConnected = multiChannel->getIsConnected(); shared_vector<const epics::pvData::boolean> isConnected = pvIsConnected->view(); multiChannel = builder-> value(unionPtr) -> addDescriptor()-> addAlarm()-> addTimeStamp()-> addSeverity() -> addStatus() -> addMessage() -> addSecondsPastEpoch() -> addNanoseconds() -> addUserTag() -> addIsConnected() -> create(); testOk1(multiChannel.get() != 0); pvStructure = multiChannel->getPVStructure(); if(debug) {cout << *pvStructure << endl;} testOk1(NTMultiChannel::isCompatible(pvStructure)==true); PVStructurePtr pvTimeStamp = multiChannel->getTimeStamp(); testOk1(pvTimeStamp.get() !=0); PVStructurePtr pvAlarm = multiChannel->getAlarm(); testOk1(pvAlarm.get() !=0); pvValue = multiChannel->getValue(); testOk1(pvValue.get() !=0); pvChannelName = multiChannel->getChannelName(); testOk1(pvChannelName.get() !=0); pvIsConnected = multiChannel->getIsConnected(); testOk1(pvIsConnected.get() !=0); pvSeverity = multiChannel->getSeverity(); testOk1(pvSeverity.get() !=0); PVIntArrayPtr pvStatus = multiChannel->getStatus(); testOk1(pvStatus.get() !=0); PVStringArrayPtr pvMessage = multiChannel->getMessage(); testOk1(pvMessage.get() !=0); PVLongArrayPtr pvSecondsPastEpoch = multiChannel->getSecondsPastEpoch(); testOk1(pvSecondsPastEpoch.get() !=0); PVIntArrayPtr pvNanoseconds = multiChannel->getNanoseconds(); testOk1(pvNanoseconds.get() !=0); PVIntArrayPtr pvUserTag = multiChannel->getUserTag(); testOk1(pvUserTag.get() !=0); PVStringPtr pvDescriptor = multiChannel->getDescriptor(); testOk1(pvDescriptor.get() !=0); }
void test_ntcontinuum() { testDiag("test_ntcontinuum"); NTContinuumBuilderPtr builder = NTContinuum::createBuilder(); testOk(builder.get() != 0, "Got builder"); NTContinuumPtr ntContinuum = builder-> addDescriptor()-> addAlarm()-> addTimeStamp()-> add("extra1",fieldCreate->createScalar(pvString)) -> add("extra2",fieldCreate->createScalarArray(pvString)) -> create(); testOk1(ntContinuum.get() != 0); testOk1(ntContinuum->getPVStructure().get() != 0); testOk1(ntContinuum->getDescriptor().get() != 0); testOk1(ntContinuum->getAlarm().get() != 0); testOk1(ntContinuum->getTimeStamp().get() != 0); testOk1(ntContinuum->getBase().get() != 0); testOk1(ntContinuum->getValue().get() != 0); // // example how to set base // PVDoubleArray::svector newBase; newBase.push_back(1.0); newBase.push_back(2.0); PVDoubleArrayPtr pvBaseField = ntContinuum->getBase(); pvBaseField->replace(freeze(newBase)); // // example how to get bases // PVDoubleArray::const_svector base(pvBaseField->view()); testOk1(base.size() == 2); testOk1(base[0] == 1.0); testOk1(base[1] == 2.0); // // example how to set values // PVDoubleArray::svector newValue; newValue.push_back(1.0); newValue.push_back(2.0); newValue.push_back(10.0); newValue.push_back(20.0); newValue.push_back(100.0); newValue.push_back(200.0); PVDoubleArrayPtr pvValueField = ntContinuum->getValue(); pvValueField->replace(freeze(newValue)); // // example how to get values // PVDoubleArray::const_svector value(pvValueField->view()); testOk1(value.size() == 6); testOk1(value[0] == 1.0); testOk1(value[1] == 2.0); testOk1(value[2] == 10.0); testOk1(value[3] == 20.0); testOk1(value[4] == 100.0); testOk1(value[5] == 200.0); // // example how to set units // PVStringArray::svector newUnits; newUnits.push_back("s"); newUnits.push_back("ms"); newUnits.push_back("us"); newUnits.push_back("s"); PVStringArrayPtr pvUnitsField = ntContinuum->getUnits(); pvUnitsField->replace(freeze(newUnits)); // // example how to get units // PVStringArray::const_svector units(pvUnitsField->view()); testOk1(units.size() == 4); testOk1(units[0] == "s"); testOk1(units[1] == "ms"); testOk1(units[2] == "us"); testOk1(units[3] == "s"); // // test isValid // testOk1(ntContinuum->isValid()); // // timeStamp ops // PVTimeStamp pvTimeStamp; if (ntContinuum->attachTimeStamp(pvTimeStamp)) { testPass("timeStamp attach"); // example how to set current time TimeStamp ts; ts.getCurrent(); pvTimeStamp.set(ts); // example how to get EPICS time TimeStamp ts2; pvTimeStamp.get(ts2); testOk1(ts2.getEpicsSecondsPastEpoch() != 0); } else testFail("timeStamp attach fail"); // // alarm ops // PVAlarm pvAlarm; if (ntContinuum->attachAlarm(pvAlarm)) { testPass("alarm attach"); // example how to set an alarm Alarm alarm; alarm.setStatus(deviceStatus); alarm.setSeverity(minorAlarm); alarm.setMessage("simulation alarm"); pvAlarm.set(alarm); } else testFail("alarm attach fail"); // // set descriptor // ntContinuum->getDescriptor()->put("This is a test NTContinuum"); // dump NTContinuum std::cout << *ntContinuum->getPVStructure() << std::endl; }