From 3671588f43030f703af6e2f39bcc3f578f45f6e9 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sun, 13 Aug 2023 16:56:26 +0800 Subject: [PATCH] add iflytop cancmd server --- .../iflytop_cancmd_server.cpp | 72 ++++++++++++++++++++++ .../iflytop_cancmd_server.hpp | 65 +++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 src/iflytop/components/iflytop_cancmd_server/iflytop_cancmd_server.cpp create mode 100644 src/iflytop/components/iflytop_cancmd_server/iflytop_cancmd_server.hpp diff --git a/src/iflytop/components/iflytop_cancmd_server/iflytop_cancmd_server.cpp b/src/iflytop/components/iflytop_cancmd_server/iflytop_cancmd_server.cpp new file mode 100644 index 0000000..3842b29 --- /dev/null +++ b/src/iflytop/components/iflytop_cancmd_server/iflytop_cancmd_server.cpp @@ -0,0 +1,72 @@ +#include "iflytop_cancmd_server.hpp" +using namespace std; +using namespace iflytop; +using namespace icps; + +void IflytopCanCmdServer::initialize(string can_if_name, int baudrate, bool enablLoopback) { + // m_iflytopCanProtocolStack.reset(new IflytopCanProtocolStack()); + + m_can_if_name = can_if_name; + m_baudrate = baudrate; + m_enablLoopback = enablLoopback; + resetSocketCan(); +} +void IflytopCanCmdServer::startListen() {} + +void IflytopCanCmdServer::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 IflytopCanCmdServer::processHamiltonCanRxPacket(shared_ptr frame) { // + logger->info("Rx Hamilton packet : {}", frame->toString()); +} +void IflytopCanCmdServer::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 IflytopCanCmdServer::resetSocketCan() { + auto socketCanConfig = make_shared(); + socketCanConfig->enablLoopback = m_enablLoopback; // 根据 SocketCan::dumpCanDriverInfo() 的输出,确定该标志位是false还是true + socketCanConfig->m_canName = m_can_if_name; + socketCanConfig->m_canBaudrate = m_baudrate; + socketCanConfig->m_canfilters = {}; + + logger->info("IflytopCanCmdServer::initialize() m_canName:{} {}", socketCanConfig->m_canName, socketCanConfig->m_canBaudrate); + + m_socketCan.reset(new SocketCan()); + m_socketCan->initialize(socketCanConfig); + m_socketCan->startListen(); + m_socketCan->onSocketCanFrame.connect([this](shared_ptr canframe) { // + processRx(canframe); + }); +} + +// SocketCan::SocketCanError_t IflytopCanCmdServer::sendPacketToIflytopCanSubDevice(shared_ptr icps_packet, int overtime_ms) { +// if (m_socketCan->isError()) { +// logger->error("m_socketCan->isError() exit process"); +// exit(-1); +// resetSocketCan(); +// } + +// auto frame = m_iflytopCanProtocolStack->createSocketCanFrame(icps_packet); +// if (!frame) { +// logger->error("createSocketCanFrame fail,{}", icps_packet->toString()); +// return SocketCan::kErrorFrameFormat; +// } +// logger->debug("tx:{}", frame->toString()); + +// return m_socketCan->sendFrame(frame, overtime_ms); +// } diff --git a/src/iflytop/components/iflytop_cancmd_server/iflytop_cancmd_server.hpp b/src/iflytop/components/iflytop_cancmd_server/iflytop_cancmd_server.hpp new file mode 100644 index 0000000..2d144d4 --- /dev/null +++ b/src/iflytop/components/iflytop_cancmd_server/iflytop_cancmd_server.hpp @@ -0,0 +1,65 @@ +// +// Created by iflytop +// + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "iflytop/core/basic/nlohmann/json.hpp" +#include "iflytop/core/driver/socketcan/socket_can.hpp" +#include "iflytop/core/spdlogfactory/logger.hpp" +#include "zservice_container/zservice_container.hpp" + +/** + * @brief + * + * service: IflytopCanCmdServer + * + * 1. 负责监听,分流IflytopSubDevice的CAN消息和哈美顿的CAN消息 + * 2. 负责将CanFrame转换成IflytopCanPacket + */ + +namespace iflytop { +namespace icps { +using namespace std; +using namespace iflytop; +using namespace core; +using namespace nlohmann; +class IflytopCanCmdServer : public enable_shared_from_this { + ENABLE_LOGGER(IflytopCanCmdServer); + + shared_ptr m_socketCan; + + string m_can_if_name; + int m_baudrate; + bool m_enablLoopback; + + public: + // nod::signal packet)> onIflytopCanSubDevicePacket; + + void initialize(string can_if_name, int baudrate, bool enablLoopback); + void startListen(); + + // SocketCan::SocketCanError_t sendPacketToIflytopCanSubDevice(shared_ptr icps_packet, int overtime_ms); + + private: + void processRx(shared_ptr frame); + // 处理iflytop子设备的CAN消息 + void processIflytopRxPacket(shared_ptr frame); + // 处理哈美顿的CAN消息 + void processHamiltonCanRxPacket(shared_ptr frame); + void resetSocketCan(); + + private: +}; +} // namespace icps + +} // namespace iflytop \ No newline at end of file