diff --git a/pdbApp/pdbsingle.cpp b/pdbApp/pdbsingle.cpp index 5b8b0a1..ae3633e 100644 --- a/pdbApp/pdbsingle.cpp +++ b/pdbApp/pdbsingle.cpp @@ -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); +} diff --git a/pdbApp/pdbsingle.h b/pdbApp/pdbsingle.h index 12de7e9..c2d2375 100644 --- a/pdbApp/pdbsingle.h +++ b/pdbApp/pdbsingle.h @@ -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 +{ + PDBSingleChannel::shared_pointer channel; + epics::pvAccess::ChannelPutRequester::shared_pointer requester; + + epics::pvData::BitSetPtr changed; + epics::pvData::PVStructurePtr pvf; + std::auto_ptr 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 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