PVScalarArrayPtr PVDataCreate::createPVScalarArray( PVScalarArrayPtr const & arrayToClone) { PVScalarArrayPtr pvArray = createPVScalarArray( arrayToClone->getScalarArray()->getElementType()); pvArray->assign(*arrayToClone.get()); return pvArray; }
int64 NTNDArray::getValueSize() { int64 size = 0; PVScalarArrayPtr storedValue = getValue()->get<PVScalarArray>(); if (!storedValue.get()) { size = storedValue->getLength()*getValueTypeSize(); } return size; }
bool PVEnumerated::attach(PVFieldPtr const & pvField) { if(pvField->getField()->getType()!=structure) return false; PVStructurePtr pvStructure = static_pointer_cast<PVStructure>(pvField); pvIndex = pvStructure->getIntField("index"); if(pvIndex.get()==NULL) return false; PVScalarArrayPtr pvScalarArray = pvStructure->getScalarArrayField( "choices",pvString); if(pvScalarArray.get()==NULL) { pvIndex.reset(); return false; } pvChoices = static_pointer_cast<PVStringArray>(pvScalarArray); return true; }
static void testScalarArrayCommon(string /*fieldName*/,ScalarType stype) { PVStructurePtr pvStructure = standardPVField->scalarArray( stype,alarmTimeStamp); PVScalarArrayPtr scalarArray = pvStructure->getSubField<PVScalarArray>("value"); testOk1(scalarArray.get()!=0); if(stype==pvBoolean) { StringArray values(3); values[0] = "true"; values[1] = "false"; values[2] = "true"; convert->fromStringArray(scalarArray, 0,3,values,0); } else { StringArray values(3); values[0] = "0"; values[1] = "1"; values[2] = "2"; convert->fromStringArray(scalarArray, 0,3,values,0); } PVFieldPtr pvField = pvStructure->getSubField<PVInt>("alarm.status"); testOk1(pvField.get()!=0); }
int64 NTNDArray::getValueTypeSize() { int64 typeSize = 0; PVScalarArrayPtr storedValue = getValue()->get<PVScalarArray>(); if (storedValue.get()) { switch (storedValue->getScalarArray()->getElementType()) { case pvBoolean: case pvByte: case pvUByte: typeSize = 1; break; case pvShort: case pvUShort: typeSize = 2; break; case pvInt: case pvUInt: case pvFloat: typeSize = 4; break; case pvLong: case pvULong: case pvDouble: typeSize = 8; break; default: break; } } return typeSize; }
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; }