예제 #1
0
 public void Process()
 {
     var createdAt = DateTime.UtcNow;
     var device = m_context.Devices.Include(dev => dev.Registers).FirstOrDefault(dev => dev.Id == this.DeviceID);
     foreach (var regVal in FeedbacksToProcess)
     {
         var regNumber = regVal.Address.RegisterNumber;
         var register = device.Registers.FirstOrDefault(reg => regNumber == reg.RegisterNumber);
         var feedback = new RegisterFeedback()
         {
             ReadAt = regVal.At,
             Register = register,
             CreatedAt = createdAt
         };
         if (register.SignednessType == Signedness.Signed)
         {
             feedback.setSignedValue((Int16)regVal.Value);
         }
         else if (register.SignednessType == Signedness.Unsigned)
         {
             feedback.setUnsignedValue(regVal.Value);
         }
         m_context.RegisterFeedbacks.Add(feedback);
         alertIfNeeded(feedback, register);
     }
     m_context.SaveChanges();
 }
예제 #2
0
 private void alertIfNeeded(RegisterFeedback feedback, Register register)
 {
     if (register is AnalogRegister)
     {
         var areg = (AnalogRegister)register;
         foreach (var alert in areg.Alerts)
         {
             checkAnalogAlert(alert, feedback, areg);
         }
     }
     else if (register is StatusRegister)
     {
         var statReg = (StatusRegister)register;
         var statusRegisterBits = statReg.StatusRegisterBits.Where(bit => bit.Enabled);
         foreach (var bit in statusRegisterBits)
         {
             foreach (var alert in bit.Alerts)
             {
                 checkStatusAlert(alert, bit, statReg, feedback);
             }
         }
     }
 }
예제 #3
0
 private void checkAnalogAlert(AnalogRegisterAlert alert, RegisterFeedback feedback, AnalogRegister reg)
 {
     var scaledValue = reg.BuildScaledValue(feedback);
     switch (alert.Type)
     {
         case AnalogRegisterAlertType.GreaterThan:
             if (!alert.Alerted && scaledValue > alert.Value)
             {
                 alert.Alerted = true;
                 m_context.SaveChanges();
                 sendEmail(alert.EmailSubject, buildAnalogBody(alert, reg, scaledValue), alert.getEmailsList());
             }
             else if (alert.Alerted && scaledValue < alert.Value)
             {
                 alert.Alerted = false;
                 m_context.SaveChanges();
                 sendEmail(alert.EmailSubject, buildAnalogBody(alert, reg, scaledValue), alert.getEmailsList());
             }
             break;
         case AnalogRegisterAlertType.LessThan:
             if (!alert.Alerted && scaledValue < alert.Value)
             {
                 alert.Alerted = true;
                 m_context.SaveChanges();
                 sendEmail(alert.EmailSubject, buildAnalogBody(alert, reg, scaledValue), alert.getEmailsList());
             }
             else if (alert.Alerted && scaledValue > alert.Value)
             {
                 alert.Alerted = false;
                 m_context.SaveChanges();
                 sendEmail(alert.EmailSubject, buildAnalogBody(alert, reg, scaledValue), alert.getEmailsList());
             }
             break;
         case AnalogRegisterAlertType.EqualTo:
             if (!alert.Alerted && scaledValue == alert.Value)
             {
                 alert.Alerted = true;
                 m_context.SaveChanges();
                 sendEmail(alert.EmailSubject, buildAnalogBody(alert, reg, scaledValue), alert.getEmailsList());
             }
             else if (alert.Alerted && scaledValue != alert.Value)
             {
                 alert.Alerted = false;
                 m_context.SaveChanges();
                 sendEmail(alert.EmailSubject, buildAnalogBody(alert, reg, scaledValue), alert.getEmailsList());
             }
             break;
         default:
             break;
     }
 }
예제 #4
0
 private void checkStatusAlert(StatusRegisterBitAlert alert, StatusRegisterBit bit, StatusRegister register, RegisterFeedback feedback)
 {
     var isBitSet = bit.IsBitSet(register, feedback);
     var alarmAlerted = alert.Alerted;
     if (bit.ActiveType == ActiveType.ActiveHigh)
     {
         if (!alarmAlerted && isBitSet)
         {
             alert.Alerted = true;
             m_context.SaveChanges();
             sendEmail(alert.EmailSubject, buildStatusBody(alert, bit, register), alert.getEmailsList());
         }
         else if (alarmAlerted && !isBitSet)
         {
             alert.Alerted = false;
             m_context.SaveChanges();
             sendEmail(alert.EmailSubject, buildStatusBody(alert, bit, register), alert.getEmailsList());
         }
     }
     else if (bit.ActiveType == ActiveType.ActiveLow)
     {
         if (!alarmAlerted && !isBitSet)
         {
             alert.Alerted = true;
             m_context.SaveChanges();
             sendEmail(alert.EmailSubject, buildStatusBody(alert, bit, register), alert.getEmailsList());
         }
         else if (alarmAlerted && isBitSet)
         {
             alert.Alerted = false;
             m_context.SaveChanges();
             sendEmail(alert.EmailSubject, buildStatusBody(alert, bit, register), alert.getEmailsList());
         }
     }
 }
예제 #5
0
 public StatusRegisterFeedbackBitValue(RegisterFeedback feedback, StatusRegisterBit bit, StatusRegister reg)
 {
     this.Reg = reg;
     this.Feedback = feedback;
     this.Bit = bit;
     this.Value = this.Bit.IsBitSet(reg, feedback);
 }