// created by sudhir on 30.12.2017 // worker thread completed stuff void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { addLinesToConsole("Finished fetching data"); object res = e.Result; Dictionary <object, List <PMUDataStructure> > parsedData = (Dictionary <object, List <PMUDataStructure> >)res.GetType().GetProperty("parsedData").GetValue(res, null); List <int> measurementIDs = (List <int>)res.GetType().GetProperty("measurementIDs").GetValue(res, null); List <string> measurementNames = (List <string>)res.GetType().GetProperty("measurementNames").GetValue(res, null); int dataRate = (int)res.GetType().GetProperty("dataRate").GetValue(res, null); // SeriesCollection = new SeriesCollection(); SeriesCollection.Clear(); PMUMeasDataLists lists; // check if we have atleast one measurement if (measurementIDs.Count > 0 && parsedData != null) { // lets keep step as 1 minute. Todo change step as per the plot preferences. Step = dataRate; // get 1st list and add to SeriesCollection lists = _historyAdapter.GetDataOfMeasId(parsedData, (uint)measurementIDs.ElementAt(0), true); timeStamps_ = new List <DateTime>(lists.pmuTimeStamps); SeriesCollection.Add(new LineSeries() { Title = measurementNames.ElementAt(0) + "_" + measurementIDs.ElementAt(0).ToString(), Values = new ChartValues <float>(lists.pmuVals), PointGeometry = null, Fill = Brushes.Transparent, StrokeThickness = 1, LineSmoothness = 0 }); // get the data of remaining measurements and add to SeriesCollection for (int i = 1; i < measurementIDs.Count; i++) { lists = _historyAdapter.GetDataOfMeasId(parsedData, (uint)measurementIDs.ElementAt(i), true); SeriesCollection.Add(new LineSeries() { Title = measurementNames.ElementAt(i).ToString() + "_" + measurementIDs.ElementAt(i).ToString(), Values = new ChartValues <float>(lists.pmuVals), PointGeometry = null, Fill = Brushes.Transparent, StrokeThickness = 1, LineSmoothness = 0 }); } addLinesToConsole("Viola! Finished plotting"); } else if (parsedData == null) { addLinesToConsole("Unable to parse the fetched data..."); } else if (measurementIDs.Count == 0) { addLinesToConsole("No measurement Ids to plot..."); } }
// worker thread background stuff // Todo update immediately on the chart after the piecewise fetch void Worker_DoWork(object sender, DoWorkEventArgs e) { // todo refer template manager for for doing the piecewise fetch object argument = e.Argument; int dataRate = (int)argument.GetType().GetProperty("dataRate").GetValue(argument, null); DateTime startTime = (DateTime)argument.GetType().GetProperty("startTime").GetValue(argument, null); DateTime endTime = (DateTime)argument.GetType().GetProperty("endTime").GetValue(argument, null); List <int> measurementIDs = (List <int>)argument.GetType().GetProperty("measurementIDs").GetValue(argument, null); List <string> measurementNames = (List <string>)argument.GetType().GetProperty("measurementNames").GetValue(argument, null); VariableTime fetchWindow = (VariableTime)argument.GetType().GetProperty("fetchWindow").GetValue(argument, null); if (measurementIDs.Count == 0) { object nullVal = null; e.Result = new { measurementsData = nullVal, startTime = startTime, endTime = endTime, dataRate = dataRate, measurementIDs = measurementIDs, measurementNames = measurementNames, isSuccess = false, errorMsg = "Number of measurements are zero..." }; return; } ConfigurationManager _configManager = new ConfigurationManager(); _configManager.Initialize(); HistoryDataAdapter _historyAdapter = new HistoryDataAdapter(); _historyAdapter.Initialize(_configManager); if (dataRate <= 0 || dataRate > 25) { // default dataRate of PMU dataRate = 25; } int numWindows = 1; // find the number of seconds in a fetch window //stub int reportFetchWindowSecs = (int)(fetchWindow.hours * 60 * 60 + fetchWindow.mins * 60 + fetchWindow.secs); if (reportFetchWindowSecs <= 0) { numWindows = 1; reportFetchWindowSecs = Convert.ToInt32(Math.Ceiling((endTime - startTime).TotalSeconds)); } else { // find the number of fetch windows as Ceil(Fetchspan/windowspan) int reportfetchSpanSecs = Convert.ToInt32(Math.Ceiling((endTime - startTime).TotalSeconds)); numWindows = reportfetchSpanSecs / reportFetchWindowSecs; } DateTime fetchEndTime = startTime; Dictionary <object, List <PMUDataStructure> > parsedData; List <PMUMeasDataLists> measurementsData = new List <PMUMeasDataLists>(); for (int window = 0; window < numWindows; window++) { // fetch and update for ith window DateTime fetchStartTime = fetchEndTime; fetchEndTime = fetchStartTime.AddSeconds(reportFetchWindowSecs); if (fetchEndTime > endTime) { fetchEndTime = endTime; } // get the data of all measurementIds for the window parsedData = _historyAdapter.GetData(fetchStartTime, fetchEndTime, measurementIDs, true, false, dataRate); // check if we have atleast one measurement if (measurementIDs.Count > 0 && parsedData != null) { // get the data of measurements and add to List for (int i = 0; i < measurementIDs.Count; i++) { PMUMeasDataLists measurementData; measurementData = _historyAdapter.GetDataOfMeasId(parsedData, (uint)measurementIDs.ElementAt(i), true); if (window == 0) { measurementsData.Add(measurementData); } else { measurementsData.ElementAt(i).pmuQualities.AddRange(measurementData.pmuQualities); measurementsData.ElementAt(i).pmuTimeStamps.AddRange(measurementData.pmuTimeStamps); measurementsData.ElementAt(i).pmuVals.AddRange(measurementData.pmuVals); } } } else { // we didnot get the required result e.Result = new { measurementsData = measurementsData, startTime = startTime, endTime = endTime, dataRate = dataRate, measurementIDs = measurementIDs, measurementNames = measurementNames, isSuccess = false, errorMsg = "Unable to parse data..." }; return; } (sender as BackgroundWorker).ReportProgress(window, new { numWindows = numWindows }); } e.Result = new { measurementsData = measurementsData, startTime = startTime, endTime = endTime, dataRate = dataRate, measurementIDs = measurementIDs, measurementNames = measurementNames, isSuccess = true, errorMsg = "" }; }