From 53fb1f1d6d8be2bab7f42967d2bebb01536f639c Mon Sep 17 00:00:00 2001 From: linbo <1034003879@qq.com> Date: Wed, 22 Oct 2025 16:40:55 +0800 Subject: [PATCH] update HardWareManager --- example/CMakeLists.txt | 8 ----- include/hardware/can/abstractmotor.h | 35 +++++++++++++++++++++ include/hardware/can/can_group.h | 23 ++++++++++++++ include/hardware/can/can_manager.h | 26 +++++++++++++++ include/hardware/can/motormanager.h | 25 +++++++++++++++ include/hardware/can/ti5motor.h | 21 +++++++++++++ include/hardware/serial/serial_manager.h | 15 +++++++++ include/hardware_manager/hardware_factory.h | 17 ++++++++-- include/hardware_manager/hardware_manager.h | 26 +++++++++++++-- src/device_manager/device_manager.cpp | 1 - src/hardware/CMakeLists.txt | 5 ++- src/hardware/can/CMakeLists.txt | 14 +++++++++ src/hardware/can/can_group.cpp | 13 ++++++++ src/hardware/can/can_manager.cpp | 21 +++++++++++++ src/hardware/can/motormanager.cpp | 23 ++++++++++++++ src/hardware/can/ti5motor.cpp | 11 +++++++ src/hardware/serial/CMakeLists.txt | 11 +++++++ src/hardware/serial/serial_manager.cpp | 5 +++ src/hardware_manager/CMakeLists.txt | 3 +- src/hardware_manager/hardware_factory.cpp | 22 +++++++++++++ src/hardware_manager/hardware_manager.cpp | 31 ++++++++++++++++++ src/service/grpc_service/CMakeLists.txt | 2 +- 22 files changed, 340 insertions(+), 18 deletions(-) create mode 100644 include/hardware/can/abstractmotor.h create mode 100644 include/hardware/can/can_group.h create mode 100644 include/hardware/can/can_manager.h create mode 100644 include/hardware/can/motormanager.h create mode 100644 include/hardware/can/ti5motor.h create mode 100644 include/hardware/serial/serial_manager.h create mode 100644 src/hardware/can/CMakeLists.txt create mode 100644 src/hardware/can/can_group.cpp create mode 100644 src/hardware/can/can_manager.cpp create mode 100644 src/hardware/can/motormanager.cpp create mode 100644 src/hardware/can/ti5motor.cpp create mode 100644 src/hardware/serial/CMakeLists.txt create mode 100644 src/hardware/serial/serial_manager.cpp diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 1bf15c5d..d4ca56c3 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -78,11 +78,3 @@ target_link_libraries(robot_wrapper PRIVATE fcl cmvr_es::device_manager ${OpenCV_LIBS}) - - -add_executable(moveL moveL.cpp) -target_link_libraries(moveL PRIVATE cmvr_es::utils) - -add_executable(speedL speedL.cpp) -target_include_directories(speedL PRIVATE ${GLOG_INCLUDE_DIRS}) -target_link_libraries(speedL PRIVATE cmvr_es::utils ${GLOG_LIBRARIES}) \ No newline at end of file diff --git a/include/hardware/can/abstractmotor.h b/include/hardware/can/abstractmotor.h new file mode 100644 index 00000000..a7ccd875 --- /dev/null +++ b/include/hardware/can/abstractmotor.h @@ -0,0 +1,35 @@ +// +// Created by linbo on 2025/10/22. +// + +#ifndef CMVR_ES_ABSTRACTMOTOR_H +#define CMVR_ES_ABSTRACTMOTOR_H +#include "rapidxml/xml_parser.h" + +namespace cmvr::device +{ + class AbstractMotor + { + public: + explicit AbstractMotor(const XmlNode &cfg) + { + cfg_ = cfg; + id_ = cfg.getAttrString("id"); + joint_name_ = cfg.getAttrString("joint_name"); + limitQLb_ = cfg.getAttrDefault("limitQLb_",(float)3.14); + limitQUb_ = cfg.getAttrDefault("limitQUb_",(float)3.14); + limitQd = cfg.getAttrDefault("limitQd",(float)3.0); + } + ~AbstractMotor() = default; + + private: + XmlNode cfg_; + std::string id_; + std::string joint_name_; + double limitQLb_; + double limitQUb_; + double limitQd; + }; +} + +#endif //CMVR_ES_ABSTRACTMOTOR_H \ No newline at end of file diff --git a/include/hardware/can/can_group.h b/include/hardware/can/can_group.h new file mode 100644 index 00000000..9ade42ba --- /dev/null +++ b/include/hardware/can/can_group.h @@ -0,0 +1,23 @@ +// +// Created by linbo on 2025/10/22. +// + +#ifndef CMVR_ES_CAN_GROUP_H +#define CMVR_ES_CAN_GROUP_H + +#include "motormanager.h" +namespace cmvr::device +{ + class CanGroup + { + public: + explicit CanGroup(const XmlNode &cfg); + ~CanGroup() = default; + private: + + std::shared_ptr motor_; + }; +} + + +#endif //CMVR_ES_CAN_GROUP_H \ No newline at end of file diff --git a/include/hardware/can/can_manager.h b/include/hardware/can/can_manager.h new file mode 100644 index 00000000..dbe07005 --- /dev/null +++ b/include/hardware/can/can_manager.h @@ -0,0 +1,26 @@ +// +// Created by linbo on 2025/10/22. +// + +#ifndef CMVR_ES_CAN_MANAGER_H +#define CMVR_ES_CAN_MANAGER_H +#include +#include + +#include "rapidxml/rapidxml.hpp" +#include "can_group.h" +namespace cmvr::device +{ + class CanManager + { + + public: + explicit CanManager(const XmlNode &cfg); + ~CanManager(); + private: + //CanGroup + std::unordered_map> canGroups_; + }; +} + +#endif //CMVR_ES_CAN_MANAGER_H \ No newline at end of file diff --git a/include/hardware/can/motormanager.h b/include/hardware/can/motormanager.h new file mode 100644 index 00000000..9387e249 --- /dev/null +++ b/include/hardware/can/motormanager.h @@ -0,0 +1,25 @@ +// +// Created by linbo on 2025/10/22. +// + +#ifndef CMVR_ES_MOTORMANAGER_H +#define CMVR_ES_MOTORMANAGER_H + +#include +#include +#include "abstractmotor.h" + +namespace cmvr::device +{ + class MotorManager + { + public: + explicit MotorManager(const XmlNode &cfg); + ~MotorManager(); + private: + std::unordered_map> m_motors;//以id区分电机? + }; +} + + +#endif //CMVR_ES_MOTORMANAGER_H \ No newline at end of file diff --git a/include/hardware/can/ti5motor.h b/include/hardware/can/ti5motor.h new file mode 100644 index 00000000..758f34a0 --- /dev/null +++ b/include/hardware/can/ti5motor.h @@ -0,0 +1,21 @@ +// +// Created by linbo on 2025/10/22. +// + +#ifndef CMVR_ES_TI5MOTOR_H +#define CMVR_ES_TI5MOTOR_H + +#include "rapidxml/xml_parser.h" + +namespace cmvr::device{ + class Ti5Motor + { + public: + explicit Ti5Motor(const XmlNode &cfg); + + private: + + }; +} + +#endif //CMVR_ES_TI5MOTOR_H \ No newline at end of file diff --git a/include/hardware/serial/serial_manager.h b/include/hardware/serial/serial_manager.h new file mode 100644 index 00000000..350fdeaa --- /dev/null +++ b/include/hardware/serial/serial_manager.h @@ -0,0 +1,15 @@ +// +// Created by linbo on 2025/10/22. +// + +#ifndef CMVR_ES_SERIAL_MANAGER_H +#define CMVR_ES_SERIAL_MANAGER_H + +namespace cmvr::device +{ + class serial_manager + { + }; +} + +#endif //CMVR_ES_SERIAL_MANAGER_H \ No newline at end of file diff --git a/include/hardware_manager/hardware_factory.h b/include/hardware_manager/hardware_factory.h index 147f3990..0ae04f79 100644 --- a/include/hardware_manager/hardware_factory.h +++ b/include/hardware_manager/hardware_factory.h @@ -5,10 +5,21 @@ #ifndef CMVR_ES_HARDWARE_FACTORY_H #define CMVR_ES_HARDWARE_FACTORY_H +#include "rapidxml/xml_parser.h" +#include "hardware/can/can_manager.h" +namespace cmvr::device { -class hardware_factory -{ -}; + class HardwareFactory { + public: + HardwareFactory() = default; + + template + std::shared_ptr create(const XmlNode& cfg); + private: + std::shared_ptr create_can_(const XmlNode& cfg); + }; +} + #endif //CMVR_ES_HARDWARE_FACTORY_H \ No newline at end of file diff --git a/include/hardware_manager/hardware_manager.h b/include/hardware_manager/hardware_manager.h index 54601a31..cd0dd35a 100644 --- a/include/hardware_manager/hardware_manager.h +++ b/include/hardware_manager/hardware_manager.h @@ -4,11 +4,31 @@ #ifndef CMVR_ES_HARDWARE_MANAGER_H #define CMVR_ES_HARDWARE_MANAGER_H +#include "rapidxml/xml_parser.h" +#include +#include - -class hardware_manager +namespace cmvr::device { -}; + class HardWareManager + { + public: + HardWareManager(const HardWareManager&) = delete; + HardWareManager& operator=(const HardWareManager&) = delete; + static HardWareManager& getInstance(const XmlNode &cfg); + static HardWareManager& getInstance(); + static void destroyInstance(); + + + + + private: + XmlNode cfg_; + static std::once_flag init_flag_; + static std::shared_ptr instance_; + explicit HardWareManager(const XmlNode &cfg); + }; +} #endif //CMVR_ES_HARDWARE_MANAGER_H \ No newline at end of file diff --git a/src/device_manager/device_manager.cpp b/src/device_manager/device_manager.cpp index bd4c1821..8150e8ca 100644 --- a/src/device_manager/device_manager.cpp +++ b/src/device_manager/device_manager.cpp @@ -6,7 +6,6 @@ using namespace std; using namespace cmvr::device; -using namespace cmvr::device; template std::shared_ptr DeviceManager::getDevice(const std::string& device_id); template std::shared_ptr DeviceManager::getDevice(const std::string& device_id); diff --git a/src/hardware/CMakeLists.txt b/src/hardware/CMakeLists.txt index f7ef8250..3bf1e5e2 100644 --- a/src/hardware/CMakeLists.txt +++ b/src/hardware/CMakeLists.txt @@ -9,4 +9,7 @@ target_include_directories(hardware PUBLIC ${PROJECT_SOURCE_DIR}/include ) -add_library(cmvr_es::hardware ALIAS hardware) \ No newline at end of file +add_library(cmvr_es::hardware ALIAS hardware) + +add_subdirectory(can) +add_subdirectory(serial) \ No newline at end of file diff --git a/src/hardware/can/CMakeLists.txt b/src/hardware/can/CMakeLists.txt new file mode 100644 index 00000000..85ecc50d --- /dev/null +++ b/src/hardware/can/CMakeLists.txt @@ -0,0 +1,14 @@ +add_library(can + motormanager.cpp + can_group.cpp + can_manager.cpp + ti5motor.cpp +) + +target_include_directories(can PUBLIC ${PROJECT_SOURCE_DIR}/include) + +target_link_libraries(can PRIVATE + protobuf::libprotobuf +) + +add_library(cmvr_es::can ALIAS can) \ No newline at end of file diff --git a/src/hardware/can/can_group.cpp b/src/hardware/can/can_group.cpp new file mode 100644 index 00000000..9c6793af --- /dev/null +++ b/src/hardware/can/can_group.cpp @@ -0,0 +1,13 @@ +// +// Created by linbo on 2025/10/22. +// + +#include "hardware/can/can_group.h" + +using namespace std; +using namespace cmvr::device; + +CanGroup::CanGroup(const XmlNode &cfg) +{ + motor_ = std::make_shared(cfg); +} \ No newline at end of file diff --git a/src/hardware/can/can_manager.cpp b/src/hardware/can/can_manager.cpp new file mode 100644 index 00000000..2a0cef6e --- /dev/null +++ b/src/hardware/can/can_manager.cpp @@ -0,0 +1,21 @@ +// +// Created by linbo on 2025/10/22. +// + +#include "hardware/can/can_manager.h" + +using namespace std; +using namespace cmvr::device; + +CanManager::CanManager(const XmlNode& cfg) +{ + for (auto &node: cfg.getChildren()){ + if (node.getNodeName() == "CanGroup") + { + string id = node.getAttrString("id"); + + + canGroups_[id] = std::make_shared(cfg); + } + } +} diff --git a/src/hardware/can/motormanager.cpp b/src/hardware/can/motormanager.cpp new file mode 100644 index 00000000..d678155f --- /dev/null +++ b/src/hardware/can/motormanager.cpp @@ -0,0 +1,23 @@ +// +// Created by linbo on 2025/10/22. +// + +#include "hardware/can/motormanager.h" +#include "hardware/can/ti5motor.h" + +using namespace std; +using namespace cmvr::device; + + + +MotorManager::MotorManager(const XmlNode &cfg) +{ + for (auto &node: cfg.getChildren()){ + if (node.getNodeName() == "Ti5Motor") + { + string id = node.getAttrString("id"); + + std::make_shared(cfg); + } + } +} diff --git a/src/hardware/can/ti5motor.cpp b/src/hardware/can/ti5motor.cpp new file mode 100644 index 00000000..1789796d --- /dev/null +++ b/src/hardware/can/ti5motor.cpp @@ -0,0 +1,11 @@ +// +// Created by linbo on 2025/10/22. +// + +#include "hardware/can/ti5motor.h" +using namespace cmvr::device; + +Ti5Motor::Ti5Motor(const XmlNode &cfg) +{ + +} \ No newline at end of file diff --git a/src/hardware/serial/CMakeLists.txt b/src/hardware/serial/CMakeLists.txt new file mode 100644 index 00000000..23789efb --- /dev/null +++ b/src/hardware/serial/CMakeLists.txt @@ -0,0 +1,11 @@ +add_library(serial + serial_manager.cpp +) + +target_include_directories(serial PUBLIC ${PROJECT_SOURCE_DIR}/include) + +target_link_libraries(serial PRIVATE + protobuf::libprotobuf +) + +add_library(cmvr_es::serial ALIAS serial) \ No newline at end of file diff --git a/src/hardware/serial/serial_manager.cpp b/src/hardware/serial/serial_manager.cpp new file mode 100644 index 00000000..81d19e6a --- /dev/null +++ b/src/hardware/serial/serial_manager.cpp @@ -0,0 +1,5 @@ +// +// Created by linbo on 2025/10/22. +// + +#include "hardware/serial/serial_manager.h" diff --git a/src/hardware_manager/CMakeLists.txt b/src/hardware_manager/CMakeLists.txt index 602393aa..e8cf37da 100644 --- a/src/hardware_manager/CMakeLists.txt +++ b/src/hardware_manager/CMakeLists.txt @@ -1,7 +1,8 @@ add_library(hardware_manager SHARED hardware_factory.cpp hardware_manager.cpp - + ../hardware/can/can_manager.cpp + ../hardware/serial/serial_manager.cpp ) target_include_directories(hardware_manager PUBLIC diff --git a/src/hardware_manager/hardware_factory.cpp b/src/hardware_manager/hardware_factory.cpp index fdc05999..b3f3d7cb 100644 --- a/src/hardware_manager/hardware_factory.cpp +++ b/src/hardware_manager/hardware_factory.cpp @@ -3,3 +3,25 @@ // #include "hardware_manager/hardware_factory.h" +#include + +using namespace std; +using namespace cmvr::device; + +template std::shared_ptr HardwareFactory::create(const XmlNode&); + +template +std::shared_ptr HardwareFactory::create(const XmlNode& cfg) { + if constexpr (std::is_same_v) { + return create_can_(cfg); + } + else { + LOG(ERROR) << "[DeviceFactory]: Unsupported device type"; + throw runtime_error("[DeviceFactory]: Unsupported device type"); + } +} + + +std::shared_ptr HardwareFactory::create_can_(const XmlNode& cfg) { + return nullptr; +} \ No newline at end of file diff --git a/src/hardware_manager/hardware_manager.cpp b/src/hardware_manager/hardware_manager.cpp index ca34a8c1..b83a6eb8 100644 --- a/src/hardware_manager/hardware_manager.cpp +++ b/src/hardware_manager/hardware_manager.cpp @@ -3,3 +3,34 @@ // #include "hardware_manager/hardware_manager.h" +using namespace std; +using namespace cmvr::device; +std::shared_ptr HardWareManager::instance_ = nullptr; + +HardWareManager::HardWareManager(const XmlNode& cfg) { + try { + cfg_ = cfg; + } + catch (const exception &e) { + LOG(FATAL) << "[HardWareManager] (HardWareManager): Device manager initialization failed: " << e.what(); + throw std::runtime_error("[HardWareManager] (HardWareManager): Device manager create failed" + string(e.what())); + } +} + +HardWareManager& HardWareManager::getInstance(const XmlNode& cfg) { + std::call_once(init_flag_, [&cfg] { + instance_.reset(new HardWareManager(cfg)); + }); + return *instance_; +} + +HardWareManager& HardWareManager::getInstance() { + if (!instance_) { + throw std::runtime_error("[HardWareManager] (getInstance): HardWareManager not initialized. Call getInstance(const XmlNode&) first."); + } + return *instance_; +} + +void HardWareManager::destroyInstance() { + instance_.reset(); +} \ No newline at end of file diff --git a/src/service/grpc_service/CMakeLists.txt b/src/service/grpc_service/CMakeLists.txt index 94f44e99..88edc48d 100644 --- a/src/service/grpc_service/CMakeLists.txt +++ b/src/service/grpc_service/CMakeLists.txt @@ -16,7 +16,7 @@ target_link_libraries(service PRIVATE gRPC::grpc++ protobuf::libprotobuf cmvr_es::device_manager - cmvr_es::ctrl::controller + cmvr_es::ctrl::controller ) add_library(cmvr_es::service ALIAS service)