You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

StatisticsStrategyConfigurationForm.cs 5.5 kB

9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Net.NetworkInformation;
  6. using System.Windows.Forms;
  7. using Shadowsocks.Controller;
  8. using Shadowsocks.Model;
  9. namespace Shadowsocks.View
  10. {
  11. public partial class StatisticsStrategyConfigurationForm : Form
  12. {
  13. private readonly ShadowsocksController _controller;
  14. private StatisticsStrategyConfiguration _configuration;
  15. private DataTable _dataTable = new DataTable();
  16. private List<string> _servers;
  17. public StatisticsStrategyConfigurationForm(ShadowsocksController controller)
  18. {
  19. if (controller == null) return;
  20. InitializeComponent();
  21. _controller = controller;
  22. _controller.ConfigChanged += (sender, args) => LoadConfiguration();
  23. LoadConfiguration();
  24. Load += (sender, args) => InitData();
  25. }
  26. private void LoadConfiguration()
  27. {
  28. var configs = _controller.GetCurrentConfiguration().configs;
  29. _servers = configs.Select(server => server.FriendlyName()).ToList();
  30. _configuration = _controller.StatisticsConfiguration
  31. ?? new StatisticsStrategyConfiguration();
  32. if (_configuration.Calculations == null)
  33. {
  34. _configuration = new StatisticsStrategyConfiguration();
  35. }
  36. }
  37. private void InitData()
  38. {
  39. bindingConfiguration.Add(_configuration);
  40. foreach (var kv in _configuration.Calculations)
  41. {
  42. var calculation = new CalculationControl(kv.Key, kv.Value);
  43. calculationContainer.Controls.Add(calculation);
  44. }
  45. serverSelector.DataSource = _servers;
  46. _dataTable.Columns.Add("Timestamp", typeof(DateTime));
  47. _dataTable.Columns.Add("Package Loss", typeof(int));
  48. _dataTable.Columns.Add("Ping", typeof(int));
  49. StatisticsChart.Series["Package Loss"].XValueMember = "Timestamp";
  50. StatisticsChart.Series["Package Loss"].YValueMembers = "Package Loss";
  51. StatisticsChart.Series["Ping"].XValueMember = "Timestamp";
  52. StatisticsChart.Series["Ping"].YValueMembers = "Ping";
  53. StatisticsChart.DataSource = _dataTable;
  54. loadChartData();
  55. StatisticsChart.DataBind();
  56. }
  57. private void CancelButton_Click(object sender, EventArgs e)
  58. {
  59. Close();
  60. }
  61. private void OKButton_Click(object sender, EventArgs e)
  62. {
  63. foreach (CalculationControl calculation in calculationContainer.Controls)
  64. {
  65. _configuration.Calculations[calculation.Value] = calculation.Factor;
  66. }
  67. _controller?.SaveStrategyConfigurations(_configuration);
  68. _controller?.UpdateStatisticsConfiguration(StatisticsEnabledCheckBox.Checked);
  69. Close();
  70. }
  71. private void loadChartData()
  72. {
  73. string serverName = _servers[serverSelector.SelectedIndex];
  74. _dataTable.Rows.Clear();
  75. //return directly when no data is usable
  76. if (_controller.availabilityStatistics?.FilteredStatistics == null) return;
  77. List<AvailabilityStatistics.RawStatisticsData> statistics;
  78. if (!_controller.availabilityStatistics.FilteredStatistics.TryGetValue(serverName, out statistics)) return;
  79. IEnumerable<IGrouping<int, AvailabilityStatistics.RawStatisticsData>> dataGroups;
  80. if (allMode.Checked)
  81. {
  82. dataGroups = statistics.GroupBy(data => data.Timestamp.DayOfYear);
  83. StatisticsChart.ChartAreas["DataArea"].AxisX.LabelStyle.Format = "MM/dd/yyyy";
  84. StatisticsChart.ChartAreas["DataArea"].AxisX2.LabelStyle.Format = "MM/dd/yyyy";
  85. }
  86. else
  87. {
  88. dataGroups = statistics.GroupBy(data => data.Timestamp.Hour);
  89. StatisticsChart.ChartAreas["DataArea"].AxisX.LabelStyle.Format = "HH:00";
  90. StatisticsChart.ChartAreas["DataArea"].AxisX2.LabelStyle.Format = "HH:00";
  91. }
  92. var finalData = from dataGroup in dataGroups
  93. orderby dataGroup.Key
  94. select new
  95. {
  96. Timestamp = dataGroup.First().Timestamp,
  97. Ping = (int)dataGroup.Average(data => data.RoundtripTime),
  98. PackageLoss = (int)
  99. (dataGroup.Count(data => data.ICMPStatus.Equals(IPStatus.TimedOut.ToString()))
  100. / (float)dataGroup.Count() * 100)
  101. };
  102. foreach (var data in finalData)
  103. {
  104. _dataTable.Rows.Add(data.Timestamp, data.PackageLoss, data.Ping);
  105. }
  106. StatisticsChart.DataBind();
  107. }
  108. private void serverSelector_SelectedIndexChanged(object sender, EventArgs e)
  109. {
  110. loadChartData();
  111. }
  112. private void chartModeSelector_Enter(object sender, EventArgs e)
  113. {
  114. }
  115. private void dayMode_CheckedChanged(object sender, EventArgs e)
  116. {
  117. loadChartData();
  118. }
  119. private void allMode_CheckedChanged(object sender, EventArgs e)
  120. {
  121. loadChartData();
  122. }
  123. }
  124. }