-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathPCIRangeMonitor.cs
More file actions
116 lines (101 loc) · 3.77 KB
/
PCIRangeMonitor.cs
File metadata and controls
116 lines (101 loc) · 3.77 KB
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using System;
using System.ComponentModel;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using ZenStates.Core;
namespace ZenStatesDebugTool
{
public partial class PCIRangeMonitor : Form
{
private readonly Cpu CPU;
readonly System.Windows.Forms.Timer RefreshTimer = new System.Windows.Forms.Timer();
private readonly BindingList<AddressMonitorItem> list = new BindingList<AddressMonitorItem>();
private readonly uint StartAddress;
private readonly uint EndAddress;
private class AddressMonitorItem
{
public string Address { get; set; }
public string Value { get; set; }
public string ValueFloat { get; set; }
public string ValueBin { get; set; }
}
private BindingList<AddressMonitorItem> RefreshList()
{
BindingList<AddressMonitorItem> l = new BindingList<AddressMonitorItem>();
Thread refreshThread = new Thread(() =>
{
for (var i = StartAddress; i < EndAddress; i += 4)
{
uint value = 0;
CPU.ReadDwordEx(i, ref value);
var floatValue = Convert.ToSingle(value);
//if (floatValue > 1f && floatValue < 2f)
{
l.Add(new AddressMonitorItem
{
Address = $"0x{i:X8}",
Value = $"0x{value:X8}",
ValueFloat = $"{floatValue:F4}",
ValueBin = $"{Convert.ToString(value, 2).PadLeft(32, '0')}"
});
}
}
});
refreshThread.IsBackground = true;
refreshThread.Start();
refreshThread.Join();
return l;
}
private void RefreshData()
{
Thread refreshThread = new Thread(() =>
{
var l = RefreshList();
foreach (var item in list)
{
var newItem = l.FirstOrDefault(x => x.Address == item.Address);
if (newItem != null && item.Value != newItem.Value)
{
item.Value = newItem.Value;
item.ValueFloat = newItem.ValueFloat;
item.ValueBin = newItem.ValueBin;
var rowIndex = list.IndexOf(item);
dataGridViewPCIRange.Rows[rowIndex].DefaultCellStyle.BackColor = System.Drawing.Color.LightGoldenrodYellow;
}
}
dataGridViewPCIRange.Invoke((MethodInvoker)delegate
{
dataGridViewPCIRange.Refresh();
});
});
refreshThread.IsBackground = true;
refreshThread.Start();
}
public PCIRangeMonitor(Cpu cpu, uint startAddress, uint endAddress)
{
CPU = cpu;
StartAddress = startAddress;
EndAddress = endAddress;
RefreshTimer.Interval = 500;
RefreshTimer.Tick += new EventHandler(RefreshTimer_Tick);
InitializeComponent();
list.Clear();
list = RefreshList();
dataGridViewPCIRange.DataSource = list;
}
private void RefreshTimer_Tick(object sender, EventArgs e)
{
Console.WriteLine("refreshing");
RefreshData();
}
private void PCIRangeMonitor_FormClosing(object sender, FormClosingEventArgs e)
{
RefreshTimer.Stop();
}
private void PCIRangeMonitor_Shown(object sender, EventArgs e)
{
RefreshTimer.Start();
}
}
}