NTNDArray mapping

This commit is contained in:
Michael Davidsaver
2017-09-19 14:18:53 -05:00
parent eb92401175
commit 0e4ba7eceb
5 changed files with 123 additions and 73 deletions
+19 -63
View File
@@ -44,14 +44,6 @@ struct Splitter {
}
};
pvd::StructureConstPtr NTNDArray(pvd::getFieldCreate()->createFieldBuilder()
->setId("epics:nt/NTNDArray:1.0")
//->add("value", pvd::getFieldCreate()->createVariantUnion())
->addNestedStructureArray("dimension")
->add("size", pvd::pvInt)
->endNested()
->createStructure());
struct GroupMemberInfo {
// consumes builder
GroupMemberInfo(const std::string& a, const std::string& b, p2p::auto_ptr<PVIFBuilder>& builder)
@@ -80,9 +72,6 @@ struct GroupInfo {
enum tribool {Unset,True,False} atomic;
bool hastriggers;
typedef std::map<std::string, pvd::StructureConstPtr> predefs_t;
predefs_t predefs;
};
// Iterates all PDB records and gathers info() to construct PDB groups
@@ -199,18 +188,6 @@ struct PDBProcessor
const std::string& fldname = fit->first;
const GroupConfig::Field& fld = fit->second;
if(!fld.predef.empty()) {
if(fld.predef=="epics:nt/NTNDArray:1.0") {
curgroup->predefs[fldname] = NTNDArray;
} else {
fprintf(stderr, "%s.%s : unknown pre-defined type \"%s\"\n",
grpname.c_str(), fldname.c_str(), fld.predef.c_str());
}
// allow pre-defined fields to skip a channel mapping
if(fld.channel.empty())
continue;
}
if(fld.channel.empty())
throw std::runtime_error("Missing required +channel");
@@ -322,31 +299,6 @@ PDBProvider::PDBProvider(const epics::pvAccess::Configuration::shared_pointer &)
pvd::FieldBuilderPtr builder(fcreate->createFieldBuilder());
builder->add("record", _options);
for(GroupInfo::predefs_t::const_iterator it=info.predefs.begin(), end=info.predefs.end();
it!=end; ++it)
{
if(PDBProviderDebug>2)
fprintf(stderr, "%s.%s add pre-defined %s\n",
info.name.c_str(), it->first.c_str(), it->second->getID().c_str());
std::vector<std::string> parts;
{
Splitter S(it->first.c_str(), '.');
std::string part;
while(S.snip(part))
parts.push_back(part);
}
assert(!parts.empty());
for(size_t j=0; j<parts.size()-1; j++)
builder = builder->addNestedStructure(parts[j]);
builder->add(parts.back(), it->second);
for(size_t j=0; j<parts.size()-1; j++)
builder = builder->endNested();
}
for(size_t i=0; i<nchans; i++)
{
GroupMemberInfo &mem = info.members[i];
@@ -357,22 +309,25 @@ PDBProvider::PDBProvider(const epics::pvAccess::Configuration::shared_pointer &)
info.builder = PTRMOVE(mem.builder);
assert(info.builder.get());
std::vector<std::string> parts;
{
Splitter S(mem.pvfldname.c_str(), '.');
std::string part;
while(S.snip(part))
parts.push_back(part);
if(info.builder->buildsType) {
std::vector<std::string> parts;
{
Splitter S(mem.pvfldname.c_str(), '.');
std::string part;
while(S.snip(part))
parts.push_back(part);
}
assert(!parts.empty());
for(size_t j=0; j<parts.size()-1; j++)
builder = builder->addNestedStructure(parts[j]);
builder->add(parts.back(), info.builder->dtype(chan));
for(size_t j=0; j<parts.size()-1; j++)
builder = builder->endNested();
}
assert(!parts.empty());
for(size_t j=0; j<parts.size()-1; j++)
builder = builder->addNestedStructure(parts[j]);
builder->add(parts.back(), info.builder->dtype(chan));
for(size_t j=0; j<parts.size()-1; j++)
builder = builder->endNested();
info.attachment = mem.pvfldname;
info.chan.swap(chan);
@@ -382,6 +337,7 @@ PDBProvider::PDBProvider(const epics::pvAccess::Configuration::shared_pointer &)
info.triggers.push_back(*idx);
}
assert(info.chan);
records[i] = dbChannelRecord(info.chan);
}
pv->members.swap(members);