Skip to content

Commit 544188b

Browse files
committed
Remove special characters from sensor and hardware name
1 parent b43e407 commit 544188b

File tree

9 files changed

+78
-51
lines changed

9 files changed

+78
-51
lines changed

HardwareMonitor/HardwareMonitor/HardwareMonitor.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
<ApplicationIcon>..\..\target\desktop\src\main\resources\imgs\favicon.ico</ApplicationIcon>
9+
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
910
</PropertyGroup>
1011

1112
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">

HardwareMonitor/HardwareMonitor/Monitor/MonitorPoller.cs

Lines changed: 52 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#pragma warning disable CS8601 // Possible null
22

3+
using System.Globalization;
34
using System.Text;
5+
using System.Text.RegularExpressions;
46
using HardwareMonitor.PresentMon;
57
using HardwareMonitor.SharedMemory;
68
using HardwareMonitor.Sockets;
@@ -54,31 +56,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
5456
using var writer = new BinaryWriter(memoryStream);
5557
var accumulator = 0;
5658

57-
writer.Write((short)MonitorPacketCommand.Data);
58-
writer.Write(sharedMemoryData.Hardwares.Count);
59-
writer.Write(sharedMemoryData.Sensors.Count);
60-
61-
foreach (var hardware in sharedMemoryData.Hardwares)
62-
{
63-
writer.Write(GetBytes(hardware.Name, SharedMemoryConsts.NameSize));
64-
writer.Write(GetBytes(hardware.Identifier, SharedMemoryConsts.IdentifierSize));
65-
writer.Write((int)hardware.HardwareType);
66-
}
67-
68-
for (var index = 0; index < sharedMemoryData.Sensors.Count; index++)
69-
{
70-
var sensor = sharedMemoryData.Sensors[index];
71-
sensor.Value = float.IsNaN(sensor.Sensor.Value ?? 0f) ? 0f : (sensor.Sensor.Value ?? 0f);
72-
73-
writer.Write(GetBytes(sensor.Name, SharedMemoryConsts.NameSize));
74-
writer.Write(GetBytes(sensor.Identifier, SharedMemoryConsts.IdentifierSize));
75-
writer.Write(GetBytes(sensor.HardwareIdentifier, SharedMemoryConsts.IdentifierSize));
76-
writer.Write((int)sensor.SensorType);
77-
writer.Write((float)sensor.Value);
78-
79-
// store the starting offset of the float we just wrote
80-
sensorValueOffset[index] = (int)writer.BaseStream.Position - 4;
81-
}
59+
WriteDataToStream(writer, sharedMemoryData);
8260

8361
while (!stoppingToken.IsCancellationRequested)
8462
{
@@ -88,21 +66,13 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
8866
await Task.Delay(1000, stoppingToken);
8967
continue;
9068
}
91-
69+
9270
foreach (var hardware in sharedMemoryData.Hardwares)
9371
{
9472
hardware.Hardware.Update();
9573
}
9674

97-
for (var index = 0; index < sharedMemoryData.Sensors.Count; index++)
98-
{
99-
var sensor = sharedMemoryData.Sensors[index];
100-
sensor.Value = float.IsNaN(sensor.Sensor.Value ?? 0f) ? 0f : (sensor.Sensor.Value ?? 0f);
101-
102-
// seek to the sensor value offset
103-
writer.Seek(sensorValueOffset[index], SeekOrigin.Begin);
104-
writer.Write((float)sensor.Value);
105-
}
75+
WriteDataToStream(writer, sharedMemoryData);
10676

10777
if (_socketHost.HasConnections())
10878
{
@@ -123,6 +93,39 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
12393
hostApplicationLifetime.StopApplication();
12494
}
12595

