18 #define epicsExportSharedSymbols 29 namespace epics {
namespace pvDatabase {
31 ScalarAlarmSupport::~ScalarAlarmSupport()
40 ->setId(
"scalarAlarm_t")
55 ScalarAlarmSupport::ScalarAlarmSupport(
PVRecordPtr const & pvRecord)
57 prevAlarmRange(range_Undefined)
61 bool ScalarAlarmSupport::init(
73 cout <<
"ScalarAlarmSupport for record " << pvRecord->getRecordName()
74 <<
" failed because not numeric scalar\n";
80 pvLowWarningLimit = pvScalarAlarm->getSubField<
PVDouble>(
"lowWarningLimit");
81 pvHighWarningLimit = pvScalarAlarm->getSubField<
PVDouble>(
"highWarningLimit");
82 pvHighAlarmLimit = pvScalarAlarm->getSubField<
PVDouble>(
"highAlarmLimit");
83 pvHysteresis = pvScalarAlarm->getSubField<
PVDouble>(
"hysteresis");
86 || !pvLowAlarmLimit || !pvLowWarningLimit
87 || !pvLowWarningLimit || !pvHighAlarmLimit
90 cout <<
"ScalarAlarmSupport for record " << pvRecord->getRecordName()
91 <<
" failed because pvSupport not a valid scalarAlarm structure\n";
96 requestedValue = convert->toDouble(pvValue);
97 currentValue = requestedValue;
99 setAlarm(pvAlarm,range_Undefined);
103 bool ScalarAlarmSupport::process()
106 double value = convert->toDouble(pvValue);
107 double lowAlarmLimit = pvLowAlarmLimit->get();
108 double lowWarningLimit = pvLowWarningLimit->get();
109 double highWarningLimit = pvHighWarningLimit->get();
110 double highAlarmLimit = pvHighAlarmLimit->get();
111 double hysteresis = pvHysteresis->get();
112 int alarmRange = range_Normal;
113 if(highAlarmLimit>lowAlarmLimit) {
114 if(value>=highAlarmLimit
115 ||(prevAlarmRange==range_Hihi && value>=highAlarmLimit-hysteresis)) {
116 alarmRange = range_Hihi;
117 }
else if(value<=lowAlarmLimit
118 ||(prevAlarmRange==range_Lolo && value<=lowAlarmLimit+hysteresis)) {
119 alarmRange = range_Lolo;
122 if(alarmRange==range_Normal && (highWarningLimit>lowWarningLimit)) {
123 if(value>=highWarningLimit
124 ||(prevAlarmRange==range_High && value>=highWarningLimit-hysteresis)) {
125 alarmRange = range_High;
126 }
else if(value<=lowWarningLimit
127 ||(prevAlarmRange==range_Low && value<=lowWarningLimit+hysteresis)) {
128 alarmRange = range_Low;
131 bool retValue =
false;
132 if(alarmRange!=prevAlarmRange) {
133 setAlarm(pvAlarm,alarmRange);
136 prevAlarmRange = alarmRange;
137 currentValue = value;
141 void ScalarAlarmSupport::reset()
146 void ScalarAlarmSupport::setAlarm(
152 if(!pvAlarm.
attach(pva))
throw std::logic_error(
"bad alarm field");
156 switch (alarmRange) {
161 message =
"major low alarm";
168 message =
"minor low alarm";
179 message =
"minor high alarm";
186 message =
"major high alarm";
193 message =
"invalid alarm";
196 case range_Undefined :
200 message =
"undefined alarm";
207 message =
"bad alarm definition";
FORCE_INLINE std::tr1::shared_ptr< PVField > getSubField(A a)
This class implements introspection object for Scalar.
AlarmSeverity
enum definition of AlarmSeverity
PVScalar is the base class for each scalar field.
Methods for manipulating alarm.
void setMessage(std::string const &value)
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
bool attach(PVFieldPtr const &pvField)
bool set(Alarm const &alarm)
TODO only here because of the Lockable.
std::tr1::shared_ptr< const Structure > StructureConstPtr
std::tr1::shared_ptr< const Scalar > ScalarConstPtr
void setSeverity(AlarmSeverity value)
bool isNumeric(ScalarType type)
Methods for accessing an alarm structure.
Data interface for a structure,.
std::tr1::shared_ptr< PVRecord > PVRecordPtr
std::tr1::shared_ptr< PVStructure > PVStructurePtr
std::tr1::shared_ptr< ScalarAlarmSupport > ScalarAlarmSupportPtr
void setStatus(AlarmStatus value)
AlarmStatus
enum definition of AlarmStatus
Class that holds the data for each possible scalar type.
std::tr1::shared_ptr< PVField > PVFieldPtr
std::tr1::shared_ptr< Convert > ConvertPtr
Base interface for a ScalarAlarmSupport.
static FieldBuilderPtr begin()