#include "baciAlarmPattern.h" #include "baciAlarm_T.h" #include "baciAlarm_T.i" #include #include using namespace baci; AlarmEventStrategyPattern::AlarmEventStrategyPattern(ROpatternImpl * property, EventDispatcher * eventDispatcher): AlarmEventStrategyDisc(property, eventDispatcher), patternSize_m(sizeof(ACS::pattern)*8) { // setting lastValue to NOT of alarm_trigger will trigger alarms at the first check lastValue_m = ~(property_mp->alarm_trigger()); }; AlarmEventStrategyPattern::AlarmEventStrategyPattern(Callback_ptr callback_p, const CBDescIn& descIn, const ACS::TimeInterval& interval, ROpatternImpl * property, EventDispatcher * eventDispatcher) : AlarmEventStrategyDisc(callback_p, descIn, interval, property, eventDispatcher), patternSize_m(sizeof(ACS::pattern)*8) { // setting lastValue to NOT of alarm_trigger will trigger alarms at the first check lastValue_m = ~(property_mp->alarm_trigger()); }; void AlarmEventStrategyPattern::check(BACIValue &val, const ACSErr::Completion & c, const ACS::CBDescOut & desc ) { ACE_UNUSED_ARG(c); ACS::pattern value = val.getValue(static_cast(0)); // first we just check if the value has been changed since last time if (value!=lastValue_m) { // here we read the values every time! This can be done just once in ctor, but what if values in CDB change alarmMask_m = property_mp->alarm_mask(); alarmTrigger_m = property_mp->alarm_trigger(); ACS::pattern tmpVal = value; // temporary storage of the value for(bitPos_m=0; bitPos_malarm_raised(value, c, desc); succeeded(); } else { //here should be PatternAlarmCleared::ClearedBit[bitPos_m]Completion // ... but would be too complicated to implement Completion c = PatternAlarmCleared::ClearedBit0Completion(); c.code = bitPos_m; // code contains bit position callback_mp->alarm_cleared(value, c, desc); succeeded(); }//if-else }//if // shift to the next bit value >>= 1; lastValue_m >>= 1; alarmMask_m >>= 1; alarmTrigger_m >>= 1; }//for lastValue_m = tmpVal; }//if }//check