164 lines
7.2 KiB
C++
164 lines
7.2 KiB
C++
//
|
||
// 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;
|
||
}
|
||
} |