private void ComboBoxMeasurement_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (ComboBoxMeasurement.Items.Count > 0) { DataModelMeasurement selectedMeasurement = (DataModelMeasurement)ComboBoxMeasurement.SelectedItem; if (selectedMeasurement != null) { m_signalID = selectedMeasurement.SignalID.ToString(); if (selectedMeasurement.SignalSuffix == "PA") { ChartPlotterDynamic.Visible = DataRect.Create(0, -180, m_numberOfPointsToPlot, 180); } else if (selectedMeasurement.SignalSuffix == "FQ") { double frequencyMin = Convert.ToDouble(IsolatedStorageManager.ReadFromIsolatedStorage("FrequencyRangeMin")); double frequencyMax = Convert.ToDouble(IsolatedStorageManager.ReadFromIsolatedStorage("FrequencyRangeMax")); ChartPlotterDynamic.Visible = DataRect.Create(0, Math.Min(frequencyMin, frequencyMax), m_numberOfPointsToPlot, Math.Max(frequencyMin, frequencyMax)); } } } else { m_signalID = string.Empty; } SubscribeUnsynchronizedData(); }
private void LoadComboBoxMeasurementAsync() { int selectedDeviceID = ((KeyValuePair <int, string>)ComboBoxDevice.SelectedItem).Key; Thread t = new Thread(() => { ObservableCollection <Measurement> measurements = Measurement.Load(null, selectedDeviceID); ObservableCollection <Measurement> itemsSource = new ObservableCollection <Measurement>(measurements.Where(m => m.SignalSuffix == "PA" || m.SignalSuffix == "FQ")); Dispatcher.BeginInvoke(new Action(() => { ComboBoxMeasurement.ItemsSource = itemsSource; if (Application.Current.Resources.Contains("SelectedMeasurement_Home") && (int)Application.Current.Resources["SelectedMeasurement_Home"] != -1) { ComboBoxMeasurement.SelectedIndex = (int)Application.Current.Resources["SelectedMeasurement_Home"]; } else { ComboBoxMeasurement.SelectedIndex = 0; } })); }); t.IsBackground = true; t.Start(); }
public void RemoveSubscribedMeasurements(ICollection <Guid> measurementIDs) { ObservableCollection <int> deviceIDsForMeasurementsToBeAdded = new ObservableCollection <int>(); ObservableCollection <DataModelMeasurement> measurementsToBeRemoved; //If All Devices is not selected on the screen and a specific device is selected then we will just initialize that device. //Otherwise, maintain a list of unique device ids for which measurements are being subscribed and initialize all of them. if (CurrentDevice.Key > 0) { deviceIDsForMeasurementsToBeAdded.Add(CurrentDevice.Key); } if (measurementIDs != null && measurementIDs.Count > 0) { Mouse.OverrideCursor = Cursors.Wait; AdoDataConnection database = new AdoDataConnection(CommonFunctions.DefaultSettingsCategory); try { measurementsToBeRemoved = DataModelMeasurement.LoadFromKeys(database, measurementIDs.ToList()); foreach (DataModelMeasurement measurement in measurementsToBeRemoved) { measurement.Subscribed = false; DataModelMeasurement.Save(database, measurement); if (CurrentDevice.Key == 0 && measurement.DeviceID != null) { if (!deviceIDsForMeasurementsToBeAdded.Contains((int)measurement.DeviceID)) { deviceIDsForMeasurementsToBeAdded.Add((int)measurement.DeviceID); } } } if (SubscriptionChanged != null) { SubscriptionChanged(this, null); } if (deviceIDsForMeasurementsToBeAdded.Count > 0) { ThreadPool.QueueUserWorkItem(InitializeDeviceConnection, deviceIDsForMeasurementsToBeAdded); } } catch (Exception ex) { Popup("ERROR: " + ex.Message, "Unsubscribe Measurements", MessageBoxImage.Error); } finally { if (database != null) { database.Dispose(); } Mouse.OverrideCursor = null; } } }
private void ButtonMeasurement_Click(object sender, RoutedEventArgs e) { DependencyObject obj = sender as DependencyObject; TreeViewItem item; RealTimeMeasurement realTimeMeasurement; Measurement measurement; PhasorMeasurementUserControl phasorMeasurementUserControl; while ((object)obj != null && obj.GetType() != typeof(TreeViewItem)) { obj = VisualTreeHelper.GetParent(obj); } item = (TreeViewItem)obj; realTimeMeasurement = (RealTimeMeasurement)item?.DataContext; measurement = Measurement.GetMeasurement(null, $"WHERE SignalReference = '{realTimeMeasurement?.SignalReference}'"); if ((object)measurement != null && measurement.DeviceID.HasValue) { phasorMeasurementUserControl = CommonFunctions.LoadUserControl("Manage Measurements for " + measurement.DeviceAcronym, typeof(PhasorMeasurementUserControl), (int)measurement.DeviceID) as PhasorMeasurementUserControl; if (phasorMeasurementUserControl != null) { ((PhasorMeasurements)phasorMeasurementUserControl.DataContext).CurrentItem = measurement; } } }
private void ComboBoxDevice_SelectionChanged(object sender, SelectionChangedEventArgs e) { ObservableCollection <DataModelMeasurement> measurements = DataModelMeasurement.Load(null, ((KeyValuePair <int, string>)ComboBoxDevice.SelectedItem).Key); ComboBoxMeasurement.ItemsSource = new ObservableCollection <DataModelMeasurement>(measurements.Where(m => m.SignalSuffix == "PA" || m.SignalSuffix == "FQ")); if (ComboBoxMeasurement.Items.Count > 0) { ComboBoxMeasurement.SelectedIndex = 0; } }
// Attempt to get measurement name from signal ID private string GetMeasurementName(Guid signalID) { DataModelMeasurement measurement = CurrentItem.AvailableMeasurements.FirstOrDefault(m => m.SignalID == signalID); if ((object)measurement != null) { return(string.Format("{0} [{1}:{2}]", measurement.PointTag, measurement.HistorianAcronym, measurement.PointID)); } return(signalID.ToString()); }
// Attempt to get measurement name from signal ID private string GetMeasurementName(Guid signalID) { DataModelMeasurement measurement = DataModelMeasurement.GetMeasurement(null, signalID); if ((object)measurement != null) { return(string.Format("{0} [{1}:{2}]", measurement.PointTag, measurement.HistorianAcronym, measurement.PointID)); } return(signalID.ToString()); }
private void ButtonMeasurement_Click(object sender, RoutedEventArgs e) { Measurement measurement = Measurement.GetMeasurement(null, "WHERE SignalReference = '" + ((Button)sender).Content + "'"); if (measurement.DeviceID.HasValue) { PhasorMeasurementUserControl phasorMeasurementUserControl = CommonFunctions.LoadUserControl("Manage Measurements for " + measurement.DeviceAcronym, typeof(PhasorMeasurementUserControl), (int)measurement.DeviceID) as PhasorMeasurementUserControl; if (phasorMeasurementUserControl != null) { ((PhasorMeasurements)phasorMeasurementUserControl.DataContext).CurrentItem = measurement; } } }
private void ButtonAddMore_Click(object sender, RoutedEventArgs e) { IEnumerable <Measurement> selectedMeasurements; ObservableCollection <Measurement> addedMeasurements; // Determine which of the selected measurements have been added to the output stream measurements selectedMeasurements = Measurement.LoadFromKeys(null, MeasurementPager.SelectedMeasurements.ToList()); addedMeasurements = new ObservableCollection <Measurement>(selectedMeasurements); // Add measurements to output stream measurements OutputStreamMeasurement.AddMeasurements(null, m_outputStreamID, addedMeasurements); m_dataContext = new OutputStreamMeasurements(m_outputStreamID, 23); this.DataContext = m_dataContext; PopupAddMore.IsOpen = false; }
private void ComboBoxMeasurement_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (ComboBoxMeasurement.Items.Count > 0) { m_selectedMeasurement = (Measurement)ComboBoxMeasurement.SelectedItem; // Capture's the Selected index of measurement Combo Box if (Application.Current.Resources.Contains("SelectedMeasurement_Home")) { Application.Current.Resources.Remove("SelectedMeasurement_Home"); Application.Current.Resources.Add("SelectedMeasurement_Home", ComboBoxMeasurement.SelectedIndex); } else { Application.Current.Resources.Add("SelectedMeasurement_Home", ComboBoxMeasurement.SelectedIndex); } if (m_selectedMeasurement != null) { m_signalID = m_selectedMeasurement.SignalID.ToString(); if (m_selectedMeasurement.SignalSuffix == "PA") { ChartPlotterDynamic.Visible = DataRect.Create(0, -180, m_numberOfPointsToPlot, 180); } else if (m_selectedMeasurement.SignalSuffix == "FQ") { double frequencyMin = Convert.ToDouble(IsolatedStorageManager.ReadFromIsolatedStorage("FrequencyRangeMin")); double frequencyMax = Convert.ToDouble(IsolatedStorageManager.ReadFromIsolatedStorage("FrequencyRangeMax")); ChartPlotterDynamic.Visible = DataRect.Create(0, Math.Min(frequencyMin, frequencyMax), m_numberOfPointsToPlot, Math.Max(frequencyMin, frequencyMax)); } } } else { m_signalID = string.Empty; } SubscribeUnsynchronizedData(); }
/// <summary> /// Adds multiple devices to output steam. /// </summary> /// <param name="database"><see cref="AdoDataConnection"/> to connection to database.</param> /// <param name="outputStreamID">ID of the output stream to which devices needs to be added.</param> /// <param name="devices">Collection of devices to be added.</param> /// <param name="addDigitals">Boolean flag indicating if analogs should be added.</param> /// <param name="addAnalogs">Boolean flag indicating if digirals should be added.</param> /// <returns>String, for display use, indicating success.</returns> public static string AddDevices(AdoDataConnection database, int outputStreamID, ObservableCollection <Device> devices, bool addDigitals, bool addAnalogs) { bool createdConnection = false; try { createdConnection = CreateConnection(ref database); foreach (Device device in devices) { OutputStreamDevice outputStreamDevice = new OutputStreamDevice(); outputStreamDevice.NodeID = device.NodeID; outputStreamDevice.AdapterID = outputStreamID; outputStreamDevice.Acronym = device.Acronym.Substring(device.Acronym.LastIndexOf("!", StringComparison.Ordinal) + 1); outputStreamDevice.BpaAcronym = string.Empty; outputStreamDevice.Name = device.Name; outputStreamDevice.LoadOrder = device.LoadOrder; outputStreamDevice.Enabled = true; outputStreamDevice.IDCode = device.AccessID; Save(database, outputStreamDevice); outputStreamDevice = GetOutputStreamDevice(database, "WHERE Acronym = '" + outputStreamDevice.Acronym + "' AND AdapterID = " + outputStreamID); if ((object)outputStreamDevice != null) { IList <int> keys = Phasor.LoadKeys(database, device.ID); ObservableCollection <Phasor> phasors = Phasor.Load(database, keys); foreach (Phasor phasor in phasors) { OutputStreamDevicePhasor outputStreamDevicePhasor = new OutputStreamDevicePhasor(); outputStreamDevicePhasor.NodeID = device.NodeID; outputStreamDevicePhasor.OutputStreamDeviceID = outputStreamDevice.ID; outputStreamDevicePhasor.Label = phasor.Label; outputStreamDevicePhasor.Type = phasor.Type; outputStreamDevicePhasor.Phase = phasor.Phase; outputStreamDevicePhasor.LoadOrder = phasor.SourceIndex; OutputStreamDevicePhasor.Save(database, outputStreamDevicePhasor); } ObservableCollection <Measurement> measurements = Measurement.Load(database, device.ID); int analogIndex = 0; foreach (Measurement measurement in measurements) { if (measurement.SignalAcronym != "STAT" && measurement.SignalAcronym != "QUAL") { measurement.SignalReference = measurement.SignalReference.Substring(measurement.SignalReference.LastIndexOf("!", StringComparison.Ordinal) + 1); if ((measurement.SignalAcronym != "ALOG" && measurement.SignalAcronym != "DIGI") || (measurement.SignalAcronym == "ALOG" && addAnalogs) || (measurement.SignalAcronym == "DIGI" && addDigitals)) { OutputStreamMeasurement outputStreamMeasurement = new OutputStreamMeasurement(); outputStreamMeasurement.NodeID = device.NodeID; outputStreamMeasurement.AdapterID = outputStreamID; outputStreamMeasurement.HistorianID = measurement.HistorianID; outputStreamMeasurement.PointID = measurement.PointID; outputStreamMeasurement.SignalReference = measurement.SignalReference; OutputStreamMeasurement.Save(database, outputStreamMeasurement); } if (addAnalogs && measurement.SignalAcronym == "ALOG") { OutputStreamDeviceAnalog outputStreamDeviceAnalog = new OutputStreamDeviceAnalog(); outputStreamDeviceAnalog.NodeID = device.NodeID; outputStreamDeviceAnalog.OutputStreamDeviceID = outputStreamDevice.ID; outputStreamDeviceAnalog.Label = string.IsNullOrEmpty(measurement.AlternateTag) ? device.Acronym.Length > 12 ? device.Acronym.Substring(0, 12) + ":A" + analogIndex : device.Acronym + ":A" + analogIndex : measurement.AlternateTag; // measurement.PointTag; int charIndex = measurement.SignalReference.LastIndexOf("-", StringComparison.Ordinal); int signalIndex; if (charIndex >= 0 && charIndex + 3 < measurement.SignalReference.Length && int.TryParse(measurement.SignalReference.Substring(charIndex + 3), out signalIndex)) { outputStreamDeviceAnalog.LoadOrder = signalIndex; } else { outputStreamDeviceAnalog.LoadOrder = 999; } OutputStreamDeviceAnalog.Save(database, outputStreamDeviceAnalog); analogIndex++; } else if (addDigitals && measurement.SignalAcronym == "DIGI") { OutputStreamDeviceDigital outputStreamDeviceDigital = new OutputStreamDeviceDigital(); outputStreamDeviceDigital.NodeID = device.NodeID; outputStreamDeviceDigital.OutputStreamDeviceID = outputStreamDevice.ID; outputStreamDeviceDigital.Label = string.IsNullOrEmpty(measurement.AlternateTag) ? DefaultDigitalLabel : measurement.AlternateTag; // measurement.PointTag; int charIndex = measurement.SignalReference.LastIndexOf("-", StringComparison.Ordinal); int signalIndex; if (charIndex >= 0 && charIndex + 3 < measurement.SignalReference.Length && int.TryParse(measurement.SignalReference.Substring(charIndex + 3), out signalIndex)) { outputStreamDeviceDigital.LoadOrder = signalIndex; } else { outputStreamDeviceDigital.LoadOrder = 999; } OutputStreamDeviceDigital.Save(database, outputStreamDeviceDigital); } } } } } return("Output Stream Device(s) added successfully!"); } finally { if (createdConnection && database != null) { database.Dispose(); } } }
/// <summary> /// Saves <see cref="Device"/> information to database along with analogs and digital measurements if requested.. /// </summary> /// <param name="database"><see cref="AdoDataConnection"/> to connection to database.</param> /// <param name="device">Information about <see cref="Device"/>.</param> /// <param name="notifyService">Boolean value to notify service if needed.</param> /// <param name="digitalCount">Number of digital measurements to add.</param> /// <param name="analogCount">Number of analog measurements to add.</param> /// <param name="digitalLabels">Collection of digital labels associated with a device in configuration frame.</param> /// <param name="analogLabels">Collection of analog labels associated with a device in configuration frame.</param> /// <returns>String, for display use, indicating success.</returns> public static string SaveWithAnalogsDigitals(AdoDataConnection database, Device device, bool notifyService, int digitalCount, int analogCount, List<string> digitalLabels = null, List<string> analogLabels = null) { bool createdConnection = false; string query; try { Device oldDevice = null; createdConnection = CreateConnection(ref database); object nodeID; if (device.NodeID == Guid.Empty) nodeID = database.CurrentNodeID(); else nodeID = database.Guid(device.NodeID); if (device.ID == 0) { query = database.ParameterizedQueryString("INSERT INTO Device (NodeID, ParentID, UniqueID, Acronym, Name, IsConcentrator, CompanyID, HistorianID, AccessID, VendorDeviceID, " + "ProtocolID, Longitude, Latitude, InterconnectionID, ConnectionString, TimeZone, FramesPerSecond, TimeAdjustmentTicks, DataLossInterval, ContactList, " + "MeasuredLines, LoadOrder, Enabled, AllowedParsingExceptions, ParsingExceptionWindow, DelayedConnectionInterval, AllowUseOfCachedConfiguration, " + "AutoStartDataParsingSequence, SkipDisableRealTimeData, MeasurementReportingInterval, ConnectOndemand, UpdatedBy, UpdatedOn, CreatedBy, CreatedOn) Values " + "({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, {20}, {21}, {22}, {23}, {24}, {25}, " + "{26}, {27}, {28}, {29}, {30}, {31}, {32}, {33}, {34})", "nodeID", "parentID", "uniqueID", "acronym", "name", "isConcentrator", "companyID", "historianID", "accessID", "vendorDeviceID", "protocolID", "longitude", "latitude", "interconnectionID", "connectionString", "timezone", "framesPerSecond", "timeAdjustmentTicks", "dataLossInterval", "contactList", "measuredLines", "loadOrder", "enabled", "allowedParsingExceptions", "parsingExceptionWindow", "delayedConnectionInterval", "allowUseOfCachedConfiguration", "autoStartDataParsingSequence", "skipDisableRealTimeData", "measurementReportingInterval", "connectOndemand", "updatedBy", "updatedOn", "createdBy", "createdOn"); database.Connection.ExecuteNonQuery(query, DefaultTimeout, nodeID, device.ParentID.ToNotNull(), database.Guid(Guid.NewGuid()), device.Acronym.Replace(" ", "").ToUpper(), device.Name.ToNotNull(), database.Bool(device.IsConcentrator), device.CompanyID.ToNotNull(), device.HistorianID.ToNotNull(), device.AccessID, device.VendorDeviceID.ToNotNull(), device.ProtocolID.ToNotNull(), device.Longitude.ToNotNull(), device.Latitude.ToNotNull(), device.InterconnectionID.ToNotNull(), BuildConnectionString(device), device.TimeZone.ToNotNull(), device.FramesPerSecond ?? 30, device.TimeAdjustmentTicks, device.DataLossInterval, device.ContactList.ToNotNull(), device.MeasuredLines.ToNotNull(), device.LoadOrder, database.Bool(device.Enabled), device.AllowedParsingExceptions, device.ParsingExceptionWindow, device.DelayedConnectionInterval, database.Bool(device.AllowUseOfCachedConfiguration), database.Bool(device.AutoStartDataParsingSequence), database.Bool(device.SkipDisableRealTimeData), device.MeasurementReportingInterval, database.Bool(device.ConnectOnDemand), CommonFunctions.CurrentUser, database.UtcNow, CommonFunctions.CurrentUser, database.UtcNow); } else { oldDevice = GetDevice(database, " WHERE ID = " + device.ID); query = database.ParameterizedQueryString("UPDATE Device SET NodeID = {0}, ParentID = {1}, UniqueID = {2}, Acronym = {3}, Name = {4}, " + "IsConcentrator = {5}, CompanyID = {6}, HistorianID = {7}, AccessID = {8}, VendorDeviceID = {9}, ProtocolID = {10}, Longitude = {11}, " + "Latitude = {12}, InterconnectionID = {13}, ConnectionString = {14}, TimeZone = {15}, FramesPerSecond = {16}, TimeAdjustmentTicks = {17}, " + "DataLossInterval = {18}, ContactList = {19}, MeasuredLines = {20}, LoadOrder = {21}, Enabled = {22}, AllowedParsingExceptions = {23}, " + "ParsingExceptionWindow = {24}, DelayedConnectionInterval = {25}, AllowUseOfCachedConfiguration = {26}, AutoStartDataParsingSequence = {27}, " + "SkipDisableRealTimeData = {28}, MeasurementReportingInterval = {29}, ConnectOnDemand = {30}, UpdatedBy = {31}, UpdatedOn = {32} WHERE ID = {33}", "nodeID", "parentID", "uniqueID", "acronym", "name", "isConcentrator", "companyID", "historianID", "accessID", "vendorDeviceID", "protocolID", "longitude", "latitude", "interconnectionID", "connectionString", "timezone", "framesPerSecond", "timeAdjustmentTicks", "dataLossInterval", "contactList", "measuredLines", "loadOrder", "enabled", "allowedParsingExceptions", "parsingExceptionWindow", "delayedConnectionInterval", "allowUseOfCachedConfiguration", "autoStartDataParsingSequence", "skipDisableRealTimeData", "measurementReportingInterval", "connectOnDemand", "updatedBy", "updatedOn", "id"); database.Connection.ExecuteNonQuery(query, DefaultTimeout, nodeID, device.ParentID.ToNotNull(), database.Guid(device.UniqueID), device.Acronym.Replace(" ", "").ToUpper(), device.Name.ToNotNull(), database.Bool(device.IsConcentrator), device.CompanyID.ToNotNull(), device.HistorianID.ToNotNull(), device.AccessID, device.VendorDeviceID.ToNotNull(), device.ProtocolID.ToNotNull(), device.Longitude.ToNotNull(), device.Latitude.ToNotNull(), device.InterconnectionID.ToNotNull(), BuildConnectionString(device), device.TimeZone.ToNotNull(), device.FramesPerSecond ?? 30, device.TimeAdjustmentTicks, device.DataLossInterval, device.ContactList.ToNotNull(), device.MeasuredLines.ToNotNull(), device.LoadOrder, database.Bool(device.Enabled), device.AllowedParsingExceptions, device.ParsingExceptionWindow, device.DelayedConnectionInterval, database.Bool(device.AllowUseOfCachedConfiguration), database.Bool(device.AutoStartDataParsingSequence), database.Bool(device.SkipDisableRealTimeData), device.MeasurementReportingInterval, database.Bool(device.ConnectOnDemand), CommonFunctions.CurrentUser, database.UtcNow, device.ID); } Device savedDevice = GetDevice(database, "WHERE Acronym = '" + device.Acronym.Replace(" ", "").ToUpper() + "'"); if ((object)savedDevice == null) return "Device information saved successfully but failed to create measurements"; // Determine if device is using a phasor protocol bool deviceIsUsingPhasorProtocol = (string.Compare(savedDevice.ProtocolCategory, "Phasor", StringComparison.OrdinalIgnoreCase) == 0); // Add default measurements for non-concentrator devices when device protocol category is Phasor if (!savedDevice.IsConcentrator && deviceIsUsingPhasorProtocol) { // Setup and/or validate default signals associated with non-concentrator devices (e.g., directly connected PMUs or PMUs in a concentrator) foreach (TimeSeries.UI.DataModels.SignalType signal in TimeSeries.UI.DataModels.SignalType.GetPmuSignalTypes()) { Measurement measurement; if (signal.Suffix == "AV" && analogCount > 0) { for (int i = 1; i <= analogCount; i++) { measurement = Measurement.GetMeasurement(database, "WHERE DeviceID = " + savedDevice.ID + " AND SignalReference = '" + savedDevice.Acronym + "-AV" + i + "'"); if ((object)measurement == null) { measurement = new Measurement(); measurement.DeviceID = savedDevice.ID; measurement.HistorianID = savedDevice.HistorianID; measurement.PointTag = CommonPhasorServices.CreatePointTag(savedDevice.CompanyAcronym, savedDevice.Acronym, savedDevice.VendorAcronym, "ALOG", i); measurement.SignalReference = savedDevice.Acronym + "-AV" + i; measurement.Description = savedDevice.Name + (string.IsNullOrWhiteSpace(savedDevice.VendorDeviceName) ? "" : " " + savedDevice.VendorDeviceName) + " Analog Value " + i; measurement.SignalTypeID = signal.ID; measurement.PhasorSourceIndex = (int?)null; measurement.Enabled = true; if ((object)analogLabels != null && (object)analogLabels[i - 1] != null) measurement.AlternateTag = analogLabels[i - 1]; Measurement.Save(database, measurement); } else if (measurement.SignalTypeID != signal.ID) { // Correct signal type if it has been changed measurement.SignalTypeID = signal.ID; Measurement.Save(database, measurement); } } } else if (signal.Suffix == "DV" && digitalCount > 0) { for (int i = 1; i <= digitalCount; i++) { measurement = Measurement.GetMeasurement(database, "WHERE DeviceID = " + savedDevice.ID + " AND SignalReference = '" + savedDevice.Acronym + "-DV" + i + "'"); if ((object)measurement == null) { measurement = new Measurement(); measurement.DeviceID = savedDevice.ID; measurement.HistorianID = savedDevice.HistorianID; measurement.PointTag = CommonPhasorServices.CreatePointTag(savedDevice.CompanyAcronym, savedDevice.Acronym, savedDevice.VendorAcronym, "DIGI", i); measurement.SignalReference = savedDevice.Acronym + "-DV" + i; measurement.SignalTypeID = signal.ID; measurement.Description = savedDevice.Name + (string.IsNullOrWhiteSpace(savedDevice.VendorDeviceName) ? "" : " " + savedDevice.VendorDeviceName) + " Digital Value " + i; measurement.PhasorSourceIndex = (int?)null; measurement.Enabled = true; if ((object)digitalLabels != null && (object)digitalLabels[i - 1] != null) measurement.AlternateTag = digitalLabels[i - 1]; Measurement.Save(database, measurement); } else if (measurement.SignalTypeID != signal.ID) { // Correct signal type if it has been changed measurement.SignalTypeID = signal.ID; Measurement.Save(database, measurement); } } } else if (signal.Suffix == "FQ" || signal.Suffix == "DF" || signal.Suffix == "SF") { measurement = Measurement.GetMeasurement(database, "WHERE DeviceID = " + savedDevice.ID + " AND SignalTypeSuffix = '" + signal.Suffix + "'"); if ((object)measurement == null) { measurement = new Measurement(); measurement.DeviceID = savedDevice.ID; measurement.HistorianID = savedDevice.HistorianID; measurement.PointTag = CommonPhasorServices.CreatePointTag(savedDevice.CompanyAcronym, savedDevice.Acronym, savedDevice.VendorAcronym, signal.Acronym); measurement.SignalReference = savedDevice.Acronym + "-" + signal.Suffix; measurement.SignalTypeID = signal.ID; measurement.Description = savedDevice.Name + (string.IsNullOrWhiteSpace(savedDevice.VendorDeviceName) ? "" : " " + savedDevice.VendorDeviceName) + " " + signal.Name; measurement.PhasorSourceIndex = (int?)null; measurement.Enabled = true; Measurement.Save(database, measurement); } // Based on query filter of SignalTypeSuffix, the following will never be true //else if (measurement.SignalTypeID != signal.ID) //{ // // Correct signal type if it has been changed // measurement.SignalTypeID = signal.ID; // Measurement.Save(database, measurement); //} } } } if (device.ID > 0) { if (!device.IsConcentrator) { // For existing non-concentrator devices, call Save on each phasor so that measurements related to those phasors will reflect possible device changes. IList<int> keys = Phasor.LoadKeys(database, device.ID); foreach (Phasor phasor in Phasor.Load(database, keys)) { Phasor.SaveWithoutMeasurementUpdate(database, phasor); } } // Update existing device measurements to reflect possible device changes if ((object)oldDevice != null) { bool companyUpdated = (deviceIsUsingPhasorProtocol && savedDevice.CompanyID != oldDevice.CompanyID); bool deviceRenamed = (deviceIsUsingPhasorProtocol && (string.CompareOrdinal(savedDevice.Acronym, oldDevice.Acronym) != 0 || string.CompareOrdinal(savedDevice.Name, oldDevice.Name) != 0)); bool historianUpdated = (savedDevice.HistorianID != oldDevice.HistorianID); if (companyUpdated || deviceRenamed || historianUpdated) { string companyAcronym = ""; int underScoreIndex; if (companyUpdated) { if (savedDevice.CompanyID.HasValue && !string.IsNullOrWhiteSpace(savedDevice.CompanyAcronym)) companyAcronym = savedDevice.CompanyAcronym; } foreach (Measurement measurement in Measurement.GetMeasurements(database, "WHERE DeviceID = " + oldDevice.ID)) { if (companyUpdated) { // WARNING: This assumes company name is followed by an underscore - this may not be a valid assumption for custom point tag naming conventions underScoreIndex = measurement.PointTag.ToNonNullString().IndexOf('_'); if (underScoreIndex > -1) measurement.PointTag = companyAcronym + measurement.PointTag.Substring(underScoreIndex); } if (deviceRenamed) { measurement.PointTag = measurement.PointTag.Replace(oldDevice.Acronym, savedDevice.Acronym); measurement.SignalReference = measurement.SignalReference.Replace(oldDevice.Acronym, savedDevice.Acronym); measurement.Description = Regex.Replace(measurement.Description.ToNonNullString(), oldDevice.Name, savedDevice.Name, RegexOptions.IgnoreCase); } if (historianUpdated && string.Compare(measurement.HistorianAcronym, "STAT", StringComparison.OrdinalIgnoreCase) != 0) measurement.HistorianID = savedDevice.HistorianID; Measurement.Save(database, measurement); } } // If changing the historian for a concentrator style device - must assume desire to change historian for all children devices if (historianUpdated && device.IsConcentrator) { foreach (Device childDevice in GetDevices(database, "WHERE ParentID = " + device.ID)) { // Recursively call this function for each child device with updated historian which will also fix measurement's historian childDevice.HistorianID = savedDevice.HistorianID; SaveWithAnalogsDigitals(database, childDevice, false, 0, 0); } } } } try { // Notify service about configuration changes made here. if (notifyService) NotifyService(savedDevice); } catch (Exception ex) { return "Device information saved successfully. Failed to send Initialize command to backend service." + Environment.NewLine + ex.Message; } return "Device information saved successfully"; } finally { if (createdConnection && database != null) database.Dispose(); } }
private void ComboBoxMeasurement_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (ComboBoxMeasurement.Items.Count > 0) { m_selectedMeasurement = (Measurement)ComboBoxMeasurement.SelectedItem; // Capture's the Selected index of measurement Combo Box if (Application.Current.Resources.Contains("SelectedMeasurement_Home")) { Application.Current.Resources.Remove("SelectedMeasurement_Home"); Application.Current.Resources.Add("SelectedMeasurement_Home", ComboBoxMeasurement.SelectedIndex); } else Application.Current.Resources.Add("SelectedMeasurement_Home", ComboBoxMeasurement.SelectedIndex); if (m_selectedMeasurement != null) { m_signalID = m_selectedMeasurement.SignalID.ToString(); if (m_selectedMeasurement.SignalSuffix == "PA") ChartPlotterDynamic.Visible = DataRect.Create(0, -180, m_numberOfPointsToPlot, 180); else if (m_selectedMeasurement.SignalSuffix == "FQ") ChartPlotterDynamic.Visible = DataRect.Create(0, Convert.ToDouble(IsolatedStorageManager.ReadFromIsolatedStorage("FrequencyRangeMin")), m_numberOfPointsToPlot, Convert.ToDouble(IsolatedStorageManager.ReadFromIsolatedStorage("FrequencyRangeMax"))); } } else m_signalID = string.Empty; SubscribeUnsynchronizedData(); }