diff --git a/testApp/remote/testNTImage.cpp b/testApp/remote/testNTImage.cpp index c491012..ce64ae8 100644 --- a/testApp/remote/testNTImage.cpp +++ b/testApp/remote/testNTImage.cpp @@ -1,81 +1,63 @@ #include "epicsv4Grayscale.h" -epics::pvData::StructureConstPtr makeVariantArrayStruc() +epics::pvData::StructureConstPtr createNTNDArrayStructure() { - FieldConstPtrArray vaFields; - StringArray vaNames; + static epics::pvData::StructureConstPtr ntndArrayStructure; - vaFields.push_back(getFieldCreate()->createScalar(epics::pvData::pvInt)); - vaNames.push_back("dataType"); - - vaFields.push_back(getFieldCreate()->createScalarArray(epics::pvData::pvInt)); - vaNames.push_back("value"); - - epics::pvData::StructureConstPtr varrayStruc = getFieldCreate()->createStructure("uri:ev4:nt/2012/pwd:NTVariantArray", vaNames, vaFields); - - return varrayStruc; -} - -epics::pvData::StructureConstPtr makeImageStruc() -{ - static epics::pvData::StructureConstPtr imageStruc; - - if (!imageStruc.get()) + if (!ntndArrayStructure.get()) { - FieldConstPtrArray fields; - StringArray names; + StandardFieldPtr standardField = getStandardField(); + FieldBuilderPtr fb = getFieldCreate()->createFieldBuilder(); - // Array part - fields.push_back(getFieldCreate()->createScalarArray(epics::pvData::pvByte)); - names.push_back("value"); + for (int i = pvBoolean; i < pvString; ++i) + { + ScalarType st = static_cast(i); + fb->addArray(std::string(ScalarTypeFunc::name(st)) + "Value", st); + } + UnionConstPtr valueType = fb->createUnion(); - fields.push_back(getFieldCreate()->createScalarArray(epics::pvData::pvInt)); - names.push_back("dim"); + StructureConstPtr codecStruc = fb->setId("codec_t")-> + add("name", pvString)-> + add("parameters", getFieldCreate()->createVariantUnion())-> + createStructure(); - // Image part - fields.push_back(getFieldCreate()->createScalar(epics::pvData::pvInt)); - names.push_back("colorMode"); + StructureConstPtr dimensionStruc = fb->setId("dimension_t")-> + add("size", pvInt)-> + add("offset", pvInt)-> + add("fullSize", pvInt)-> + add("binning", pvInt)-> + add("reverse", pvBoolean)-> + createStructure(); - fields.push_back(getFieldCreate()->createScalar(epics::pvData::pvInt)); - names.push_back("bayerPattern"); - - fields.push_back(getFieldCreate()->createScalar(epics::pvData::pvString)); - names.push_back("fourcc"); - - fields.push_back(getFieldCreate()->createScalarArray(epics::pvData::pvInt)); - names.push_back("offset"); - - fields.push_back(getFieldCreate()->createScalarArray(epics::pvData::pvInt)); - names.push_back("binning"); - - fields.push_back(getFieldCreate()->createScalarArray(epics::pvData::pvInt)); - names.push_back("reverse"); - - fields.push_back(getFieldCreate()->createScalarArray(epics::pvData::pvInt)); - names.push_back("fullDim"); + StructureConstPtr attributeStruc = fb->setId("uri:ev4:nt/2012/pwd:NTAttribute")-> + add("name", pvString)-> + add("value", getFieldCreate()->createVariantUnion())-> + add("description", pvString)-> + add("sourceType", pvInt)-> + add("source", pvString)-> + createStructure(); - // Metadata part - fields.push_back(getFieldCreate()->createScalar(epics::pvData::pvInt)); - names.push_back("uniqueId"); - - fields.push_back(getFieldCreate()->createScalarArray(epics::pvData::pvInt)); - names.push_back("attributeSourceTypes"); - - fields.push_back(getFieldCreate()->createScalarArray(epics::pvData::pvString)); - names.push_back("attributeSources"); - - fields.push_back(getFieldCreate()->createStructureArray(makeVariantArrayStruc())); - names.push_back("attributes"); - - imageStruc = getFieldCreate()->createStructure("uri:ev4:nt/2012/pwd:NTImage", names, fields); + ntndArrayStructure = fb->setId("uri:ev4:nt/2012/pwd:NTNDArray")-> + add("value", valueType)-> + add("compressedSize", pvLong)-> + add("uncompressedSize", pvLong)-> + add("codec", codecStruc)-> + addArray("dimension", dimensionStruc)-> + add("uniqueId", pvInt)-> + add("dataTimeStamp", standardField->timeStamp())-> + addArray("attribute", attributeStruc)-> + //add("descriptor", pvString)-> + //add("timeStamp", standardField->timeStamp())-> + //add("alarm", standardField->alarm())-> + //add("display", standardField->display())-> + createStructure(); } - - return imageStruc; + return ntndArrayStructure; } -void setImageArrayValues( +void setNTNDArrayValue( PVStructure::shared_pointer const & imagePV, const size_t raw_dim_size, const int32_t* raw_dim, @@ -83,8 +65,9 @@ void setImageArrayValues( const int8_t* raw ) { - string id = imagePV->getStructure()->getID(); - PVByteArrayPtr pvField = static_pointer_cast(imagePV->getSubField("value")); + PVUnionPtr unionValue = imagePV->getSubField("value"); + // assumes byteArray + PVByteArrayPtr pvField = unionValue->select("byteValue"); const int8_t *data = raw; size_t dataSize = raw_size; @@ -95,106 +78,86 @@ void setImageArrayValues( std::copy(data, data + dataSize, temp.begin()); pvField->replace(freeze(temp)); - PVIntArrayPtr dimField = static_pointer_cast( - imagePV->getScalarArrayField(std::string("dim"), pvInt)); + PVStructureArrayPtr dimField = imagePV->getSubField("dimension"); - const int32_t *dim = raw_dim; - PVIntArray::svector temp2(dimField->reuse()); - temp2.resize(raw_dim_size); - std::copy(dim, dim + raw_dim_size, temp2.begin()); - dimField->replace(freeze(temp2)); + PVStructureArray::svector dimVector(dimField->reuse()); + dimVector.resize(raw_dim_size); + for (size_t i = 0; i < raw_dim_size; i++) + { + PVStructurePtr d = dimVector[i]; + if (!d) + d = dimVector[i] = getPVDataCreate()->createPVStructure(dimField->getStructureArray()->getStructure()); + d->getSubField("size")->put(raw_dim[i]); + d->getSubField("offset")->put(0); + d->getSubField("fullSize")->put(raw_dim[i]); + d->getSubField("binning")->put(1); + d->getSubField("reverse")->put(false); + } + dimField->replace(freeze(dimVector)); + + imagePV->getSubField("uncompressedSize")->put(static_cast(raw_size)); + + PVTimeStamp timeStamp; + timeStamp.attach(imagePV->getSubField("dataTimeStamp")); + TimeStamp current; + current.getCurrent(); + timeStamp.set(current); } -void setImageImageValues( + +void setNTNDArrayData( PVStructure::shared_pointer const & imagePV, - const int32_t colorMode, - const size_t raw_dim_size, - const int32_t* raw_dim + const string & codec ) { - PVIntPtr colorModeField = imagePV->getIntField(std::string("colorMode")); - colorModeField->put(colorMode); + imagePV->getSubField("codec.name")->put(codec); - PVIntArrayPtr offsetField = static_pointer_cast( - imagePV->getScalarArrayField(std::string("offset"), pvInt)); - PVIntArray::svector temp(offsetField->reuse()); - temp.resize(2); - int32_t offsets[] = { 0, 0 }; - std::copy(offsets, offsets + 2, temp.begin()); - offsetField->replace(freeze(temp)); - - PVIntArrayPtr binningField = static_pointer_cast( - imagePV->getScalarArrayField(std::string("binning"), pvInt)); - temp = binningField->reuse(); - temp.resize(2); - int32_t binnings[] = { 1, 1 }; - std::copy(binnings, binnings + 2, temp.begin()); - binningField->replace(freeze(temp)); - - PVIntArrayPtr reverseField = static_pointer_cast( - imagePV->getScalarArrayField(std::string("reverse"), pvInt)); - reverseField->setCapacity(2); - temp = reverseField->reuse(); - temp.resize(2); - int32_t reverses[] = { 0, 0 }; - std::copy(reverses, reverses + 2, temp.begin()); - reverseField->replace(freeze(temp)); - - PVIntArrayPtr fullDimField = static_pointer_cast( - imagePV->getScalarArrayField(std::string("fullDim"), pvInt)); - temp = fullDimField->reuse(); - temp.resize(raw_dim_size); - const int32_t *fullDim = raw_dim; - std::copy(fullDim, fullDim + raw_dim_size, temp.begin()); - fullDimField->replace(freeze(temp)); -} - - -void setImageUniqueId(PVStructure::shared_pointer const & imagePV) -{ - PVIntPtr uniqueIdField = imagePV->getIntField(std::string("uniqueId")); - uniqueIdField->put(0); -} - -void setImageMetadataValues(PVStructure::shared_pointer const & imagePV) -{ - setImageUniqueId(imagePV); + imagePV->getSubField("uniqueId")->put(0); } +/* +//d) Attributes + structure[] attribute + structure NTAttribute + string name + any value + string description + int sourceType + string source +*/ void initImage( PVStructure::shared_pointer const & imagePV, - const int32_t colorMode, + const string & codec, const size_t raw_dim_size, const int32_t* raw_dim, const size_t raw_size, const int8_t* raw ) { - setImageArrayValues(imagePV, raw_dim_size, raw_dim, raw_size, raw); - setImageImageValues(imagePV, colorMode, raw_dim_size, raw_dim); - setImageMetadataValues(imagePV); + setNTNDArrayValue(imagePV, raw_dim_size, raw_dim, raw_size, raw); + setNTNDArrayData(imagePV, codec); } void initImageEPICSv4GrayscaleLogo(PVStructure::shared_pointer const & imagePV) { - setImageArrayValues(imagePV, 2, epicsv4_raw_dim, epicsv4_raw_size, epicsv4_raw); - setImageImageValues(imagePV, 0 /* monochrome */, 2 /* 2d image */, epicsv4_raw_dim); - setImageMetadataValues(imagePV); + setNTNDArrayValue(imagePV, 2, epicsv4_raw_dim, epicsv4_raw_size, epicsv4_raw); + setNTNDArrayData(imagePV, "grayscale"); } void rotateImage(PVStructure::shared_pointer const & imagePV, const int8_t* originalImage, float deg) { - PVScalarArrayPtr value = static_pointer_cast(imagePV->getSubField("value")); - PVIntArrayPtr dim = static_pointer_cast(imagePV->getScalarArrayField("dim", pvInt)); + PVUnionPtr unionValue = imagePV->getSubField("value"); + PVStructureArrayPtr dim = imagePV->getSubField("dimension"); - PVIntArray::const_svector data = dim->view(); - // dim[] = { rows, columns } - int32 cols = data[0]; - int32 rows = data[1]; + PVStructureArray::const_svector data = dim->view(); + // { x, y } + int32 cols = data[0]->getSubField("size")->get(); + int32 rows = data[1]->getSubField("size")->get(); - PVByteArrayPtr array = static_pointer_cast(value); + // assumes byteArray + PVByteArrayPtr array = unionValue->get(); double fi = 3.141592653589793238462 * deg / 180.0; double cosFi = 16.0 * cos(fi); @@ -246,7 +209,7 @@ void rotateImage(PVStructure::shared_pointer const & imagePV, const int8_t* orig } array->replace(freeze(imgData)); - PVIntPtr uniqueIdField = imagePV->getIntField(std::string("uniqueId")); + PVIntPtr uniqueIdField = imagePV->getSubField("uniqueId"); uniqueIdField->put(uniqueIdField->get()+1); } diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index 07f83e9..9c98f94 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -215,8 +215,8 @@ public: }; -// testNTImage -class NTImageAction : public Runnable { +// testNTNDArray +class NTNDArrayAction : public Runnable { public: string name; PVStructure::shared_pointer pvImage; @@ -225,7 +225,7 @@ public: AtomicBoolean stopped; - NTImageAction(double periodHz) : + NTNDArrayAction(double periodHz) : angle(0), period(periodHz) { @@ -244,9 +244,9 @@ public: angle += 1; notifyStructureChanged(name); } catch (std::exception &ex) { - std::cerr << "Unhandled exception caught in NTImageAction::run(): " << ex.what() << std::endl; + std::cerr << "Unhandled exception caught in NTNDArrayAction::run(): " << ex.what() << std::endl; } catch (...) { - std::cerr << "Unhandled exception caught in NTImageAction::run()" << std::endl; + std::cerr << "Unhandled exception caught in NTNDArrayAction::run()" << std::endl; } epicsThreadSleep(period); @@ -1417,7 +1417,7 @@ public: ); const string helpText = - "Generates a NTImage structure response that has encoded a specified image.\n" + "Generates a NTNDArray structure response that has encoded a specified image.\n" "Arguments:\n" "\tstring file\tfile path (relative to a location where the server was started) of a raw encoded image.\n" "\t\t\tTwo image types are supported:\n" @@ -1467,12 +1467,12 @@ public: if (isRGB) { const int32_t dim[] = { 3, wv, hv }; - initImage(m_pvStructure, 2 /* RGB */, 3, dim, fileSize, 0); + initImage(m_pvStructure, "RGB", 3, dim, fileSize, 0); } else { const int32_t dim[] = { wv, hv }; - initImage(m_pvStructure, 0 /* grayscale */, 2, dim, fileSize, 0); + initImage(m_pvStructure, "grayscale", 2, dim, fileSize, 0); } PVByteArrayPtr value = std::tr1::dynamic_pointer_cast(m_pvStructure->getSubField("value")); @@ -2161,7 +2161,7 @@ protected: else if (m_name.find("testMP") == 0 || m_name.find("testImage") == 0) { - m_pvStructure = getPVDataCreate()->createPVStructure(makeImageStruc()); + m_pvStructure = getPVDataCreate()->createPVStructure(createNTNDArrayStructure()); initImageEPICSv4GrayscaleLogo(m_pvStructure); } else if (m_name.find("testTable") == 0) @@ -2692,7 +2692,7 @@ private: ADCAction m_adcAction; auto_ptr m_adcThread; - NTImageAction m_imgAction; + NTNDArrayAction m_imgAction; auto_ptr m_imgThread; };