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