add single put()
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user