From ab5aadd82efa68f55757dfaaf2ce793bdd381b47 Mon Sep 17 00:00:00 2001 From: linbo <1034003879@qq.com> Date: Wed, 27 Aug 2025 15:30:51 +0800 Subject: [PATCH] update camera intrinsics --- config/cabin_robot.xml | 78 +++++++++---------- include/devices/abstract_camera.h | 6 +- include/service/grpc_system_service.h | 1 + protos/cmvr/api/camera_command.proto | 3 + protos/cmvr/api/common.proto | 13 ++++ protos/cmvr/api/system_command.proto | 11 +++ protos/cmvr/api/system_service.proto | 2 + src/device_manager/device_manager.cpp | 16 +++- .../camera/mechmind/mechmind_camera.cpp | 6 +- src/devices/camera/mechmind/mechmind_camera.h | 6 +- .../realsense_camera/realsense_camera.cpp | 27 ++++++- .../realsense_camera/realsense_camera.h | 6 +- src/devices/camera/uvc_camera/uvc_camera.cpp | 6 +- src/devices/camera/uvc_camera/uvc_camera.h | 6 +- src/devices/canbus/CMakeLists.txt | 2 - .../ffmpeg_microphone/ffmpeg_microphone.cpp | 20 +++++ .../ffmpeg_microphone/ffmpeg_microphone.h | 2 +- .../speaker/ffmpeg_speaker/ffmpeg_speaker.cpp | 20 +++++ .../speaker/ffmpeg_speaker/ffmpeg_speaker.h | 1 + src/service/grpc_camera_service.cpp | 36 ++++++++- src/service/grpc_system_service.cpp | 74 ++++++++++++++++++ 21 files changed, 275 insertions(+), 67 deletions(-) diff --git a/config/cabin_robot.xml b/config/cabin_robot.xml index b2bdaf53..4cc2c4d8 100644 --- a/config/cabin_robot.xml +++ b/config/cabin_robot.xml @@ -13,16 +13,16 @@ - - + + - + - - - + + + @@ -32,38 +32,38 @@ - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + @@ -83,8 +83,8 @@ - - + + @@ -131,7 +131,7 @@ - + diff --git a/include/devices/abstract_camera.h b/include/devices/abstract_camera.h index 160a5201..74770ef5 100644 --- a/include/devices/abstract_camera.h +++ b/include/devices/abstract_camera.h @@ -47,9 +47,9 @@ namespace cmvr::device { ~AbstractCamera() override = default; inline void getState(CameraState &state) {state = state_;} - virtual void getRGBImage(cv::Mat &color) {} - virtual void getDepthImage(cv::Mat &depth) {} - virtual void getRGBDImages(cv::Mat &color, cv::Mat &depth) {} + virtual void getRGBImage(cv::Mat &color, Rs2Intrinsics& intrinsics) {} + virtual void getDepthImage(cv::Mat &depth, Rs2Intrinsics& intrinsics) {} + virtual void getRGBDImages(cv::Mat &color, cv::Mat &depth, Rs2Intrinsics& intrinsics) {} virtual void startRecording(const std::string &video_path) {} virtual void stopRecording() {} virtual void pauseRecording() {} diff --git a/include/service/grpc_system_service.h b/include/service/grpc_system_service.h index a2c66235..b612632b 100644 --- a/include/service/grpc_system_service.h +++ b/include/service/grpc_system_service.h @@ -17,6 +17,7 @@ namespace cmvr::service ~gRPCSystemServiceImpl() override = default; grpc::Status GetSystemInfo(grpc::ServerContext* context, const api::GetSystemInfoCommand_Request* request, api::GetSystemInfoCommand_Feedback* response) override; grpc::Status GetSystemStatus(grpc::ServerContext* context, const api::GetSystemStatusCommand_Request* request, api::GetSystemStatusCommand_Feedback* response) override; + grpc::Status UpdateParams(grpc::ServerContext* context, const cmvr::api::UpdateParamsCommand_Request* request, cmvr::api::UpdateParamsCommand_Feedback* response) override; private: device::DeviceManager& dmgr_; }; diff --git a/protos/cmvr/api/camera_command.proto b/protos/cmvr/api/camera_command.proto index 6984c83f..38ab01d0 100644 --- a/protos/cmvr/api/camera_command.proto +++ b/protos/cmvr/api/camera_command.proto @@ -79,6 +79,7 @@ message GetRGBImageCommand { message Feedback { CommandHeader.Feedback header = 1; FrameData color_frame = 2; + Rs2Intrinsics intrinsics = 3; } } @@ -90,6 +91,7 @@ message GetDepthImageCommand { message Feedback { CommandHeader.Feedback header = 1; FrameData depth_frame = 2; + Rs2Intrinsics intrinsics = 3; } } @@ -102,6 +104,7 @@ message GetRGBDImagesCommand { CommandHeader.Feedback header = 1; FrameData color_frame = 2; FrameData depth_frame = 3; + Rs2Intrinsics intrinsics = 4; } } diff --git a/protos/cmvr/api/common.proto b/protos/cmvr/api/common.proto index 19c35bd4..accb9361 100644 --- a/protos/cmvr/api/common.proto +++ b/protos/cmvr/api/common.proto @@ -28,3 +28,16 @@ message CommandHeader { google.protobuf.Timestamp timestamp = 3; // 回复时间 } } + +message ConfigParam { + + string param_name = 1; + + oneof param_value { + int32 int_value = 2; // 整数类型 + double double_value = 3; // 浮点数类型 + string string_value = 4; // 字符串类型 + bool bool_value = 5; // 布尔类型 + bytes bytes_value = 6; // 二进制数据类型 + } +} diff --git a/protos/cmvr/api/system_command.proto b/protos/cmvr/api/system_command.proto index 7498dd65..ea6f21d9 100644 --- a/protos/cmvr/api/system_command.proto +++ b/protos/cmvr/api/system_command.proto @@ -48,3 +48,14 @@ message GetSystemStatusCommand { repeated DeviceList device_list = 7; } } + +message UpdateParamsCommand { + message Request { + CommandHeader.Request header = 1; + repeated ConfigParam params = 2; + } + + message Feedback { + CommandHeader.Feedback header = 1; + } +} diff --git a/protos/cmvr/api/system_service.proto b/protos/cmvr/api/system_service.proto index 3ae66541..f96ea81f 100644 --- a/protos/cmvr/api/system_service.proto +++ b/protos/cmvr/api/system_service.proto @@ -8,4 +8,6 @@ package cmvr.api; service SystemService { rpc GetSystemInfo(GetSystemInfoCommand.Request) returns (GetSystemInfoCommand.Feedback) {} rpc GetSystemStatus(GetSystemStatusCommand.Request) returns (GetSystemStatusCommand.Feedback) {} + + rpc UpdateParams(UpdateParamsCommand.Request) returns (UpdateParamsCommand.Feedback) {} } \ No newline at end of file diff --git a/src/device_manager/device_manager.cpp b/src/device_manager/device_manager.cpp index 67abef1e..bd4c1821 100644 --- a/src/device_manager/device_manager.cpp +++ b/src/device_manager/device_manager.cpp @@ -106,9 +106,23 @@ void DeviceManager::stop() { throw std::runtime_error("[DeviceManager] (stop): Device manager start failed: " + string(e.what())); } } - +std::shared_ptr getDeviceBasePtr(DeviceVariant& variant) { + return std::visit([](auto& device_ptr) -> std::shared_ptr { + // 利用多态,自动转换为基类指针 + return device_ptr; + }, variant); +} void DeviceManager::updateParam(const std::string& id, const std::pair ¶m){ + auto it = devices_.find(id); + if (it == devices_.end()) { + LOG(WARNING) << "[DeviceManager]: Device ID " << id << " not found."; + throw runtime_error("[DeviceManager]: Device ID " + id + " not found."); + } + // 获取基类指针(无需知道具体类型) + std::shared_ptr base_dev = getDeviceBasePtr(it->second); + // 直接调用基类中定义的通用接口 + base_dev->updateParams(param); // 调用配置接口 } diff --git a/src/devices/camera/mechmind/mechmind_camera.cpp b/src/devices/camera/mechmind/mechmind_camera.cpp index 4c14501b..d9a56b06 100644 --- a/src/devices/camera/mechmind/mechmind_camera.cpp +++ b/src/devices/camera/mechmind/mechmind_camera.cpp @@ -78,7 +78,7 @@ void MechmindCamera::stop() { } } -void MechmindCamera::getRGBImage(cv::Mat& color) { +void MechmindCamera::getRGBImage(cv::Mat& color, Rs2Intrinsics& intrinsics) { try { std::lock_guard lock(dev_mtx_); clear_error_(); @@ -123,7 +123,7 @@ void MechmindCamera::getRGBImage(cv::Mat& color) { } } -void MechmindCamera::getDepthImage(cv::Mat& depth) { +void MechmindCamera::getDepthImage(cv::Mat& depth, Rs2Intrinsics& intrinsics) { try { std::lock_guard lock(dev_mtx_); clear_error_(); @@ -149,7 +149,7 @@ void MechmindCamera::getDepthImage(cv::Mat& depth) { } } -void MechmindCamera::getRGBDImages(cv::Mat& color, cv::Mat& depth) { +void MechmindCamera::getRGBDImages(cv::Mat& color, cv::Mat& depth, Rs2Intrinsics& intrinsics) { try { std::lock_guard lock(dev_mtx_); clear_error_(); diff --git a/src/devices/camera/mechmind/mechmind_camera.h b/src/devices/camera/mechmind/mechmind_camera.h index 2d1f2e64..dc22ff91 100644 --- a/src/devices/camera/mechmind/mechmind_camera.h +++ b/src/devices/camera/mechmind/mechmind_camera.h @@ -29,9 +29,9 @@ namespace cmvr::device void init() override; void start() override; void stop() override; - void getRGBImage(cv::Mat& color) override; - void getDepthImage(cv::Mat& depth) override; - void getRGBDImages(cv::Mat &color, cv::Mat &depth) override; + void getRGBImage(cv::Mat& color, Rs2Intrinsics& intrinsics) override; + void getDepthImage(cv::Mat& depth, Rs2Intrinsics& intrinsics) override; + void getRGBDImages(cv::Mat &color, cv::Mat &depth, Rs2Intrinsics& intrinsics) override; void updateParams(const std::pair& param) override; void startRecording(const std::string &video_path) override; void stopRecording() override; diff --git a/src/devices/camera/realsense_camera/realsense_camera.cpp b/src/devices/camera/realsense_camera/realsense_camera.cpp index 3a597a30..079f5a20 100644 --- a/src/devices/camera/realsense_camera/realsense_camera.cpp +++ b/src/devices/camera/realsense_camera/realsense_camera.cpp @@ -226,7 +226,14 @@ void RealsenseCamera::stop() { } } -void RealsenseCamera::getRGBImage(cv::Mat& color) { +void RealsenseCamera::getRGBImage(cv::Mat& color, Rs2Intrinsics& intrinsics) { + intrinsics.cx = intrinsics_.ppx; + intrinsics.cy = intrinsics_.ppy; + intrinsics.fx = intrinsics_.fx; + intrinsics.fy = intrinsics_.fy; + for (int i = 0; i < 5 ; i++) { + intrinsics.coeffs[i] = intrinsics_.coeffs[i]; + } try { std::lock_guard lock(ctrl_mtx_); clear_error_(); @@ -252,8 +259,15 @@ void RealsenseCamera::getRGBImage(cv::Mat& color) { } } -void RealsenseCamera::getDepthImage(cv::Mat& depth) { +void RealsenseCamera::getDepthImage(cv::Mat& depth, Rs2Intrinsics& intrinsics) { + intrinsics.cx = intrinsics_.ppx; + intrinsics.cy = intrinsics_.ppy; + intrinsics.fx = intrinsics_.fx; + intrinsics.fy = intrinsics_.fy; + for (int i = 0; i < 5 ; i++) { + intrinsics.coeffs[i] = intrinsics_.coeffs[i]; + } auto frame = stream_frame_buffer_->pop(getImageIndex_); if (frame.has_value()) { depth = frame.value().depthImage.clone(); @@ -283,8 +297,15 @@ void RealsenseCamera::getDepthImage(cv::Mat& depth) { } } -void RealsenseCamera::getRGBDImages(cv::Mat &color, cv::Mat &depth) { +void RealsenseCamera::getRGBDImages(cv::Mat &color, cv::Mat &depth, Rs2Intrinsics& intrinsics) { + intrinsics.cx = intrinsics_.ppx; + intrinsics.cy = intrinsics_.ppy; + intrinsics.fx = intrinsics_.fx; + intrinsics.fy = intrinsics_.fy; + for (int i = 0; i < 5 ; i++) { + intrinsics.coeffs[i] = intrinsics_.coeffs[i]; + } auto frame = stream_frame_buffer_->pop(getImageIndex_); if (frame.has_value()) { color = frame.value().rgbImage.clone(); diff --git a/src/devices/camera/realsense_camera/realsense_camera.h b/src/devices/camera/realsense_camera/realsense_camera.h index f72f9712..4a56fec4 100644 --- a/src/devices/camera/realsense_camera/realsense_camera.h +++ b/src/devices/camera/realsense_camera/realsense_camera.h @@ -21,9 +21,9 @@ namespace cmvr::device{ void init() override; void start() override; void stop() override; - void getRGBImage(cv::Mat& color) override; - void getDepthImage(cv::Mat& depth) override; - void getRGBDImages(cv::Mat &color, cv::Mat &depth) override; + void getRGBImage(cv::Mat& color, Rs2Intrinsics& intrinsics) override; + void getDepthImage(cv::Mat& depth, Rs2Intrinsics& intrinsics) override; + void getRGBDImages(cv::Mat &color, cv::Mat &depth, Rs2Intrinsics& intrinsics) override; void updateParams(const std::pair& param) override; void startRecording(const std::string &video_path) override; void stopRecording() override; diff --git a/src/devices/camera/uvc_camera/uvc_camera.cpp b/src/devices/camera/uvc_camera/uvc_camera.cpp index 36a9b7cf..3d0f01f0 100644 --- a/src/devices/camera/uvc_camera/uvc_camera.cpp +++ b/src/devices/camera/uvc_camera/uvc_camera.cpp @@ -187,7 +187,7 @@ void UVCCamera::stop() { } } -void UVCCamera::getRGBImage(cv::Mat& color) +void UVCCamera::getRGBImage(cv::Mat& color, Rs2Intrinsics& intrinsics) { std::lock_guard lock(ctrl_mtx_); clear_error_(); @@ -207,11 +207,11 @@ void UVCCamera::getRGBImage(cv::Mat& color) } } -void UVCCamera::getDepthImage(cv::Mat& depth) { +void UVCCamera::getDepthImage(cv::Mat& depth, Rs2Intrinsics& intrinsics) { throw runtime_error("[UVCCamera] (getDepthImage): unsupported usage"); } -void UVCCamera::getRGBDImages(cv::Mat &color, cv::Mat &depth) { +void UVCCamera::getRGBDImages(cv::Mat &color, cv::Mat &depth, Rs2Intrinsics& intrinsics) { throw runtime_error("[UVCCamera] (getDepthImage): unsupported usage"); } diff --git a/src/devices/camera/uvc_camera/uvc_camera.h b/src/devices/camera/uvc_camera/uvc_camera.h index 87fd2e37..88db0da6 100644 --- a/src/devices/camera/uvc_camera/uvc_camera.h +++ b/src/devices/camera/uvc_camera/uvc_camera.h @@ -75,9 +75,9 @@ namespace cmvr::device { void init() override; void start() override; void stop() override; - void getRGBImage(cv::Mat& color) override; - void getDepthImage(cv::Mat& depth) override; - void getRGBDImages(cv::Mat &color, cv::Mat &depth) override; + void getRGBImage(cv::Mat& color, Rs2Intrinsics& intrinsics) override; + void getDepthImage(cv::Mat& depth, Rs2Intrinsics& intrinsics) override; + void getRGBDImages(cv::Mat &color, cv::Mat &depth, Rs2Intrinsics& intrinsics) override; void updateParams(const std::pair& param) override; void startRecording(const std::string &video_path) override; void stopRecording() override; diff --git a/src/devices/canbus/CMakeLists.txt b/src/devices/canbus/CMakeLists.txt index e7a72b00..73e6828b 100644 --- a/src/devices/canbus/CMakeLists.txt +++ b/src/devices/canbus/CMakeLists.txt @@ -13,8 +13,6 @@ add_library(cmvr_es::device::canbus ALIAS canbus) target_link_libraries(canbus PRIVATE -# proto-objects -# gRPC::grpc++ protobuf::libprotobuf glog::glog # PUBLIC pcanbasic diff --git a/src/devices/microphone/ffmpeg_microphone/ffmpeg_microphone.cpp b/src/devices/microphone/ffmpeg_microphone/ffmpeg_microphone.cpp index cf6d240e..2531427b 100644 --- a/src/devices/microphone/ffmpeg_microphone/ffmpeg_microphone.cpp +++ b/src/devices/microphone/ffmpeg_microphone/ffmpeg_microphone.cpp @@ -456,4 +456,24 @@ void ffmpegMicroPhone::closeFFmpeg() { } avformat_free_context(output_fmt_ctx); } +} + +void ffmpegMicroPhone::updateParams(const std::pair& param) +{ + std::lock_guard lock(mtx_); + try { + if (param.first == "sampleRate") { + sample_rate_ = stoi(param.second); + } + else if (param.first == "channels") { + channels_ = stoi(param.second); + } + + stop(); + init(); + start(); + } + catch (exception &e) { + throw runtime_error(e.what()); + } } \ No newline at end of file diff --git a/src/devices/microphone/ffmpeg_microphone/ffmpeg_microphone.h b/src/devices/microphone/ffmpeg_microphone/ffmpeg_microphone.h index 90eee39a..34771e7e 100644 --- a/src/devices/microphone/ffmpeg_microphone/ffmpeg_microphone.h +++ b/src/devices/microphone/ffmpeg_microphone/ffmpeg_microphone.h @@ -28,7 +28,7 @@ namespace cmvr::device { void init() override; void start() override; void stop() override; - + void updateParams(const std::pair& param) override; void getState(MicrophoneState &state) override; void startRecording(const std::string& outputFilePath) override; void stopRecording() override; diff --git a/src/devices/speaker/ffmpeg_speaker/ffmpeg_speaker.cpp b/src/devices/speaker/ffmpeg_speaker/ffmpeg_speaker.cpp index d2bf1fb3..0c50eedb 100644 --- a/src/devices/speaker/ffmpeg_speaker/ffmpeg_speaker.cpp +++ b/src/devices/speaker/ffmpeg_speaker/ffmpeg_speaker.cpp @@ -355,3 +355,23 @@ void ffmpegSpeaker::play_audio_() { //state_.is_running = false; resetPlayState(); } + +void ffmpegSpeaker::updateParams(const std::pair& param) +{ + std::lock_guard lock(mtx_); + try { + if (param.first == "sampleRate") { + sample_rate_ = stoi(param.second); + } + else if (param.first == "channels") { + channels_ = stoi(param.second); + } + + stop(); + init(); + start(); + } + catch (exception &e) { + throw runtime_error(e.what()); + } +} diff --git a/src/devices/speaker/ffmpeg_speaker/ffmpeg_speaker.h b/src/devices/speaker/ffmpeg_speaker/ffmpeg_speaker.h index f7f87c87..4c3ed890 100644 --- a/src/devices/speaker/ffmpeg_speaker/ffmpeg_speaker.h +++ b/src/devices/speaker/ffmpeg_speaker/ffmpeg_speaker.h @@ -28,6 +28,7 @@ namespace cmvr::device { void init() override; void start() override; void stop() override; + void updateParams(const std::pair& param) override; void play(const std::string& audio_path) override; void setVolume(int volume) override; [[nodiscard]] int getVolume() const override; diff --git a/src/service/grpc_camera_service.cpp b/src/service/grpc_camera_service.cpp index ddf167a6..76d49a88 100644 --- a/src/service/grpc_camera_service.cpp +++ b/src/service/grpc_camera_service.cpp @@ -90,7 +90,17 @@ grpc::Status gRPCCameraServiceImpl::GetRGBImage(grpc::ServerContext* context, LOG(INFO) << "[gRPCCameraServiceImpl] (GetRGBImage): id=" << dev_id; cv::Mat image; const auto dev = dmgr_.getDevice(dev_id); - dev->getRGBImage(image); + Rs2Intrinsics intrinsics = {0}; + dev->getRGBImage(image,intrinsics); + response->mutable_header()->set_success(true); + + response->mutable_intrinsics()->set_fx(intrinsics.fx); + response->mutable_intrinsics()->set_fy(intrinsics.fx); + response->mutable_intrinsics()->set_cx(intrinsics.fx); + response->mutable_intrinsics()->set_cy(intrinsics.fx); + for (int i = 0; i < 5 ; i++) { + response->mutable_intrinsics()->add_coeffs(intrinsics.coeffs[i]); + } response->mutable_header()->set_success(true); setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); @@ -131,8 +141,18 @@ grpc::Status gRPCCameraServiceImpl::GetDepthImage(grpc::ServerContext* context, LOG(INFO) << "[gRPCCameraServiceImpl] (GetDepthImage): id=" << dev_id; cv::Mat image; const auto dev = dmgr_.getDevice(dev_id); - dev->getRGBImage(image); + Rs2Intrinsics intrinsics = {0}; + dev->getDepthImage(image,intrinsics); response->mutable_header()->set_success(true); + + response->mutable_intrinsics()->set_fx(intrinsics.fx); + response->mutable_intrinsics()->set_fy(intrinsics.fx); + response->mutable_intrinsics()->set_cx(intrinsics.fx); + response->mutable_intrinsics()->set_cy(intrinsics.fx); + for (int i = 0; i < 5 ; i++) { + response->mutable_intrinsics()->add_coeffs(intrinsics.coeffs[i]); + } + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); if (image.type() == CV_8UC1) { @@ -175,7 +195,17 @@ grpc::Status gRPCCameraServiceImpl::GetRGBDImages(grpc::ServerContext* context, LOG(INFO) << "[gRPCCameraServiceImpl] (GetRGBDImages): id=" << dev_id; cv::Mat color_image, depth_image; const auto dev = dmgr_.getDevice(dev_id); - dev->getRGBDImages(color_image, depth_image); + Rs2Intrinsics intrinsics = {0}; + dev->getRGBDImages(color_image,depth_image, intrinsics); + response->mutable_header()->set_success(true); + + response->mutable_intrinsics()->set_fx(intrinsics.fx); + response->mutable_intrinsics()->set_fy(intrinsics.fx); + response->mutable_intrinsics()->set_cx(intrinsics.fx); + response->mutable_intrinsics()->set_cy(intrinsics.fx); + for (int i = 0; i < 5 ; i++) { + response->mutable_intrinsics()->add_coeffs(intrinsics.coeffs[i]); + } response->mutable_header()->set_success(true); setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); diff --git a/src/service/grpc_system_service.cpp b/src/service/grpc_system_service.cpp index 2b75e895..5c83dfa8 100644 --- a/src/service/grpc_system_service.cpp +++ b/src/service/grpc_system_service.cpp @@ -88,3 +88,77 @@ grpc::Status gRPCSystemServiceImpl::GetSystemStatus(grpc::ServerContext* context return grpc::Status::OK; } } + +grpc::Status gRPCSystemServiceImpl::UpdateParams(grpc::ServerContext* context, const cmvr::api::UpdateParamsCommand_Request* request, cmvr::api::UpdateParamsCommand_Feedback* response) +{ + try { + std::string dev_id = request->header().device_id(); + LOG(INFO) << "[gRPCSystemServiceImpl] (UpdateParams): id=" << dev_id; + auto params = request->params(); + for (auto& param : params) { + //遍历拿到需要配置的自由度,传入的是百分比0-1 + std::string param_name = param.param_name(); + std::string param_value_str; // 存储转换后的字符串值 + + // 根据 oneof 类型分支转换 + switch (param.param_value_case()) { + case cmvr::api::ConfigParam::kIntValue: { + // 整数类型:用 std::to_string 转换 + int32_t int_val = param.int_value(); + param_value_str = std::to_string(int_val); + break; + } + case cmvr::api::ConfigParam::kDoubleValue: { + // 浮点数类型:用 std::to_string 转换(也可按需用 printf 控制精度) + double double_val = param.double_value(); + param_value_str = std::to_string(double_val); + // (可选)若需控制浮点数精度(如保留2位小数),可替换为: + // char buf[64]; + // snprintf(buf, sizeof(buf), "%.2f", double_val); + // param_value_str = buf; + break; + } + case cmvr::api::ConfigParam::kStringValue: { + // 字符串类型:直接赋值(本身就是 string) + param_value_str = param.string_value(); + break; + } + case cmvr::api::ConfigParam::kBoolValue: { + // 布尔类型:转为 "true" 或 "false" + bool bool_val = param.bool_value(); + param_value_str = bool_val ? "true" : "false"; + break; + } + case cmvr::api::ConfigParam::kBytesValue: { + // 二进制类型:可选方案(二选一,根据你的需求) + // 方案1:转为十六进制字符串(推荐,二进制数据可视化) + const auto& bytes_val = param.bytes_value(); + static const char hex_chars[] = "0123456789ABCDEF"; + std::string hex_str; + hex_str.reserve(bytes_val.size() * 2); // 预分配空间,提升效率 + for (unsigned char c : bytes_val) { + hex_str.push_back(hex_chars[c >> 4]); + hex_str.push_back(hex_chars[c & 0x0F]); + } + param_value_str = hex_str; // 结果如 "A3B2C1" + break; + } + case cmvr::api::ConfigParam::PARAM_VALUE_NOT_SET: { + // 未设置值的异常场景:赋值为空字符串或标记 + param_value_str = "[UNSET]"; + LOG(WARNING) << "[UpdateParams] Param '" << param_name << "' has no value"; + break; + } + } + + dmgr_.updateParam(dev_id,std::pair(param_name,param_value_str)); + } + return grpc::Status::OK; + } + catch (std::exception& e) { + response->mutable_header()->set_success(false); + response->mutable_header()->set_error_message(e.what()); + setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); + return grpc::Status::OK; + } +} \ No newline at end of file