cmvr-es/src/service/grpc_system_service.cpp
2025-08-27 15:30:51 +08:00

164 lines
7.2 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.

//
// 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<std::pair<std::string, std::string>> 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<std::string,std::string>(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;
}
}