implement field options
This commit is contained in:
@@ -46,6 +46,11 @@ DbdToPvPtr DbdToPv::create(
|
||||
|
||||
DbdToPv::DbdToPv(IOType ioType)
|
||||
: ioType(ioType),
|
||||
dbfIsUCHAR(false),
|
||||
dbfIsUSHORT(false),
|
||||
dbfIsULONG(false),
|
||||
dbfIsINT64(false),
|
||||
dbfIsUINT64(false),
|
||||
valueRequested(false),
|
||||
alarmRequested(false),
|
||||
timeStampRequested(false),
|
||||
@@ -53,6 +58,7 @@ DbdToPv::DbdToPv(IOType ioType)
|
||||
controlRequested(false),
|
||||
valueAlarmRequested(false),
|
||||
isArray(false),
|
||||
charArrayIsString(false),
|
||||
firstTime(true),
|
||||
caValueType(-1),
|
||||
caRequestType(-1),
|
||||
@@ -79,10 +85,15 @@ static chtype getDbrType(const ScalarType scalarType)
|
||||
{
|
||||
case pvString : return DBR_STRING;
|
||||
case pvByte : return DBR_CHAR;
|
||||
case pvUByte : return DBR_CHAR;
|
||||
case pvShort : return DBR_SHORT;
|
||||
case pvUShort : return DBR_SHORT;
|
||||
case pvInt : return DBR_LONG;
|
||||
case pvUInt : return DBR_LONG;
|
||||
case pvFloat : return DBR_FLOAT;
|
||||
case pvDouble : return DBR_DOUBLE;
|
||||
case pvLong : return DBR_DOUBLE;
|
||||
case pvULong : return DBR_DOUBLE;
|
||||
default: break;
|
||||
}
|
||||
throw std::runtime_error("getDbr: illegal scalarType");
|
||||
@@ -196,25 +207,72 @@ void DbdToPv::activate(
|
||||
|
||||
return;
|
||||
}
|
||||
ScalarType st = dbr2ST[channelType];
|
||||
PVStringPtr pvValue = fieldPVStructure->getSubField<PVString>("value._options.dbtype");
|
||||
if(pvValue)
|
||||
{
|
||||
std::string value(pvValue->get());
|
||||
if(value.find("DBF_UCHAR")!=std::string::npos) {
|
||||
if(st==pvByte) {
|
||||
dbfIsUCHAR = true;
|
||||
st = pvUByte;
|
||||
caValueType = DBR_CHAR;
|
||||
}
|
||||
} else if(value.find("DBF_USHORT")!=std::string::npos) {
|
||||
if(st==pvInt) {
|
||||
dbfIsUSHORT = true;
|
||||
st = pvUShort;
|
||||
caValueType = DBR_SHORT;
|
||||
}
|
||||
} else if(value.find("DBF_ULONG")!=std::string::npos) {
|
||||
if(st==pvDouble) {
|
||||
dbfIsULONG = true;
|
||||
st = pvUInt;
|
||||
caValueType = DBR_LONG;
|
||||
}
|
||||
} else if(value.find("DBF_INT64")!=std::string::npos) {
|
||||
if(st==pvDouble) {
|
||||
dbfIsINT64 = true;
|
||||
st = pvLong;
|
||||
}
|
||||
} else if(value.find("DBF_UINT64")!=std::string::npos) {
|
||||
if(st==pvDouble) {
|
||||
dbfIsUINT64 = true;
|
||||
st = pvULong;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if(st==pvString) {
|
||||
displayRequested = false;
|
||||
controlRequested = false;
|
||||
valueAlarmRequested = false;
|
||||
}
|
||||
maxElements = ca_element_count(channelID);
|
||||
if(maxElements!=1) isArray = true;
|
||||
if(isArray)
|
||||
{
|
||||
controlRequested = false;
|
||||
valueAlarmRequested = false;
|
||||
if(channelType==DBR_CHAR && fieldPVStructure)
|
||||
{
|
||||
PVStringPtr pvValue = fieldPVStructure->getSubField<PVString>("value._options.pvtype");
|
||||
if(pvValue) {
|
||||
std::string value(pvValue->get());
|
||||
if(value.find("pvString")!=std::string::npos) {
|
||||
charArrayIsString = true;
|
||||
st = pvString;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ScalarType st = dbr2ST[channelType];
|
||||
if(st==pvString) {
|
||||
displayRequested = false;
|
||||
controlRequested = false;
|
||||
valueAlarmRequested = false;
|
||||
}
|
||||
|
||||
if(controlRequested || displayRequested || valueAlarmRequested) timeStampRequested = false;
|
||||
FieldCreatePtr fieldCreate(FieldCreate::getFieldCreate());
|
||||
PVDataCreatePtr pvDataCreate(PVDataCreate::getPVDataCreate());
|
||||
FieldBuilderPtr fieldBuilder(fieldCreate->createFieldBuilder());
|
||||
if(valueRequested) {
|
||||
if(isArray) {
|
||||
if(isArray && !charArrayIsString) {
|
||||
fieldBuilder->addArray("value",st);
|
||||
} else {
|
||||
fieldBuilder->add("value",st);
|
||||
@@ -228,14 +286,19 @@ void DbdToPv::activate(
|
||||
switch(st)
|
||||
{
|
||||
case pvByte:
|
||||
case pvUByte:
|
||||
fieldBuilder->add("valueAlarm",standardField->byteAlarm()); break;
|
||||
case pvShort:
|
||||
case pvUShort:
|
||||
fieldBuilder->add("valueAlarm",standardField->shortAlarm()); break;
|
||||
case pvInt:
|
||||
case pvUInt:
|
||||
fieldBuilder->add("valueAlarm",standardField->intAlarm()); break;
|
||||
case pvFloat:
|
||||
fieldBuilder->add("valueAlarm",standardField->floatAlarm()); break;
|
||||
case pvDouble:
|
||||
case pvLong:
|
||||
case pvULong:
|
||||
fieldBuilder->add("valueAlarm",standardField->doubleAlarm()); break;
|
||||
default:
|
||||
throw std::runtime_error("DbDToPv::activate: bad type");
|
||||
@@ -392,18 +455,51 @@ Status DbdToPv::getFromDBD(
|
||||
break;
|
||||
}
|
||||
case DBR_CHAR:
|
||||
if(charArrayIsString)
|
||||
{
|
||||
const char * pchar = static_cast<const char *>(value);
|
||||
std::string str(pchar);
|
||||
PVStringPtr pvValue(pvStructure->getSubField<PVString>("value"));
|
||||
pvValue->put(str);
|
||||
break;
|
||||
}
|
||||
if(dbfIsUCHAR)
|
||||
{
|
||||
copy_DBRScalarArray<dbr_char_t,PVUByteArray>(value,count,pvValue);
|
||||
break;
|
||||
}
|
||||
copy_DBRScalarArray<dbr_char_t,PVByteArray>(value,count,pvValue);
|
||||
break;
|
||||
case DBR_SHORT:
|
||||
if(dbfIsUSHORT)
|
||||
{
|
||||
copy_DBRScalarArray<dbr_short_t,PVUShortArray>(value,count,pvValue);
|
||||
break;
|
||||
}
|
||||
copy_DBRScalarArray<dbr_short_t,PVShortArray>(value,count,pvValue);
|
||||
break;
|
||||
case DBR_LONG:
|
||||
if(dbfIsULONG)
|
||||
{
|
||||
copy_DBRScalarArray<dbr_long_t,PVUIntArray>(value,count,pvValue);
|
||||
break;
|
||||
}
|
||||
copy_DBRScalarArray<dbr_long_t,PVIntArray>(value,count,pvValue);
|
||||
break;
|
||||
case DBR_FLOAT:
|
||||
copy_DBRScalarArray<dbr_float_t,PVFloatArray>(value,count,pvValue);
|
||||
break;
|
||||
case DBR_DOUBLE:
|
||||
if(dbfIsINT64)
|
||||
{
|
||||
copy_DBRScalarArray<dbr_double_t,PVLongArray>(value,count,pvValue);
|
||||
break;
|
||||
}
|
||||
if(dbfIsUINT64)
|
||||
{
|
||||
copy_DBRScalarArray<dbr_double_t,PVULongArray>(value,count,pvValue);
|
||||
break;
|
||||
}
|
||||
copy_DBRScalarArray<dbr_double_t,PVDoubleArray>(value,count,pvValue);
|
||||
break;
|
||||
default:
|
||||
@@ -434,11 +530,40 @@ Status DbdToPv::getFromDBD(
|
||||
break;
|
||||
}
|
||||
case DBR_STRING: copy_DBRScalar<dbr_string_t,PVString>(value,pvValue); break;
|
||||
case DBR_CHAR: copy_DBRScalar<dbr_char_t,PVByte>(value,pvValue); break;
|
||||
case DBR_SHORT: copy_DBRScalar<dbr_short_t,PVShort>(value,pvValue); break;
|
||||
case DBR_LONG: copy_DBRScalar<dbr_long_t,PVInt>(value,pvValue); break;
|
||||
case DBR_CHAR:
|
||||
if(dbfIsUCHAR)
|
||||
{
|
||||
copy_DBRScalar<dbr_char_t,PVUByte>(value,pvValue);
|
||||
break;
|
||||
}
|
||||
copy_DBRScalar<dbr_char_t,PVByte>(value,pvValue); break;
|
||||
case DBR_SHORT:
|
||||
if(dbfIsUSHORT)
|
||||
{
|
||||
copy_DBRScalar<dbr_short_t,PVUShort>(value,pvValue);
|
||||
break;
|
||||
}
|
||||
copy_DBRScalar<dbr_short_t,PVShort>(value,pvValue); break;
|
||||
case DBR_LONG:
|
||||
if(dbfIsULONG)
|
||||
{
|
||||
copy_DBRScalar<dbr_long_t,PVUInt>(value,pvValue);
|
||||
break;
|
||||
}
|
||||
copy_DBRScalar<dbr_long_t,PVInt>(value,pvValue); break;
|
||||
case DBR_FLOAT: copy_DBRScalar<dbr_float_t,PVFloat>(value,pvValue); break;
|
||||
case DBR_DOUBLE: copy_DBRScalar<dbr_double_t,PVDouble>(value,pvValue); break;
|
||||
case DBR_DOUBLE:
|
||||
if(dbfIsINT64)
|
||||
{
|
||||
copy_DBRScalar<dbr_double_t,PVLong>(value,pvValue);
|
||||
break;
|
||||
}
|
||||
if(dbfIsUINT64)
|
||||
{
|
||||
copy_DBRScalar<dbr_double_t,PVULong>(value,pvValue);
|
||||
break;
|
||||
}
|
||||
copy_DBRScalar<dbr_double_t,PVDouble>(value,pvValue); break;
|
||||
default:
|
||||
Status errorStatus(
|
||||
Status::STATUSTYPE_ERROR, string("DbdToPv::getFromDBD logic error"));
|
||||
@@ -726,18 +851,63 @@ Status DbdToPv::putToDBD(
|
||||
break;
|
||||
}
|
||||
case DBR_CHAR:
|
||||
if(charArrayIsString)
|
||||
{
|
||||
PVStringPtr pvValue(pvStructure->getSubField<PVString>("value"));
|
||||
const char * pchar = pvValue->get().c_str();
|
||||
pValue = pchar;
|
||||
count = pvValue->get().length();
|
||||
break;
|
||||
}
|
||||
if(dbfIsUCHAR)
|
||||
{
|
||||
pValue = put_DBRScalarArray<dbr_char_t,PVUByteArray>(&count,pvValue);
|
||||
break;
|
||||
}
|
||||
pValue = put_DBRScalarArray<dbr_char_t,PVByteArray>(&count,pvValue);
|
||||
break;
|
||||
case DBR_SHORT:
|
||||
if(dbfIsUSHORT)
|
||||
{
|
||||
pValue = put_DBRScalarArray<dbr_short_t,PVUShortArray>(&count,pvValue);
|
||||
break;
|
||||
}
|
||||
pValue = put_DBRScalarArray<dbr_short_t,PVShortArray>(&count,pvValue);
|
||||
break;
|
||||
case DBR_LONG:
|
||||
if(dbfIsULONG)
|
||||
{
|
||||
pValue = put_DBRScalarArray<dbr_long_t,PVUIntArray>(&count,pvValue);
|
||||
break;
|
||||
}
|
||||
pValue = put_DBRScalarArray<dbr_long_t,PVIntArray>(&count,pvValue);
|
||||
break;
|
||||
case DBR_FLOAT:
|
||||
pValue = put_DBRScalarArray<dbr_float_t,PVFloatArray>(&count,pvValue);
|
||||
break;
|
||||
case DBR_DOUBLE:
|
||||
if(dbfIsINT64)
|
||||
{
|
||||
PVLongArrayPtr pvValue(pvStructure->getSubField<PVLongArray>("value"));
|
||||
PVLongArray::const_svector sv(pvValue->view());
|
||||
pvDoubleArray = PVDoubleArrayPtr(getPVDataCreate()->createPVScalarArray<PVDoubleArray>());
|
||||
pvDoubleArray->putFrom(sv);
|
||||
const double * pdouble = pvDoubleArray->view().data();
|
||||
count = pvValue->getLength();
|
||||
pValue = pdouble;
|
||||
break;
|
||||
}
|
||||
if(dbfIsUINT64)
|
||||
{
|
||||
PVULongArrayPtr pvValue(pvStructure->getSubField<PVULongArray>("value"));
|
||||
PVULongArray::const_svector sv(pvValue->view());
|
||||
pvDoubleArray = PVDoubleArrayPtr(getPVDataCreate()->createPVScalarArray<PVDoubleArray>());
|
||||
pvDoubleArray->putFrom(sv);
|
||||
const double * pdouble = pvDoubleArray->view().data();
|
||||
count = pvValue->getLength();
|
||||
pValue = pdouble;
|
||||
break;
|
||||
}
|
||||
pValue = put_DBRScalarArray<dbr_double_t,PVDoubleArray>(&count,pvValue);
|
||||
break;
|
||||
default:
|
||||
@@ -755,14 +925,43 @@ Status DbdToPv::putToDBD(
|
||||
break;
|
||||
}
|
||||
case DBR_STRING: pValue = pvStructure->getSubField<PVString>("value")->get().c_str(); break;
|
||||
case DBR_CHAR: pValue = put_DBRScalar<dbr_char_t,PVByte>(&bvalue,pvValue); break;
|
||||
case DBR_SHORT: pValue = put_DBRScalar<dbr_short_t,PVShort>(&svalue,pvValue); break;
|
||||
case DBR_LONG: pValue = put_DBRScalar<dbr_long_t,PVInt>(&lvalue,pvValue); break;
|
||||
case DBR_CHAR:
|
||||
if(dbfIsUCHAR)
|
||||
{
|
||||
pValue = put_DBRScalar<dbr_char_t,PVUByte>(&bvalue,pvValue);
|
||||
break;
|
||||
}
|
||||
pValue = put_DBRScalar<dbr_char_t,PVByte>(&bvalue,pvValue); break;
|
||||
case DBR_SHORT:
|
||||
if(dbfIsUSHORT)
|
||||
{
|
||||
pValue = put_DBRScalar<dbr_short_t,PVUShort>(&svalue,pvValue);
|
||||
break;
|
||||
}
|
||||
pValue = put_DBRScalar<dbr_short_t,PVShort>(&svalue,pvValue); break;
|
||||
case DBR_LONG:
|
||||
if(dbfIsULONG)
|
||||
{
|
||||
pValue = put_DBRScalar<dbr_long_t,PVUInt>(&lvalue,pvValue);
|
||||
break;
|
||||
}
|
||||
pValue = put_DBRScalar<dbr_long_t,PVInt>(&lvalue,pvValue); break;
|
||||
case DBR_FLOAT: pValue = put_DBRScalar<dbr_float_t,PVFloat>(&fvalue,pvValue); break;
|
||||
case DBR_DOUBLE: pValue = put_DBRScalar<dbr_double_t,PVDouble>(&dvalue,pvValue); break;
|
||||
case DBR_DOUBLE:
|
||||
if(dbfIsINT64)
|
||||
{
|
||||
pValue = put_DBRScalar<dbr_double_t,PVLong>(&dvalue,pvValue);
|
||||
break;
|
||||
}
|
||||
if(dbfIsUINT64)
|
||||
{
|
||||
pValue = put_DBRScalar<dbr_double_t,PVULong>(&dvalue,pvValue);
|
||||
break;
|
||||
}
|
||||
pValue = put_DBRScalar<dbr_double_t,PVDouble>(&dvalue,pvValue); break;
|
||||
default:
|
||||
Status errorStatus(
|
||||
Status::STATUSTYPE_ERROR, string("DbdToPv::getFromDBD logic error"));
|
||||
Status::STATUSTYPE_ERROR, string("DbdToPv::putToDBD logic error"));
|
||||
return errorStatus;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user