add single put()

This commit is contained in:
Michael Davidsaver
2016-03-02 17:57:15 -05:00
parent fc19ab7164
commit 031dd94dd1
2 changed files with 75 additions and 1 deletions

View File

@@ -53,6 +53,16 @@ PDBSingleChannel::createChannelGet(
return ret;
}
pva::ChannelPut::shared_pointer
PDBSingleChannel::createChannelPut(
pva::ChannelPutRequester::shared_pointer const & requester,
pvd::PVStructure::shared_pointer const & pvRequest)
{
pva::ChannelPut::shared_pointer ret(new PDBSinglePut(shared_from_this(), requester));
requester->channelPutConnect(pvd::Status(), ret, fielddesc);
return ret;
}
PDBSingleGet::PDBSingleGet(PDBSingleChannel::shared_pointer channel,
pva::ChannelGetRequester::shared_pointer requester)
@@ -75,3 +85,38 @@ void PDBSingleGet::get()
changed->set(0);
requester->getDone(pvd::Status(), shared_from_this(), pvf, changed);
}
PDBSinglePut::PDBSinglePut(PDBSingleChannel::shared_pointer channel,
pva::ChannelPutRequester::shared_pointer requester)
:channel(channel)
,requester(requester)
,changed(new pvd::BitSet(channel->fielddesc->getNumberFields()))
,pvf(pvd::getPVDataCreate()->createPVStructure(channel->fielddesc))
,pvif(PVIF::attach(channel->pv->chan, pvf))
{}
void PDBSinglePut::put(pvd::PVStructure::shared_pointer const & value,
pvd::BitSet::shared_pointer const & changed)
{
{
DBScanLocker L(channel->pv->chan);
pvif->get(*changed);
}
requester->putDone(pvd::Status(), shared_from_this());
}
void PDBSinglePut::get()
{
changed->clear();
{
DBScanLocker L(channel->pv->chan);
pvif->put(*changed, DBE_VALUE|DBE_ALARM|DBE_PROPERTY, NULL);
}
//TODO: report unused fields as changed?
changed->clear();
changed->set(0);
requester->getDone(pvd::Status(), shared_from_this(), pvf, changed);
}

View File

@@ -43,6 +43,9 @@ struct PDBSingleChannel : public BaseChannel,
virtual epics::pvAccess::ChannelGet::shared_pointer createChannelGet(
epics::pvAccess::ChannelGetRequester::shared_pointer const & channelGetRequester,
epics::pvData::PVStructure::shared_pointer const & pvRequest);
virtual epics::pvAccess::ChannelPut::shared_pointer createChannelPut(
epics::pvAccess::ChannelPutRequester::shared_pointer const & requester,
epics::pvData::PVStructure::shared_pointer const & pvRequest);
virtual void printInfo(std::ostream& out);
};
@@ -69,7 +72,33 @@ struct PDBSingleGet : public epics::pvAccess::ChannelGet,
virtual void lastRequest() {}
virtual void get();
};
//struct PDBSinglePut : public epics::pvAccess::ChannelPut {};
struct PDBSinglePut : public epics::pvAccess::ChannelPut,
public std::tr1::enable_shared_from_this<PDBSinglePut>
{
PDBSingleChannel::shared_pointer channel;
epics::pvAccess::ChannelPutRequester::shared_pointer requester;
epics::pvData::BitSetPtr changed;
epics::pvData::PVStructurePtr pvf;
std::auto_ptr<PVIF> pvif;
PDBSinglePut(PDBSingleChannel::shared_pointer channel,
epics::pvAccess::ChannelPutRequester::shared_pointer requester);
virtual ~PDBSinglePut() {}
virtual void destroy() { pvif.reset(); channel.reset(); requester.reset(); }
virtual void lock() {}
virtual void unlock() {}
virtual std::tr1::shared_ptr<epics::pvAccess::Channel> getChannel() { return channel; }
virtual void cancel() {}
virtual void lastRequest() {}
virtual void put(
epics::pvData::PVStructure::shared_pointer const & pvPutStructure,
epics::pvData::BitSet::shared_pointer const & putBitSet);
virtual void get();
};
//struct PDBSingleMonitor : public epics::pvData::Monitor {};
#endif // PDBSINGLE_H