static PVStructure::shared_pointer createPVStructure(CAChannel::shared_pointer const & channel, string const & properties) { PVStructure::shared_pointer pvStructure = getPVDataCreate()->createPVStructure(createStructure(channel, properties)); if (channel->getNativeType() == DBR_ENUM) { PVScalarArrayPtr pvScalarArray = pvStructure->getScalarArrayField("value.choices", pvString); // TODO avoid getting labels if DBR_GR_ENUM or DBR_CTRL_ENUM is used in subsequent get int result = ca_array_get_callback(DBR_GR_ENUM, 1, channel->getChannelID(), ca_get_labels_handler, pvScalarArray.get()); if (result == ECA_NORMAL) { ca_flush_io(); // NOTE: we do not wait here, since all subsequent request (over TCP) is serialized // and will guarantee that ca_get_labels_handler is called first } else { // TODO better error handling std::cerr << "failed to get labels for enum " << channel->getChannelName() << ": " << ca_message(result) << std::endl; } } return pvStructure; }
int doPut_pvStructure<string, pvString, PVString, PVStringArray>(CAChannel::shared_pointer const & channel, void *usrArg, PVStructure::shared_pointer const & pvStructure) { bool isScalarValue = pvStructure->getStructure()->getField("value")->getType() == scalar; if (isScalarValue) { std::tr1::shared_ptr<PVString> value = std::tr1::static_pointer_cast<PVString>(pvStructure->getSubField("value")); string val = value->get(); int result = ca_array_put_callback(channel->getNativeType(), 1, channel->getChannelID(), val.c_str(), ca_put_handler, usrArg); if (result == ECA_NORMAL) { ca_flush_io(); } return result; } else { std::tr1::shared_ptr<PVStringArray> value = std::tr1::static_pointer_cast<PVStringArray>(pvStructure->getScalarArrayField("value", pvString)); PVStringArray::const_svector stringArray(value->view()); size_t arraySize = stringArray.size(); size_t ca_stringBufferSize = arraySize * MAX_STRING_SIZE; char* ca_stringBuffer = new char[ca_stringBufferSize]; memset(ca_stringBuffer, 0, ca_stringBufferSize); char *p = ca_stringBuffer; for(size_t i = 0; i < arraySize; i++) { string value = stringArray[i]; size_t len = value.length(); if (len >= MAX_STRING_SIZE) len = MAX_STRING_SIZE - 1; memcpy(p, value.c_str(), len); p += MAX_STRING_SIZE; } int result = ca_array_put_callback(channel->getNativeType(), arraySize, channel->getChannelID(), ca_stringBuffer, ca_put_handler, usrArg); delete[] ca_stringBuffer; if (result == ECA_NORMAL) { ca_flush_io(); } return result; } }
void copy_DBR<dbr_long_t, pvInt, PVInt, PVIntArray>(const void * dbr, unsigned count, PVStructure::shared_pointer const & pvStructure) { if (count == 1) { std::tr1::shared_ptr<PVInt> value = std::tr1::static_pointer_cast<PVInt>(pvStructure->getSubField("value")); value->put(static_cast<const int32*>(dbr)[0]); } else { std::tr1::shared_ptr<PVIntArray> value = std::tr1::static_pointer_cast<PVIntArray>(pvStructure->getScalarArrayField("value", pvInt)); PVIntArray::svector temp(value->reuse()); temp.resize(count); std::copy(static_cast<const int32*>(dbr), static_cast<const int32*>(dbr) + count, temp.begin()); value->replace(freeze(temp)); } }
void copy_DBR(const void * dbr, unsigned count, PVStructure::shared_pointer const & pvStructure) { if (count == 1) { std::tr1::shared_ptr<sF> value = std::tr1::static_pointer_cast<sF>(pvStructure->getSubField("value")); value->put(static_cast<const pT*>(dbr)[0]); } else { std::tr1::shared_ptr<aF> value = std::tr1::static_pointer_cast<aF>(pvStructure->getScalarArrayField("value", sT)); typename aF::svector temp(value->reuse()); temp.resize(count); std::copy(static_cast<const pT*>(dbr), static_cast<const pT*>(dbr) + count, temp.begin()); value->replace(freeze(temp)); } }
void copy_DBR<string, pvString, PVString, PVStringArray>(const void * dbr, unsigned count, PVStructure::shared_pointer const & pvStructure) { if (count == 1) { std::tr1::shared_ptr<PVString> value = std::tr1::static_pointer_cast<PVString>(pvStructure->getSubField("value")); value->put(std::string(static_cast<const char*>(dbr))); } else { std::tr1::shared_ptr<PVStringArray> value = std::tr1::static_pointer_cast<PVStringArray>(pvStructure->getScalarArrayField("value", pvString)); const dbr_string_t* dbrStrings = static_cast<const dbr_string_t*>(dbr); PVStringArray::svector sA(value->reuse()); sA.resize(count); std::copy(dbrStrings, dbrStrings + count, sA.begin()); value->replace(freeze(sA)); } }
int doPut_pvStructure(CAChannel::shared_pointer const & channel, void *usrArg, PVStructure::shared_pointer const & pvStructure) { bool isScalarValue = pvStructure->getStructure()->getField("value")->getType() == scalar; if (isScalarValue) { std::tr1::shared_ptr<sF> value = std::tr1::static_pointer_cast<sF>(pvStructure->getSubField("value")); pT val = value->get(); int result = ca_array_put_callback(channel->getNativeType(), 1, channel->getChannelID(), &val, ca_put_handler, usrArg); if (result == ECA_NORMAL) { ca_flush_io(); } return result; } else { std::tr1::shared_ptr<aF> value = std::tr1::static_pointer_cast<aF>(pvStructure->getScalarArrayField("value", sT)); const pT* val = value->view().data(); int result = ca_array_put_callback(channel->getNativeType(), static_cast<unsigned long>(value->getLength()), channel->getChannelID(), val, ca_put_handler, usrArg); if (result == ECA_NORMAL) { ca_flush_io(); } return result; } }