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