From 7582ebcb5688ed1b4c10ac1eee9481e85955ef08 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 27 Apr 2023 10:33:31 +0800 Subject: [PATCH] update --- .project/cmake/deps.cmake | 6 ++++- .project/cmake/target.cmake | 1 + dep/iflytopcpp | 2 +- dep/zlinuxcomponents | 2 +- src/configs/gconfig.hpp | 7 ++++- src/service/can.cpp | 0 src/service/can.hpp | 0 src/service/can_service.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++++ src/service/can_service.hpp | 33 +++++++++++++++++++----- 9 files changed, 104 insertions(+), 10 deletions(-) delete mode 100644 src/service/can.cpp delete mode 100644 src/service/can.hpp diff --git a/.project/cmake/deps.cmake b/.project/cmake/deps.cmake index 71ad1c3..e90e48f 100644 --- a/.project/cmake/deps.cmake +++ b/.project/cmake/deps.cmake @@ -4,7 +4,11 @@ include(${CMAKE_SOURCE_DIR}/dep/websocketpp/module.cmake) include(${CMAKE_SOURCE_DIR}/dep/zservice_container/module.cmake) include(${CMAKE_SOURCE_DIR}/dep/zwebservice/module.cmake) include(${CMAKE_SOURCE_DIR}/dep/zlinuxcomponents/alsaplayer/module.cmake) -include(${CMAKE_SOURCE_DIR}/dep/zlinuxcomponents/rootfs_auto_update/module.cmake) +include( + ${CMAKE_SOURCE_DIR}/dep/zlinuxcomponents/rootfs_auto_update/module.cmake) include(${CMAKE_SOURCE_DIR}/dep/zlinuxcomponents/mycroft_precise/module.cmake) include(${CMAKE_SOURCE_DIR}/dep/zlinuxcomponents/audio/module.cmake) include(${CMAKE_SOURCE_DIR}/dep/zlinuxcomponents/aiui_ws/module.cmake) +include( + ${CMAKE_SOURCE_DIR}/dep/zlinuxcomponents/iflytop_can_protocol_stack/module.cmake +) diff --git a/.project/cmake/target.cmake b/.project/cmake/target.cmake index 7d174ce..3c71649 100644 --- a/.project/cmake/target.cmake +++ b/.project/cmake/target.cmake @@ -14,6 +14,7 @@ zadd_executable_simple( # src/test/socketcan.cpp src/service/main_control_service.cpp # src/service/iflytop_hardware_ws_service.cpp + src/service/can_service.cpp # ) diff --git a/dep/iflytopcpp b/dep/iflytopcpp index f186de7..5bcf536 160000 --- a/dep/iflytopcpp +++ b/dep/iflytopcpp @@ -1 +1 @@ -Subproject commit f186de7700bf4550ce2420d1cd87d43a5a1bfc39 +Subproject commit 5bcf536387d8b316efc986e3497c14c5e61cfdaa diff --git a/dep/zlinuxcomponents b/dep/zlinuxcomponents index eb8fc79..3be3c3e 160000 --- a/dep/zlinuxcomponents +++ b/dep/zlinuxcomponents @@ -1 +1 @@ -Subproject commit eb8fc79706c1d240c399db75fda5c9f4e592514c +Subproject commit 3be3c3ef0f52649cbc6e1b7d5fab7668d6b17edc diff --git a/src/configs/gconfig.hpp b/src/configs/gconfig.hpp index a9d4b42..24acb97 100644 --- a/src/configs/gconfig.hpp +++ b/src/configs/gconfig.hpp @@ -14,7 +14,12 @@ #include "iflytopcpp/core/components/config_template/config_template.hpp" -#define ConfigELEMENT_LIST(marco) marco(string /* */, deviceId, "") /*设备ID*/ +#define ConfigELEMENT_LIST(marco) \ + marco(string /* */, deviceId, "") /*设备ID*/ \ + marco(string /* */, iflytopSubDeviceCanIFName, "can0") /*子设备Can设备名称*/ \ + marco(int32_t /* */, iflytopSubDeviceCanBitrate, 500000) /*子设备Can设备波特率*/ \ + marco(string /* */, pipettingRobotCanIFName, "can1") /*移液臂Can设备名称*/ \ + marco(int32_t /* */, pipettingRobotCanBitrate, 500000) /*移液臂Can设备波特率*/ configTemplateDEFILE_CONFIG_SERVICE2( // GConfig, // diff --git a/src/service/can.cpp b/src/service/can.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/src/service/can.hpp b/src/service/can.hpp deleted file mode 100644 index e69de29..0000000 diff --git a/src/service/can_service.cpp b/src/service/can_service.cpp index e69de29..1949ea9 100644 --- a/src/service/can_service.cpp +++ b/src/service/can_service.cpp @@ -0,0 +1,63 @@ +#include "can_service.hpp" +using namespace std; +using namespace iflytop; + +void CanService::initialize() { + GET_TO_SERVICE(m_config); + + m_socketCan.reset(new SocketCan()); + m_iflytopCanProtocolStack.reset(new IflytopCanProtocolStack()); + + auto socketCanConfig = make_shared(); + socketCanConfig->enablLoopback = false; // 根据 SocketCan::dumpCanDriverInfo() 的输出,确定该标志位是false还是true + socketCanConfig->m_canName = m_config->get_iflytopSubDeviceCanIFName(); + socketCanConfig->m_canBaudrate = m_config->get_iflytopSubDeviceCanBitrate(); + socketCanConfig->m_canfilters = {}; + + logger->info("CanService::initialize() m_canName:{} {}", socketCanConfig->m_canName, socketCanConfig->m_canBaudrate); + + m_socketCan->initialize(socketCanConfig); + m_socketCan->startListen(); + + m_socketCan->onSocketCanFrame.connect([this](shared_ptr canframe) { // + processRx(canframe); + }); + + // m_socketCan->initialize() +} + +void CanService::processRx(shared_ptr frame) { + if (frame) { + return; + } + + if (frame->getCanIdentifier() == socketcan::kextFrame && // + frame->getFanFrameType() == socketcan::kdataframe) { + processIflytopRxPacket(frame); + } else { + logger->warn("Rx unknown can frame"); + } +} +void CanService::processHamiltonCanRxPacket(shared_ptr frame) { // + logger->info("Rx Hamilton packet : {}", frame->toString()); +} +void CanService::processIflytopRxPacket(shared_ptr frame) { + shared_ptr icps_packet = m_iflytopCanProtocolStack->parseSocketCanFrame(frame); + if (!icps_packet) { + logger->error("parseSocketCanFrame fail,{}", frame->toString()); + return; + } + onIflytopCanSubDevicePacket(icps_packet); +} + +void CanService::sendPacketToIflytopCanSubDevice(shared_ptr icps_packet) { + auto frame = m_iflytopCanProtocolStack->createSocketCanFrame(icps_packet); + if (!frame) { + logger->error("createSocketCanFrame fail,{}", icps_packet->toString()); + return; + } + SocketCan::SocketCanError_t erro = m_socketCan->sendFrame(frame); + if (erro != SocketCan::SocketCanError_t::kSuccess) { + logger->error("sendFrame fail,{}", SocketCan::SocketCanError_t2Str(erro)); + } +} diff --git a/src/service/can_service.hpp b/src/service/can_service.hpp index 2f1ad3e..907deb5 100644 --- a/src/service/can_service.hpp +++ b/src/service/can_service.hpp @@ -13,29 +13,50 @@ #include #include +#include "configs/gconfig.hpp" +#include "iflytopcpp/core/basic/nlohmann/json.hpp" +#include "iflytopcpp/core/driver/socketcan/socket_can.hpp" #include "iflytopcpp/core/spdlogfactory/logger.hpp" +#include "zlinuxcomponents/iflytop_can_protocol_stack/iflytop_can_protocol_stack.hpp" +#include "zservice_container/zservice_container.hpp" /** * @brief * * service: CanService * - * 监听事件: - * 依赖状态: - * 依赖服务: - * 作用: - * + * 1. 负责监听,分流IflytopSubDevice的CAN消息和哈美顿的CAN消息 + * 2. 负责将CanFrame转换成IflytopCanPacket */ namespace iflytop { using namespace std; using namespace iflytop; using namespace core; +using namespace nlohmann; class CanService : public enable_shared_from_this { ENABLE_LOGGER(CanService); + shared_ptr m_socketCan; + shared_ptr m_config; + + shared_ptr m_iflytopCanProtocolStack; + public: - void initialize(){}; + nod::signal packet)> onIflytopCanSubDevicePacket; + + void initialize(); + void startListen(); + + void sendPacketToIflytopCanSubDevice(shared_ptr packet); + + private: + void processRx(shared_ptr frame); + // 处理iflytop子设备的CAN消息 + void processIflytopRxPacket(shared_ptr frame); + // 处理哈美顿的CAN消息 + void processHamiltonCanRxPacket(shared_ptr frame); + private: }; } // namespace iflytop \ No newline at end of file