diff --git a/src/factory/StandardField.cpp b/src/factory/StandardField.cpp index 57e695fe..4bfc7f35 100644 --- a/src/factory/StandardField.cpp +++ b/src/factory/StandardField.cpp @@ -65,8 +65,7 @@ StandardField::StandardField() ->add("limitLow", pvDouble) ->add("limitHigh", pvDouble) ->add("description", pvString) - ->add("precision", pvInt) - ->add("form", enumerated()) + ->add("format", pvString) ->add("units", pvString) ->createStructure()) diff --git a/src/property/pv/display.h b/src/property/pv/display.h index 2c2bca24..391a2e45 100644 --- a/src/property/pv/display.h +++ b/src/property/pv/display.h @@ -42,7 +42,8 @@ class epicsShareClass Display { * Constructor */ Display() - :low(0.0),high(0.0) {} + : description(std::string("")),format(std::string("")),units(std::string("")), + low(0.0),high(0.0) {} //default constructors and destructor are OK /** * Get the current value of limitLow. @@ -74,6 +75,17 @@ class epicsShareClass Display { * @param value The value. */ void setDescription(std::string const & value) {description = value;} + /** + * Get the current value of format. + * @return The current value. + */ + std::string getFormat() const {return format;} + /** + * Set format to a new value. + * @param value The value. + * The rules for a valid syntax has not been specified. + */ + void setFormat(std::string const & value) {format = value;} /** * Get the current value of units. * @return The current value. @@ -86,6 +98,7 @@ class epicsShareClass Display { void setUnits(std::string const & value) {units = value;} private: std::string description; + std::string format; std::string units; double low; double high; diff --git a/src/property/pv/pvDisplay.h b/src/property/pv/pvDisplay.h index dcd8ba3e..968ee452 100644 --- a/src/property/pv/pvDisplay.h +++ b/src/property/pv/pvDisplay.h @@ -79,6 +79,7 @@ class epicsShareClass PVDisplay { static std::string noDisplayFound; static std::string notAttached; PVStringPtr pvDescription; + PVStringPtr pvFormat; PVStringPtr pvUnits; PVDoublePtr pvLow; PVDoublePtr pvHigh; diff --git a/src/property/pvDisplay.cpp b/src/property/pvDisplay.cpp index 7f6cce0b..12052627 100644 --- a/src/property/pvDisplay.cpp +++ b/src/property/pvDisplay.cpp @@ -29,6 +29,11 @@ bool PVDisplay::attach(PVFieldPtr const & pvField) PVStructurePtr pvStructure = static_pointer_cast(pvField); pvDescription = pvStructure->getSubField("description"); if(pvDescription.get()==NULL) return false; + pvFormat = pvStructure->getSubField("format"); + if(pvFormat.get()==NULL) { + detach(); + return false; + } pvUnits = pvStructure->getSubField("units"); if(pvUnits.get()==NULL) { detach(); @@ -50,6 +55,7 @@ bool PVDisplay::attach(PVFieldPtr const & pvField) void PVDisplay::detach() { pvDescription.reset(); + pvFormat.reset(); pvUnits.reset(); pvLow.reset(); pvHigh.reset(); @@ -66,6 +72,7 @@ void PVDisplay::get(Display & display) const throw std::logic_error(notAttached); } display.setDescription(pvDescription->get()); + display.setFormat(pvFormat->get()); display.setUnits(pvUnits->get()); display.setLow(pvLow->get()); display.setHigh(pvHigh->get()); @@ -76,7 +83,7 @@ bool PVDisplay::set(Display const & display) if(pvDescription.get()==NULL) { throw std::logic_error(notAttached); } - if(pvDescription->isImmutable()) return false; + if(pvDescription->isImmutable() || pvFormat->isImmutable()) return false; if(pvUnits->isImmutable() || pvLow->isImmutable() || pvHigh->isImmutable()) { return false; @@ -89,6 +96,11 @@ bool PVDisplay::set(Display const & display) pvDescription->put(display.getDescription()); returnValue = true; } + if(current.getFormat()!=display.getFormat()) + { + pvFormat->put(display.getFormat()); + returnValue = true; + } if(current.getUnits()!=display.getUnits()) { pvUnits->put(display.getUnits()); diff --git a/testApp/property/testProperty.cpp b/testApp/property/testProperty.cpp index 949662cc..fd74d7df 100644 --- a/testApp/property/testProperty.cpp +++ b/testApp/property/testProperty.cpp @@ -172,6 +172,7 @@ static void testDisplay() dy.setLow(-10.0); dy.setHigh(-1.0); dy.setDescription(string("testDescription")); + dy.setFormat(string("%f10.0")); dy.setUnits(string("volts")); result = pvDisplay.set(dy); testOk1(result); @@ -179,6 +180,7 @@ static void testDisplay() testOk1(dy.getLow()==display.getLow()); testOk1(dy.getHigh()==display.getHigh()); testOk1(dy.getDescription().compare(display.getDescription())==0); + testOk1(dy.getFormat().compare(display.getFormat())==0); testOk1(dy.getUnits().compare(display.getUnits())==0); double low = display.getLow(); double high = display.getHigh(); @@ -215,7 +217,7 @@ static void testEnumerated() MAIN(testProperty) { - testPlan(26); + testPlan(27); testDiag("Tests property"); fieldCreate = getFieldCreate(); pvDataCreate = getPVDataCreate(); diff --git a/testApp/pv/testPVData.cpp b/testApp/pv/testPVData.cpp index b532f0bd..7625924c 100644 --- a/testApp/pv/testPVData.cpp +++ b/testApp/pv/testPVData.cpp @@ -224,6 +224,10 @@ static void testPVScalarWithProperties( string("display.description")); testOk1(desc.get()!=0); desc->put(string("this is a description")); + PVStringPtr format = pvStructure->getSubField( + string("display.format")); + testOk1(format.get()!=0); + format->put(string("f10.2")); PVStringPtr units = pvStructure->getSubField( string("display.units")); testOk1(units.get()!=0); @@ -736,7 +740,7 @@ static void testSubField() MAIN(testPVData) { - testPlan(261); + testPlan(271); try{ fieldCreate = getFieldCreate(); pvDataCreate = getPVDataCreate();