149 lines
4.0 KiB
C#
149 lines
4.0 KiB
C#
#nullable enable
|
|
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Windows.Forms;
|
|
using Microsoft.Win32;
|
|
|
|
public class TrayApp : ApplicationContext
|
|
{
|
|
private NotifyIcon trayIcon;
|
|
private Telemetry telemetry;
|
|
private System.Windows.Forms.Timer timer;
|
|
private bool telemetryPaused = false;
|
|
|
|
public TrayApp()
|
|
{
|
|
telemetry = new Telemetry();
|
|
telemetry.Initialize();
|
|
|
|
trayIcon = new NotifyIcon()
|
|
{
|
|
Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath),
|
|
Visible = true,
|
|
Text = "Telemetry Running (UDP)"
|
|
};
|
|
|
|
var menu = new ContextMenuStrip();
|
|
|
|
// Show config.json
|
|
menu.Items.Add("Show Config", null, OnShowConfig);
|
|
|
|
// Reload config
|
|
menu.Items.Add("Reload Config", null, OnReloadConfig);
|
|
|
|
// Separator
|
|
menu.Items.Add(new ToolStripSeparator());
|
|
|
|
// Exit
|
|
menu.Items.Add("Exit", null, OnExit);
|
|
|
|
trayIcon.ContextMenuStrip = menu;
|
|
|
|
// Main telemetry timer
|
|
timer = new System.Windows.Forms.Timer();
|
|
timer.Interval = 1000;
|
|
timer.Tick += (s, e) =>
|
|
{
|
|
if (!telemetryPaused)
|
|
telemetry.UpdateAndSend();
|
|
};
|
|
timer.Start();
|
|
|
|
// Detect system sleep/wake
|
|
SystemEvents.PowerModeChanged += OnPowerModeChanged;
|
|
}
|
|
|
|
private void OnPowerModeChanged(object? sender, PowerModeChangedEventArgs e)
|
|
{
|
|
if (e.Mode == PowerModes.Suspend)
|
|
{
|
|
telemetryPaused = true;
|
|
}
|
|
else if (e.Mode == PowerModes.Resume)
|
|
{
|
|
telemetryPaused = true;
|
|
|
|
// Give Windows time to restore networking
|
|
var resumeTimer = new System.Windows.Forms.Timer();
|
|
resumeTimer.Interval = 3000; // 3 seconds
|
|
resumeTimer.Tick += (s, ev) =>
|
|
{
|
|
telemetryPaused = false;
|
|
resumeTimer.Stop();
|
|
resumeTimer.Dispose();
|
|
};
|
|
resumeTimer.Start();
|
|
}
|
|
}
|
|
|
|
// Show config.json in Explorer
|
|
private void OnShowConfig(object? sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
string exeDir = AppContext.BaseDirectory;
|
|
string cfgPath = Path.Combine(exeDir, "config.json");
|
|
|
|
if (File.Exists(cfgPath))
|
|
{
|
|
Process.Start("explorer.exe", $"/select,\"{cfgPath}\"");
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show(
|
|
"config.json not found.",
|
|
"Show Config",
|
|
MessageBoxButtons.OK,
|
|
MessageBoxIcon.Warning
|
|
);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(
|
|
$"Failed to open config.json:\n{ex.Message}",
|
|
"Show Config Error",
|
|
MessageBoxButtons.OK,
|
|
MessageBoxIcon.Error
|
|
);
|
|
}
|
|
}
|
|
|
|
// Reload config handler
|
|
private void OnReloadConfig(object? sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
telemetry.Dispose();
|
|
telemetry = new Telemetry();
|
|
telemetry.Initialize();
|
|
|
|
MessageBox.Show(
|
|
"Configuration reloaded successfully.",
|
|
"Reload Config",
|
|
MessageBoxButtons.OK,
|
|
MessageBoxIcon.Information
|
|
);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(
|
|
$"Failed to reload configuration:\n{ex.Message}",
|
|
"Reload Config Error",
|
|
MessageBoxButtons.OK,
|
|
MessageBoxIcon.Error
|
|
);
|
|
}
|
|
}
|
|
|
|
private void OnExit(object? sender, EventArgs e)
|
|
{
|
|
telemetry.Dispose();
|
|
trayIcon.Visible = false;
|
|
Application.Exit();
|
|
}
|
|
}
|