2026-03-11 23:40:06 +08:00

110 lines
4.6 KiB
C++
Raw 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.

#include "ConfigManager.h"
#include "VrLog.h"
#include "VrError.h"
#include "PathManager.h"
#include <cstdio>
// HoleDetection 应用的 ConfigManager 实现
// 所有通用功能都在 BaseConfigManager 中实现
// 这里只实现 HoleDetection 特定的功能
ConfigManager::ConfigManager()
{
}
ConfigManager::~ConfigManager()
{
}
// 重写 Initialize 以禁用共享内存监控HoleDetectionApp 不需要)
bool ConfigManager::Initialize(const std::string& configFilePath)
{
LOG_INFO("ConfigManager initializing for HoleDetectionApp...\n");
fprintf(stderr, "[DIAG-CM] ConfigManager::Initialize start\n"); fflush(stderr);
// 保存配置文件路径
QString defaultPath = PathManager::GetInstance().GetConfigFilePath();
m_configFilePath = defaultPath.toStdString();
fprintf(stderr, "[DIAG-CM] Config file path: %s\n", m_configFilePath.c_str()); fflush(stderr);
// 创建VrConfig实例
fprintf(stderr, "[DIAG-CM] Creating VrConfig instance...\n"); fflush(stderr);
if (!IVrConfig::CreateInstance(&m_pVrConfig) || !m_pVrConfig) {
LOG_ERROR("Failed to create VrConfig instance\n");
return false;
}
fprintf(stderr, "[DIAG-CM] VrConfig instance created OK\n"); fflush(stderr);
// 加载配置文件
fprintf(stderr, "[DIAG-CM] Loading config file...\n"); fflush(stderr);
if (!LoadConfigFromFile(m_configFilePath)) {
LOG_WARNING("Failed to load config file, using default config\n");
fprintf(stderr, "[DIAG-CM] Config file load failed, using defaults\n"); fflush(stderr);
_InitializeDefaultConfig();
}
fprintf(stderr, "[DIAG-CM] Config loaded OK\n"); fflush(stderr);
// HoleDetectionApp 不需要共享内存监控,跳过 ConfigMonitor 启动
LOG_INFO("ConfigManager initialized successfully for HoleDetectionApp (shared memory disabled)\n");
fprintf(stderr, "[DIAG-CM] ConfigManager::Initialize completed\n"); fflush(stderr);
return true;
}
// 实现 LoadConfigFromFile 以适配 HoleDetection 的 IVrConfig API
// HoleDetection 使用引用参数方式int LoadConfig(const std::string& filePath, ConfigResult& configResult)
bool ConfigManager::LoadConfigFromFile(const std::string& filePath)
{
fprintf(stderr, "[DIAG-CM] LoadConfigFromFile entry, path=%s\n", filePath.c_str()); fflush(stderr);
if (!m_pVrConfig) {
LOG_ERROR("VrConfig instance not available\n");
fprintf(stderr, "[DIAG-CM] LoadConfigFromFile: m_pVrConfig is null!\n"); fflush(stderr);
return false;
}
fprintf(stderr, "[DIAG-CM] LoadConfigFromFile: m_pVrConfig=%p OK\n", (void*)m_pVrConfig); fflush(stderr);
try {
fprintf(stderr, "[DIAG-CM] LoadConfigFromFile: creating ConfigResult on stack...\n"); fflush(stderr);
ConfigResult configResult;
fprintf(stderr, "[DIAG-CM] LoadConfigFromFile: ConfigResult created OK\n"); fflush(stderr);
// HoleDetection 使用引用参数方式
fprintf(stderr, "[DIAG-CM] LoadConfigFromFile: calling m_pVrConfig->LoadConfig...\n"); fflush(stderr);
int ret = m_pVrConfig->LoadConfig(filePath, configResult);
fprintf(stderr, "[DIAG-CM] LoadConfigFromFile: LoadConfig returned %d\n", ret); fflush(stderr);
if (ret != SUCCESS) {
LOG_ERROR("Failed to load config from file: %s, error: %d\n", filePath.c_str(), ret);
fprintf(stderr, "[DIAG-CM] LoadConfigFromFile: LoadConfig failed with %d\n", ret); fflush(stderr);
return false;
}
// 使用基类的公共逻辑应用配置
fprintf(stderr, "[DIAG-CM] LoadConfigFromFile: calling _ApplyLoadedConfig...\n"); fflush(stderr);
bool applyResult = _ApplyLoadedConfig(configResult, filePath);
fprintf(stderr, "[DIAG-CM] LoadConfigFromFile: _ApplyLoadedConfig returned %d\n", applyResult); fflush(stderr);
return applyResult;
} catch (const std::exception& e) {
LOG_ERROR("Failed to load configuration from file %s: %s\n", filePath.c_str(), e.what());
fprintf(stderr, "[DIAG-CM] LoadConfigFromFile: exception: %s\n", e.what()); fflush(stderr);
return false;
}
}
void ConfigManager::OnSwitchWorkPositionCommand(int workPosition)
{
LOG_INFO("HoleDetection: Received switch work position command: workPosition=%d\n", workPosition);
// HoleDetection 应用特有的工作点切换逻辑
// 这里需要根据实际需求实现工作点切换
// 可能需要:
// 1. 重新加载不同的配置文件
// 2. 更新算法参数
// 3. 切换检测区域
// 4. 更新标定矩阵
// 5. 通知UI更新
// TODO: 实现具体的工作点切换逻辑
}