15#include <pv/createRequest.h>
16#include <pv/convert.h>
18#define epicsExportSharedSymbols
22using std::tr1::static_pointer_cast;
23using namespace epics::pvData;
24using namespace epics::pvAccess;
27namespace epics {
namespace pvaClient {
28static ConvertPtr convert = getConvert();
29static string notCompatibleScalar(
"value is not a compatible scalar");
30static string notDoubleArray(
"value is not a doubleArray");
31static string notStringArray(
"value is not a stringArray");
33class PvaClientPostHandlerPvt:
public PostHandler
35 PvaClientPutData * putData;
38 PvaClientPostHandlerPvt(PvaClientPutData *putData,
size_t fieldNumber)
39 : putData(putData),fieldNumber(fieldNumber){}
40 void postPut() { putData->postPut(fieldNumber);}
51PvaClientPutData::PvaClientPutData(StructureConstPtr
const & structure)
55 PVStructurePtr pvStructure(getPVDataCreate()->createPVStructure(structure));
56 BitSetPtr bitSet(BitSetPtr(
new BitSet(pvStructure->getNumberFields())));
58 size_t nfields = pvStructure->getNumberFields();
59 postHandler.resize(nfields);
61 for(
size_t i =0; i<nfields; ++i)
65 pvField = pvStructure;
67 pvField = pvStructure->getSubField(i);
69 pvField->setPostHandler(postHandler[i]);
78 Type type = pvField->getField()->getType();
80 throw std::logic_error(
"PvaClientData::putDouble() did not find a scalar field");
82 PVScalarPtr pvScalar = static_pointer_cast<PVScalar>(pvField);
83 ScalarType scalarType = pvScalar->getScalar()->getScalarType();
84 if(scalarType==pvDouble) {
85 PVDoublePtr pvDouble = static_pointer_cast<PVDouble>(pvScalar);
89 if(!ScalarTypeFunc::isNumeric(scalarType)) {
90 throw std::logic_error(
91 "PvaClientData::putDouble() did not find a numeric scalar field");
93 convert->fromDouble(pvScalar,value);
100 Type type = pvField->getField()->getType();
102 throw std::logic_error(
"PvaClientData::putString() did not find a scalar field");
104 PVScalarPtr pvScalar = static_pointer_cast<PVScalar>(pvField);
105 convert->fromString(pvScalar,value);
112 Type type = pvField->getField()->getType();
113 if(type!=scalarArray) {
114 throw std::logic_error(
"PvaClientData::putDoubleArray() did not find a scalarArray field");
116 PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
117 ScalarType scalarType = pvScalarArray->getScalarArray()->getElementType();
118 if(!ScalarTypeFunc::isNumeric(scalarType)) {
119 throw std::logic_error(
120 "PvaClientData::putDoubleArray() did not find a numeric scalarArray field");
122 pvScalarArray->putFrom<
const double>(value);
129 Type type = pvField->getField()->getType();
130 if(type!=scalarArray) {
131 throw std::logic_error(
"PvaClientData::putStringArray() did not find a scalarArray field");
133 PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
134 pvScalarArray->putFrom<
const string>(value);
140 size_t length = value.size();
141 shared_vector<string> val(length);
142 for(
size_t i=0; i < length; ++i) val[i] = value[i];
147void PvaClientPutData::postPut(
size_t fieldNumber)
A base class for PvaClientGetData, PvaClientPutData, and PvaClientMonitorData.
epics::pvData::BitSetPtr getChangedBitSet()
Get the changed BitSet for the pvStructure.
void setData(epics::pvData::PVStructurePtr const &pvStructureFrom, epics::pvData::BitSetPtr const &bitSetFrom)
New data is present.
epics::pvData::PVFieldPtr getSinglePVField()
A class that holds data given to by PvaClientPut or PvaClientPutGet.
void putDoubleArray(epics::pvData::shared_vector< const double > const &value)
Copy the array to the value field.
friend class PvaClientPostHandlerPvt
static PvaClientPutDataPtr create(epics::pvData::StructureConstPtr const &structure)
void putStringArray(epics::pvData::shared_vector< const std::string > const &value)
Copy array to the value field.
void putDouble(double value)
Put the value as a double.
void putString(std::string const &value)
Put the value as a string.
static bool getDebug()
Is debug set?
std::tr1::shared_ptr< PvaClientPutData > PvaClientPutDataPtr