2025-10-11 18:25:59 +08:00

229 lines
8.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using XiaoZhiSharp_MauiApp.Services;
namespace XiaoZhiSharp_MauiApp
{
public partial class SettingsPage : ContentPage
{
private readonly XiaoZhi_AgentService _agentService;
private System.Timers.Timer? _refreshTimer;
public SettingsPage(XiaoZhi_AgentService agentService)
{
InitializeComponent();
_agentService = agentService;
BindingContext = _agentService;
}
protected override void OnAppearing()
{
base.OnAppearing();
StartRefreshTimer();
UpdateDebugLogsDisplay();
}
protected override void OnDisappearing()
{
base.OnDisappearing();
StopRefreshTimer();
}
private void StartRefreshTimer()
{
if (_refreshTimer == null)
{
_refreshTimer = new System.Timers.Timer(1000); // 每秒刷新一次
_refreshTimer.Elapsed += async (sender, e) =>
{
if (_agentService.IsDebugMode)
{
await MainThread.InvokeOnMainThreadAsync(() =>
{
// 更新调试日志显示
UpdateDebugLogsDisplay();
});
}
};
_refreshTimer.Start();
}
}
private void UpdateDebugLogsDisplay()
{
// 将日志倒序显示,最新的在最上面
if (DebugLogsCollectionView != null)
{
DebugLogsCollectionView.ItemsSource = _agentService.DebugLogs.Reverse();
}
}
private void StopRefreshTimer()
{
_refreshTimer?.Stop();
_refreshTimer?.Dispose();
_refreshTimer = null;
}
private async void OnSaveSettingsClicked(object sender, EventArgs e)
{
try
{
_agentService.AddDebugLog("保存设置中...");
_agentService.SaveSettings();
_agentService.AddDebugLog("设置已保存到本地存储");
// 添加视觉反馈
var button = sender as Button;
if (button != null)
{
var originalText = button.Text;
button.Text = "✅ 已保存";
await Task.Delay(1500);
button.Text = originalText;
}
await DisplayAlert("成功", "设置已保存到本地存储\n\n注意要使设置生效请点击'应用并重连'按钮", "确定");
}
catch (Exception ex)
{
_agentService.AddDebugLog($"保存设置失败: {ex.Message}");
await DisplayAlert("错误", $"保存设置失败: {ex.Message}", "确定");
}
}
private async void OnApplySettingsClicked(object sender, EventArgs e)
{
try
{
var result = await DisplayAlert("确认", "应用设置将重新连接服务器,是否继续?", "是", "否");
if (result)
{
// 显示进度
var button = sender as Button;
if (button != null)
{
button.IsEnabled = false;
button.Text = "⏳ 正在应用...";
}
_agentService.AddDebugLog("开始应用新设置...");
_agentService.AddDebugLog($"新的服务器URL: {_agentService.ServerUrl}");
_agentService.AddDebugLog($"新的设备ID: {_agentService.DeviceId}");
_agentService.AddDebugLog($"新的OTA URL: {_agentService.OtaUrl}");
await _agentService.ApplySettings();
// 恢复按钮
if (button != null)
{
button.IsEnabled = true;
button.Text = "🔄 应用并重连";
}
await DisplayAlert("成功", "设置已应用,连接已重新建立\n\n请查看调试日志确认连接状态", "确定");
// 如果调试模式关闭,临时开启以显示连接状态
if (!_agentService.IsDebugMode)
{
_agentService.IsDebugMode = true;
await Task.Delay(3000); // 等待3秒让用户看到连接状态
_agentService.IsDebugMode = false;
}
}
}
catch (Exception ex)
{
_agentService.AddDebugLog($"应用设置失败: {ex.Message}");
await DisplayAlert("错误", $"应用设置失败: {ex.Message}", "确定");
}
}
private async void OnResetSettingsClicked(object sender, EventArgs e)
{
var result = await DisplayAlert("确认",
"是否恢复默认设置?\n\n默认值\n" +
"• 服务器URL: wss://api.tenclass.net/xiaozhi/v1/\n" +
"• OTA地址: https://api.tenclass.net/xiaozhi/ota/\n" +
"• MAC地址: " + Global.DeviceId + "\n" +
"• VAD阈值: 40\n" +
"• 调试模式: 关闭",
"是", "否");
if (result)
{
_agentService.AddDebugLog("恢复默认设置...");
_agentService.ResetSettings();
_agentService.AddDebugLog("已恢复所有默认设置");
// 刷新UI显示
var temp = BindingContext;
BindingContext = null;
BindingContext = temp;
await DisplayAlert("成功", "已恢复默认设置\n\n注意要使设置生效请点击'应用并重连'按钮", "确定");
}
}
private async void OnManualOtaCheckClicked(object sender, EventArgs e)
{
try
{
var button = sender as Button;
if (button != null)
{
button.IsEnabled = false;
button.Text = "⏳ 检查中...";
}
// 确保调试模式开启以查看检查过程
var wasDebugMode = _agentService.IsDebugMode;
if (!wasDebugMode)
{
_agentService.IsDebugMode = true;
}
await _agentService.ManualOtaCheck();
// 恢复按钮
if (button != null)
{
button.IsEnabled = true;
button.Text = "🔄 手动检查OTA";
}
// 显示结果
var message = "OTA检查完成\n\n";
message += $"OTA状态: {_agentService.OtaStatus}\n";
message += $"验证状态: {_agentService.ActivationStatus}\n";
if (!string.IsNullOrEmpty(_agentService.ActivationCode) && _agentService.ShowActivationCode)
{
message += $"验证码: {_agentService.ActivationCode}\n";
}
if (!string.IsNullOrEmpty(_agentService.LatestVersion))
{
message += $"最新版本: {_agentService.LatestVersion}";
}
await DisplayAlert("OTA检查结果", message, "确定");
// 如果原本调试模式是关闭的,等待几秒后关闭
if (!wasDebugMode)
{
await Task.Delay(3000);
_agentService.IsDebugMode = false;
}
}
catch (Exception ex)
{
_agentService.AddDebugLog($"OTA检查异常: {ex.Message}");
await DisplayAlert("错误", $"OTA检查失败: {ex.Message}", "确定");
}
}
private void OnClearLogsClicked(object sender, EventArgs e)
{
_agentService.ClearDebugLogs();
UpdateDebugLogsDisplay();
_agentService.AddDebugLog("调试日志已清空");
}
}
}