229 lines
8.5 KiB
C#
229 lines
8.5 KiB
C#
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("调试日志已清空");
|
||
}
|
||
}
|
||
} |