NTNDArray mapping
This commit is contained in:
+19
-63
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user