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(); }
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); } } } }
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; } }
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()); } } }
public StatusRegisterFeedbackBitValue(RegisterFeedback feedback, StatusRegisterBit bit, StatusRegister reg) { this.Reg = reg; this.Feedback = feedback; this.Bit = bit; this.Value = this.Bit.IsBitSet(reg, feedback); }