#include "ConfigManager.h" #include "VrLog.h" #include "VrError.h" #include "PathManager.h" #include // 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: 实现具体的工作点切换逻辑 }