96+
private static void WriteDataToStream(BinaryWriter writer, SharedMemoryData sharedMemoryData)
97+
{
98+
writer.Seek(0, SeekOrigin.Begin);
99+
writer.Write((short)MonitorPacketCommand.Data);
100+
writer.Write(sharedMemoryData.Hardwares.Count);
101+
writer.Write(sharedMemoryData.Sensors.Count);
102+
103+
foreach (var hardware in sharedMemoryData.Hardwares)
104+
{
105+
writer.Write((short)hardware.Name.Length);
106+
writer.Write((short)hardware.Identifier.Length);
107+
writer.Write(Encoding.UTF8.GetBytes(hardware.Name));
108+
writer.Write(Encoding.UTF8.GetBytes(hardware.Identifier));
109+
writer.Write((int)hardware.HardwareType);
110+
}
111+
112+
foreach (var sensor in sharedMemoryData.Sensors)
113+
{
114+
var value = sensor.HardwareSensor.Value ?? 0f;
115+
var floatValue = (IsNaN(value) ? 0f : value).ToString(CultureInfo.InvariantCulture);
116+
sensor.Value = float.Parse(floatValue, CultureInfo.InvariantCulture);
117+
118+
writer.Write((short)sensor.Name.Length);
119+
writer.Write((short)sensor.Identifier.Length);
120+
writer.Write((short)sensor.HardwareIdentifier.Length);
121+
writer.Write(Encoding.UTF8.GetBytes(sensor.Name));
122+
writer.Write(Encoding.UTF8.GetBytes(sensor.Identifier));
123+
writer.Write(Encoding.UTF8.GetBytes(sensor.HardwareIdentifier));
124+
writer.Write((int)sensor.SensorType);
125+
writer.Write((float)sensor.Value);
126+
}
127+
}
128+
126129
private void OnClientConnected()
127130
{
128131
SendPresentMonAppsToClients();
@@ -175,7 +178,6 @@ private void SendPresentMonAppsToClients()
175178
using var writer = new BinaryWriter(memoryStream);
176179

177180
writer.Write((short)MonitorPacketCommand.PresentMonApps);
178-
//logger.LogInformation("Sending presentmon apps to clients {Count}", _presentMonPoller.CurrentApps.Count);
179181
writer.Write((short)_presentMonPoller.CurrentApps.Count);
180182
foreach (var app in _presentMonPoller.CurrentApps)
181183
{
@@ -245,24 +247,35 @@ private void Stop()
245247

246248
private static SharedMemoryHardware MapHardware(IHardware hardware) => new()
247249
{
248-
Name = hardware.Name,
250+
Name = RemoveSpecialCharacters(hardware.Name),
249251
Identifier = hardware.Identifier.ToString(),
250252
HardwareType = hardware.HardwareType,
251253
Hardware = hardware
252254
};
253255

254256
private static SharedMemorySensor MapSensor(ISensor sensor) => new()
255257
{
256-
Name = sensor.Name,
258+
Name = RemoveSpecialCharacters(sensor.Name),
257259
Identifier = sensor.Identifier.ToString(),
258260
SensorType = sensor.SensorType,
259261
Value = float.IsNaN(sensor.Value ?? 0f) ? 0f : (sensor.Value ?? 0f),
260262
HardwareIdentifier = sensor.Hardware.Identifier.ToString(),
261-
Sensor = sensor
263+
HardwareSensor = sensor
262264
};
263265

264266
private static byte[] GetBytes(string str, int length)
265267
{
266268
return Encoding.UTF8.GetBytes(str.Length > length ? str[..length] : str.PadRight(length, '\0'));
267269
}
270+
271+
public static string RemoveSpecialCharacters(string str)
272+
{
273+
return Regex.Replace(str, "[^a-zA-Z0-9_ .]+", "_", RegexOptions.Compiled);
274+
}
275+
276+
public static unsafe bool IsNaN(float f)
277+
{
278+
int binary = *(int*)(&f);
279+
return ((binary & 0x7F800000) == 0x7F800000) && ((binary & 0x007FFFFF) != 0);
280+
}
268281
}

HardwareMonitor/HardwareMonitor/SharedMemory/SharedMemory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public bool ShouldSerializeHardware()
4444

4545
public class SharedMemorySensor
4646
{
47-
public required ISensor Sensor;
47+
public required ISensor HardwareSensor;
4848
public required string Name { get; set; }
4949
public required string Identifier { get; set; }
5050
public required string HardwareIdentifier { get; set; }

core/native/src/main/kotlin/app/cleanmeter/core/os/hardwaremonitor/HardwareMonitorReader.kt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@ object HardwareMonitorReader {
3737
is Packet.Data -> {
3838
// read first 8 bytes to get the amount of hardware and sensors
3939
val (hardware, sensor) = readHardwareAndSensorCount(packet.data)
40-
if (hardware + sensor <= 0) return@mapNotNull null
40+
if (hardware + sensor <= 0) {
41+
println("No hardware or sensor available, skipping")
42+
return@mapNotNull null
43+
}
4144

42-
val buffer = getByteBuffer(packet.data, hardware * HARDWARE_SIZE + sensor * SENSOR_SIZE, HEADER_SIZE)
45+
val buffer = getByteBuffer(packet.data, packet.data.size - HEADER_SIZE, HEADER_SIZE)
4346
val hardwares = readHardware(buffer, hardware)
4447
val sensors = readSensor(buffer, sensor)
4548
_currentData = _currentData.copy(Hardwares = hardwares, Sensors = sensors, LastPollTime = System.currentTimeMillis())
@@ -67,9 +70,11 @@ object HardwareMonitorReader {
6770
private fun readHardware(buffer: ByteBuffer, count: Int): List<HardwareMonitorData.Hardware> {
6871
return buildList {
6972
for (i in 0 until count) {
73+
val nameSize = buffer.short.toInt()
74+
val identifierSize = buffer.short.toInt()
7075
val hardware = HardwareMonitorData.Hardware(
71-
Name = buffer.readString(NAME_SIZE),
72-
Identifier = buffer.readString(IDENTIFIER_SIZE),
76+
Name = buffer.readString(nameSize),
77+
Identifier = buffer.readString(identifierSize),
7378
HardwareType = HardwareMonitorData.HardwareType.fromValue(buffer.int),
7479
)
7580
add(hardware)
@@ -80,10 +85,13 @@ object HardwareMonitorReader {
8085
private fun readSensor(buffer: ByteBuffer, count: Int): List<HardwareMonitorData.Sensor> {
8186
return buildList {
8287
for (i in 0 until count) {
88+
val nameSize = buffer.short.toInt()
89+
val identifierSize = buffer.short.toInt()
90+
val hardwareIdentifier = buffer.short.toInt()
8391
val sensor = HardwareMonitorData.Sensor(
84-
Name = buffer.readString(NAME_SIZE),
85-
Identifier = buffer.readString(IDENTIFIER_SIZE),
86-
HardwareIdentifier = buffer.readString(IDENTIFIER_SIZE),
92+
Name = buffer.readString(nameSize),
93+
Identifier = buffer.readString(identifierSize),
94+
HardwareIdentifier = buffer.readString(hardwareIdentifier),
8795
SensorType = HardwareMonitorData.SensorType.fromValue(buffer.int),
8896
Value = buffer.float,
8997
)

core/native/src/main/kotlin/app/cleanmeter/core/os/hardwaremonitor/SocketClient.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ object SocketClient {
8686
try {
8787
val command = getCommand(inputStream)
8888
val size = getSize(inputStream)
89-
println("Received $command with $size bytes")
9089
when (command) {
9190
Command.Data -> packetChannel.trySend(Packet.Data(inputStream.readNBytes(size)))
9291
Command.PresentMonApps -> packetChannel.trySend(Packet.PresentMonApps(inputStream.readNBytes(size)))

target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/HelpSettingsUi.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package app.cleanmeter.target.desktop.ui.settings.tabs
22

3+
import FilledButton
34
import androidx.compose.foundation.background
45
import androidx.compose.foundation.border
56
import androidx.compose.foundation.gestures.Orientation
@@ -48,6 +49,7 @@ import app.cleanmeter.target.desktop.ui.components.HotKeySymbol
4849
import app.cleanmeter.target.desktop.ui.components.section.CollapsibleSection
4950
import app.cleanmeter.target.desktop.ui.components.section.ToggleSection
5051
import app.cleanmeter.target.desktop.ui.settings.SettingsEvent
52+
import java.io.File
5153

5254
@Composable
5355
internal fun HelpSettingsUi(
@@ -133,6 +135,10 @@ internal fun HelpSettingsUi(
133135
isEnabled = overlaySettings.isLoggingEnabled,
134136
onSwitchToggle = { onEvent(SettingsEvent.ToggleLoggingEnabled) }
135137
) {
138+
FilledButton(label = "Save logs to text") {
139+
File("cleanmeter.${System.currentTimeMillis()}.log").printWriter()
140+
.use { it.print(logSink) }
141+
}
136142
SelectionContainer {
137143
Text(
138144
text = logSink,

target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/CpuStats.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ internal fun CpuStats(
3434
body = { options ->
3535
Column(modifier = Modifier, verticalArrangement = Arrangement.spacedBy(12.dp)) {
3636
options.forEach { option ->
37-
val readings = getCpuSensorReadings().filter { it.SensorType == option.dataType }
37+
val readings = getCpuSensorReadings().filter { it.SensorType == option.dataType }.takeIf { it.isNotEmpty() } ?: getCpuSensorReadings()
3838

3939
Column(horizontalAlignment = Alignment.Start, modifier = Modifier.fillMaxWidth()) {
4040
CheckboxWithLabel(

target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/GpuStats.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ internal fun GpuStats(
3939
body = { options ->
4040
Column(modifier = Modifier, verticalArrangement = Arrangement.spacedBy(12.dp)) {
4141
options.forEach { option ->
42-
val readings = getGpuSensorReadings().filter { it.SensorType == option.dataType }
42+
val readings = getGpuSensorReadings().filter { it.SensorType == option.dataType }.takeIf { it.isNotEmpty() } ?: getGpuSensorReadings()
4343

4444
Column(horizontalAlignment = Alignment.Start, modifier = Modifier.fillMaxWidth()) {
4545
CheckboxWithLabel(

target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/NetworkStats.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ internal fun NetworkStats(
3535
body = { options ->
3636
Column(modifier = Modifier, verticalArrangement = Arrangement.spacedBy(12.dp)) {
3737
options.forEach { option ->
38-
val readings = getNetworkSensorReadings().sortedBy { it.HardwareIdentifier }.filter { it.SensorType == option.dataType }
38+
val readings = getNetworkSensorReadings().sortedBy { it.HardwareIdentifier }.filter { it.SensorType == option.dataType }.takeIf { it.isNotEmpty() } ?: getNetworkSensorReadings()
3939

4040
Column(horizontalAlignment = Alignment.Start, modifier = Modifier.fillMaxWidth()) {
4141
CheckboxWithLabel(

0 commit comments

Comments
 (0)