// // Created by xtkuang on 2025/6/6. // #include "service/grpc_system_service.h" using namespace cmvr::device; using namespace cmvr::device; using namespace cmvr::service; gRPCSystemServiceImpl::gRPCSystemServiceImpl(): dmgr_(DeviceManager::getInstance()) {} grpc::Status gRPCSystemServiceImpl::GetSystemInfo(grpc::ServerContext* context, const api::GetSystemInfoCommand_Request* request, api::GetSystemInfoCommand_Feedback* response) { try { SystemInfo info; dmgr_.getSystemInfo(info); response->set_version(info.version); response->set_system_name(info.name); response->set_os(info.os); response->set_kernel_version(info.kernel_version); response->set_architecture(info.architecture); response->mutable_header()->set_success(true); setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); 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; } } grpc::Status gRPCSystemServiceImpl::GetSystemStatus(grpc::ServerContext* context, const api::GetSystemStatusCommand_Request* request, api::GetSystemStatusCommand_Feedback* response) { try { SystemStatus status{}; dmgr_.getSystemStatus(status); response->set_cpu_usage(status.cpu_usage); response->set_mem_total_mb(status.total_memory); response->set_mem_used_mb(status.used_memory); response->set_disk_total_gb(status.total_disk); response->set_disk_used_gb(status.used_disk); std::list> dev_list; dmgr_.getDeviceList(dev_list); for (auto &pair: dev_list) { auto* dev = response->add_device_list(); dev->set_device_id(pair.first); if (pair.second == "AGV") { dev->set_device_type(api::DeviceType::AGV); } else if (pair.second == "Battery") { dev->set_device_type(api::DeviceType::Battery); } else if (pair.second == "Camera") { dev->set_device_type(api::DeviceType::Camera); } else if (pair.second == "DexHand") { dev->set_device_type(api::DeviceType::DexHand); } else if (pair.second == "Gripper") { dev->set_device_type(api::DeviceType::Gripper); } else if (pair.second == "Microphone") { dev->set_device_type(api::DeviceType::Microphone); } else if (pair.second == "Robot") { dev->set_device_type(api::DeviceType::Robot); } else if (pair.second == "Speaker") { dev->set_device_type(api::DeviceType::Speaker); } else if (pair.second == "Unknown") { dev->set_device_type(api::DeviceType::Unknown); } } response->mutable_header()->set_success(true); setCurrentTimestamp(response->mutable_header()->mutable_timestamp()); return grpc::Status::OK; } catch (const 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; } } 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; } }