update HardWareManager

This commit is contained in:
linbo 2025-10-22 16:40:55 +08:00
parent c8cb7fcc2b
commit 53fb1f1d6d
22 changed files with 340 additions and 18 deletions

View File

@ -78,11 +78,3 @@ target_link_libraries(robot_wrapper PRIVATE
fcl fcl
cmvr_es::device_manager cmvr_es::device_manager
${OpenCV_LIBS}) ${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})

View File

@ -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

View File

@ -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<MotorManager> motor_;
};
}
#endif //CMVR_ES_CAN_GROUP_H

View File

@ -0,0 +1,26 @@
//
// Created by linbo on 2025/10/22.
//
#ifndef CMVR_ES_CAN_MANAGER_H
#define CMVR_ES_CAN_MANAGER_H
#include <unordered_map>
#include <string>
#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<std::string,std::shared_ptr<CanGroup>> canGroups_;
};
}
#endif //CMVR_ES_CAN_MANAGER_H

View File

@ -0,0 +1,25 @@
//
// Created by linbo on 2025/10/22.
//
#ifndef CMVR_ES_MOTORMANAGER_H
#define CMVR_ES_MOTORMANAGER_H
#include <unordered_map>
#include <memory>
#include "abstractmotor.h"
namespace cmvr::device
{
class MotorManager
{
public:
explicit MotorManager(const XmlNode &cfg);
~MotorManager();
private:
std::unordered_map<int, std::shared_ptr<AbstractMotor>> m_motors;//以id区分电机
};
}
#endif //CMVR_ES_MOTORMANAGER_H

View File

@ -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

View File

@ -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

View File

@ -5,10 +5,21 @@
#ifndef CMVR_ES_HARDWARE_FACTORY_H #ifndef CMVR_ES_HARDWARE_FACTORY_H
#define 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<typename HardwareType>
std::shared_ptr<HardwareType> create(const XmlNode& cfg);
private:
std::shared_ptr<CanManager> create_can_(const XmlNode& cfg);
};
}
#endif //CMVR_ES_HARDWARE_FACTORY_H #endif //CMVR_ES_HARDWARE_FACTORY_H

View File

@ -4,11 +4,31 @@
#ifndef CMVR_ES_HARDWARE_MANAGER_H #ifndef CMVR_ES_HARDWARE_MANAGER_H
#define CMVR_ES_HARDWARE_MANAGER_H #define CMVR_ES_HARDWARE_MANAGER_H
#include "rapidxml/xml_parser.h"
#include <glog/logging.h>
#include <mutex>
namespace cmvr::device
class hardware_manager
{ {
}; 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<HardWareManager> instance_;
explicit HardWareManager(const XmlNode &cfg);
};
}
#endif //CMVR_ES_HARDWARE_MANAGER_H #endif //CMVR_ES_HARDWARE_MANAGER_H

View File

@ -6,7 +6,6 @@
using namespace std; using namespace std;
using namespace cmvr::device; using namespace cmvr::device;
using namespace cmvr::device;
template std::shared_ptr<AbstractAGV> DeviceManager::getDevice(const std::string& device_id); template std::shared_ptr<AbstractAGV> DeviceManager::getDevice(const std::string& device_id);
template std::shared_ptr<AbstractBattery> DeviceManager::getDevice(const std::string& device_id); template std::shared_ptr<AbstractBattery> DeviceManager::getDevice(const std::string& device_id);

View File

@ -10,3 +10,6 @@ target_include_directories(hardware PUBLIC
) )
add_library(cmvr_es::hardware ALIAS hardware) add_library(cmvr_es::hardware ALIAS hardware)
add_subdirectory(can)
add_subdirectory(serial)

View File

@ -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)

View File

@ -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<MotorManager>(cfg);
}

View File

@ -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<CanGroup>(cfg);
}
}
}

View File

@ -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<Ti5Motor>(cfg);
}
}
}

View File

@ -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)
{
}

View File

@ -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)

View File

@ -0,0 +1,5 @@
//
// Created by linbo on 2025/10/22.
//
#include "hardware/serial/serial_manager.h"

View File

@ -1,7 +1,8 @@
add_library(hardware_manager SHARED add_library(hardware_manager SHARED
hardware_factory.cpp hardware_factory.cpp
hardware_manager.cpp hardware_manager.cpp
../hardware/can/can_manager.cpp
../hardware/serial/serial_manager.cpp
) )
target_include_directories(hardware_manager PUBLIC target_include_directories(hardware_manager PUBLIC

View File

@ -3,3 +3,25 @@
// //
#include "hardware_manager/hardware_factory.h" #include "hardware_manager/hardware_factory.h"
#include <glog/logging.h>
using namespace std;
using namespace cmvr::device;
template std::shared_ptr<CanManager> HardwareFactory::create<CanManager>(const XmlNode&);
template <typename HardwareType>
std::shared_ptr<HardwareType> HardwareFactory::create(const XmlNode& cfg) {
if constexpr (std::is_same_v<HardwareType, CanManager>) {
return create_can_(cfg);
}
else {
LOG(ERROR) << "[DeviceFactory]: Unsupported device type";
throw runtime_error("[DeviceFactory]: Unsupported device type");
}
}
std::shared_ptr<CanManager> HardwareFactory::create_can_(const XmlNode& cfg) {
return nullptr;
}

View File

@ -3,3 +3,34 @@
// //
#include "hardware_manager/hardware_manager.h" #include "hardware_manager/hardware_manager.h"
using namespace std;
using namespace cmvr::device;
std::shared_ptr<HardWareManager> 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();
}

View File

@ -16,7 +16,7 @@ target_link_libraries(service PRIVATE
gRPC::grpc++ gRPC::grpc++
protobuf::libprotobuf protobuf::libprotobuf
cmvr_es::device_manager cmvr_es::device_manager
cmvr_es::ctrl::controller cmvr_es::ctrl::controller
) )
add_library(cmvr_es::service ALIAS service) add_library(cmvr_es::service ALIAS service)