366 lines
10 KiB
C#
366 lines
10 KiB
C#
|
|
using System;
|
|||
|
|
using System.IO;
|
|||
|
|
using UnityEngine;
|
|||
|
|
using GeneralTools;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Android测试配置管理器
|
|||
|
|
/// </summary>
|
|||
|
|
public class AndroidTestConfigManager : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
[Header("测试配置")]
|
|||
|
|
public bool enableSerialTest = true;
|
|||
|
|
public bool enableSimulatedData = false;
|
|||
|
|
public string testSerialPort = "/dev/ttyS4";
|
|||
|
|
public int testBaudRate = 115200;
|
|||
|
|
|
|||
|
|
[Header("调试选项")]
|
|||
|
|
public bool verboseLogging = true;
|
|||
|
|
public bool exportConfigOnStart = true;
|
|||
|
|
|
|||
|
|
void Start()
|
|||
|
|
{
|
|||
|
|
if (exportConfigOnStart)
|
|||
|
|
{
|
|||
|
|
// ExportCurrentConfig();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SetupAndroidTestEnvironment();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 设置Android测试环境
|
|||
|
|
/// </summary>
|
|||
|
|
private void SetupAndroidTestEnvironment()
|
|||
|
|
{
|
|||
|
|
Debug.Log("=== 设置Android测试环境 ===");
|
|||
|
|
|
|||
|
|
#if UNITY_ANDROID && !UNITY_EDITOR
|
|||
|
|
|
|||
|
|
// 1. 确保配置文件存在
|
|||
|
|
EnsureAndroidConfigExists();
|
|||
|
|
|
|||
|
|
// 2. 更新测试配置
|
|||
|
|
UpdateTestConfig();
|
|||
|
|
|
|||
|
|
// 3. 设置日志级别
|
|||
|
|
SetupLogging();
|
|||
|
|
|
|||
|
|
// 4. 检查文件权限
|
|||
|
|
CheckFilePermissions();
|
|||
|
|
|
|||
|
|
#else
|
|||
|
|
Debug.Log("当前不在Android平台,跳过Android特定配置");
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 确保Android配置文件存在
|
|||
|
|
/// </summary>
|
|||
|
|
private void EnsureAndroidConfigExists()
|
|||
|
|
{
|
|||
|
|
string persistentConfigPath = Path.Combine(Application.persistentDataPath, "config_android.ini");
|
|||
|
|
string streamingConfigPath = Path.Combine(Application.streamingAssetsPath, "config_android.ini");
|
|||
|
|
|
|||
|
|
Debug.Log($"持久化配置路径: {persistentConfigPath}");
|
|||
|
|
Debug.Log($"StreamingAssets配置路径: {streamingConfigPath}");
|
|||
|
|
|
|||
|
|
if (!File.Exists(persistentConfigPath))
|
|||
|
|
{
|
|||
|
|
if (File.Exists(streamingConfigPath))
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
// 从StreamingAssets复制
|
|||
|
|
string configContent = File.ReadAllText(streamingConfigPath);
|
|||
|
|
File.WriteAllText(persistentConfigPath, configContent);
|
|||
|
|
Debug.Log("已从StreamingAssets复制配置文件到持久化目录");
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Debug.LogError($"复制配置文件失败: {ex.Message}");
|
|||
|
|
CreateDefaultAndroidConfig(persistentConfigPath);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Debug.LogWarning("StreamingAssets中未找到Android配置文件,创建默认配置");
|
|||
|
|
CreateDefaultAndroidConfig(persistentConfigPath);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Debug.Log("Android配置文件已存在");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建默认Android配置
|
|||
|
|
/// </summary>
|
|||
|
|
private void CreateDefaultAndroidConfig(string configPath)
|
|||
|
|
{
|
|||
|
|
string defaultConfig = $@"[config]
|
|||
|
|
screen_width=1920
|
|||
|
|
screen_height=1080
|
|||
|
|
window_Left=0
|
|||
|
|
window_Top=0
|
|||
|
|
showcursor=false
|
|||
|
|
fullscreen=2
|
|||
|
|
screenDepth=2
|
|||
|
|
isAllowPlayBGM=true
|
|||
|
|
audioShotLimit=5
|
|||
|
|
logType=0
|
|||
|
|
saveLog=true
|
|||
|
|
broadcastDebug=false
|
|||
|
|
debugSocketMsgMode=1
|
|||
|
|
targetFramerate=60
|
|||
|
|
keyDownActionLevel=0
|
|||
|
|
releaseTime=30
|
|||
|
|
|
|||
|
|
[SerialCommunication]
|
|||
|
|
serialPortName={testSerialPort}
|
|||
|
|
baudRate={testBaudRate}
|
|||
|
|
enabled={enableSerialTest.ToString().ToLower()}
|
|||
|
|
connectionTimeoutMs=5000
|
|||
|
|
heartbeatIntervalSeconds=30
|
|||
|
|
|
|||
|
|
[SerialPort]
|
|||
|
|
serialPortName={testSerialPort}
|
|||
|
|
serialBaudRate={testBaudRate}
|
|||
|
|
serialDataBits=8
|
|||
|
|
serialStopBits=1
|
|||
|
|
serialParity=None
|
|||
|
|
serialFlowControl=false
|
|||
|
|
heartbeatInterval=1000
|
|||
|
|
communicationTimeout=5000
|
|||
|
|
autoReconnect=true
|
|||
|
|
maxReconnectAttempts=5
|
|||
|
|
frameHeader1=0xAA
|
|||
|
|
frameHeader2=0x55
|
|||
|
|
frameTail1=0x0D
|
|||
|
|
frameTail2=0x0A
|
|||
|
|
dataReportInterval=1000
|
|||
|
|
alarmCheckInterval=500
|
|||
|
|
|
|||
|
|
[Display]
|
|||
|
|
brightness=47.0
|
|||
|
|
|
|||
|
|
[Audio]
|
|||
|
|
volume=26
|
|||
|
|
muteDurationMinutes=4
|
|||
|
|
|
|||
|
|
[Network]
|
|||
|
|
mode=Dhcp
|
|||
|
|
ipv4=
|
|||
|
|
mask=255.255.255.0
|
|||
|
|
gateway=
|
|||
|
|
|
|||
|
|
[System]
|
|||
|
|
autoBackup=True
|
|||
|
|
dataRetentionDays=30
|
|||
|
|
|
|||
|
|
[AlarmSettings]
|
|||
|
|
enableLowPriorityAlarm=true
|
|||
|
|
enableMediumPriorityAlarm=true
|
|||
|
|
enableHighPriorityAlarm=true
|
|||
|
|
batteryLowThreshold=40
|
|||
|
|
batteryCriticalThreshold=20
|
|||
|
|
batteryEmptyThreshold=5
|
|||
|
|
bfiAbnormalThreshold=100.0
|
|||
|
|
laserTempAbnormalThreshold=60.0
|
|||
|
|
enableAlarmSound=true
|
|||
|
|
enableAlarmLight=true
|
|||
|
|
|
|||
|
|
[DataProcessing]
|
|||
|
|
bfiSamplingRate=100
|
|||
|
|
dataSmoothingWindow=10
|
|||
|
|
enableDataValidation=true
|
|||
|
|
filterAbnormalData=true
|
|||
|
|
enableDataStorage=true
|
|||
|
|
dataStorageInterval=60
|
|||
|
|
";
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
File.WriteAllText(configPath, defaultConfig);
|
|||
|
|
Debug.Log($"已创建默认Android配置文件: {configPath}");
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Debug.LogError($"创建默认配置文件失败: {ex.Message}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 更新测试配置
|
|||
|
|
/// </summary>
|
|||
|
|
private void UpdateTestConfig()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string configPath = Path.Combine(Application.persistentDataPath, "config_android.ini");
|
|||
|
|
|
|||
|
|
// 初始化ConfigHelper
|
|||
|
|
ConfigHelper.Init(configPath);
|
|||
|
|
|
|||
|
|
// 验证配置读取
|
|||
|
|
var serialPortName = ConfigHelper.GetConfig<string>("serialPortName", "SerialCommunication", "");
|
|||
|
|
var baudRate = ConfigHelper.GetConfig<int>("baudRate", "SerialCommunication", 0);
|
|||
|
|
var enabled = ConfigHelper.GetConfig<bool>("enabled", "SerialCommunication", false);
|
|||
|
|
|
|||
|
|
Debug.Log($"当前配置 - 串口: {serialPortName}, 波特率: {baudRate}, 启用: {enabled}");
|
|||
|
|
|
|||
|
|
if (verboseLogging)
|
|||
|
|
{
|
|||
|
|
LogDetailedConfig();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Debug.LogError($"更新测试配置失败: {ex.Message}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 设置日志记录
|
|||
|
|
/// </summary>
|
|||
|
|
private void SetupLogging()
|
|||
|
|
{
|
|||
|
|
if (verboseLogging)
|
|||
|
|
{
|
|||
|
|
Debug.Log("启用详细日志记录");
|
|||
|
|
Application.SetStackTraceLogType(LogType.Log, StackTraceLogType.ScriptOnly);
|
|||
|
|
Application.SetStackTraceLogType(LogType.Warning, StackTraceLogType.ScriptOnly);
|
|||
|
|
Application.SetStackTraceLogType(LogType.Error, StackTraceLogType.Full);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 检查文件权限
|
|||
|
|
/// </summary>
|
|||
|
|
private void CheckFilePermissions()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string testFilePath = Path.Combine(Application.persistentDataPath, "permission_test.txt");
|
|||
|
|
File.WriteAllText(testFilePath, "权限测试");
|
|||
|
|
File.Delete(testFilePath);
|
|||
|
|
Debug.Log("文件读写权限正常");
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Debug.LogError($"文件权限检查失败: {ex.Message}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 记录详细配置信息
|
|||
|
|
/// </summary>
|
|||
|
|
private void LogDetailedConfig()
|
|||
|
|
{
|
|||
|
|
Debug.Log("=== 详细配置信息 ===");
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string configPath = Path.Combine(Application.persistentDataPath, "config_android.ini");
|
|||
|
|
if (File.Exists(configPath))
|
|||
|
|
{
|
|||
|
|
string[] lines = File.ReadAllLines(configPath);
|
|||
|
|
Debug.Log($"配置文件总行数: {lines.Length}");
|
|||
|
|
|
|||
|
|
foreach (string line in lines)
|
|||
|
|
{
|
|||
|
|
if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith(";") && !line.StartsWith("["))
|
|||
|
|
{
|
|||
|
|
Debug.Log($"配置项: {line}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Debug.LogError($"记录详细配置失败: {ex.Message}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 导出当前配置
|
|||
|
|
/// </summary>
|
|||
|
|
public void ExportCurrentConfig()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string exportPath = Path.Combine(Application.persistentDataPath, $"exported_config_{DateTime.Now:yyyyMMdd_HHmmss}.txt");
|
|||
|
|
string configPath = Path.Combine(Application.persistentDataPath, "config_android.ini");
|
|||
|
|
|
|||
|
|
string exportContent = $"=== 配置导出 ===\n";
|
|||
|
|
exportContent += $"导出时间: {DateTime.Now}\n";
|
|||
|
|
exportContent += $"设备型号: {SystemInfo.deviceModel}\n";
|
|||
|
|
exportContent += $"操作系统: {SystemInfo.operatingSystem}\n\n";
|
|||
|
|
|
|||
|
|
if (File.Exists(configPath))
|
|||
|
|
{
|
|||
|
|
exportContent += "=== 当前配置文件内容 ===\n";
|
|||
|
|
exportContent += File.ReadAllText(configPath);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
exportContent += "配置文件不存在\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
File.WriteAllText(exportPath, exportContent);
|
|||
|
|
Debug.Log($"配置已导出到: {exportPath}");
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Debug.LogError($"导出配置失败: {ex.Message}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 重置为测试配置
|
|||
|
|
/// </summary>
|
|||
|
|
[ContextMenu("重置为测试配置")]
|
|||
|
|
public void ResetToTestConfig()
|
|||
|
|
{
|
|||
|
|
string configPath = Path.Combine(Application.persistentDataPath, "config_android.ini");
|
|||
|
|
CreateDefaultAndroidConfig(configPath);
|
|||
|
|
Debug.Log("已重置为测试配置");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 测试串口设备访问
|
|||
|
|
/// </summary>
|
|||
|
|
[ContextMenu("测试串口设备")]
|
|||
|
|
public void TestSerialDeviceAccess()
|
|||
|
|
{
|
|||
|
|
Debug.Log("=== 测试串口设备访问 ===");
|
|||
|
|
|
|||
|
|
#if UNITY_ANDROID && !UNITY_EDITOR
|
|||
|
|
string[] testPorts = { testSerialPort, "/dev/ttyS0", "/dev/ttyUSB0", "/dev/ttyACM0" };
|
|||
|
|
|
|||
|
|
foreach (string port in testPorts)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
bool exists = File.Exists(port);
|
|||
|
|
Debug.Log($"串口 {port}: {(exists ? "存在" : "不存在")}");
|
|||
|
|
|
|||
|
|
if (exists)
|
|||
|
|
{
|
|||
|
|
// 尝试获取文件信息
|
|||
|
|
var fileInfo = new FileInfo(port);
|
|||
|
|
Debug.Log($" 文件大小: {fileInfo.Length}");
|
|||
|
|
Debug.Log($" 最后修改: {fileInfo.LastWriteTime}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Debug.LogError($"检查串口 {port} 失败: {ex.Message}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#else
|
|||
|
|
Debug.Log("非Android平台,无法测试串口设备");
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
}
|