From 0bb43f7007917cafa25dd18b3f455256608ff1f9 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 15 Aug 2023 12:30:49 +0800 Subject: [PATCH] update --- .../iflytop_front_end_service.hpp | 2 +- src/iflytop/components/simple_udp/simple_udp.cpp | 19 ++++---- src/iflytop/components/zcanreceiver/zcanhost.cpp | 55 ++++++++++++++++++++++ .../components/zcanreceiver/zcanreceiverhost.cpp | 24 ++++++---- 4 files changed, 80 insertions(+), 20 deletions(-) diff --git a/src/iflytop/components/iflytop_front_end_service/iflytop_front_end_service.hpp b/src/iflytop/components/iflytop_front_end_service/iflytop_front_end_service.hpp index 69b73a8..2f0515e 100644 --- a/src/iflytop/components/iflytop_front_end_service/iflytop_front_end_service.hpp +++ b/src/iflytop/components/iflytop_front_end_service/iflytop_front_end_service.hpp @@ -65,7 +65,7 @@ class IflytopFrontEndService : public enable_shared_from_thissendto(from, data, len); } + void sendToUDP(struct sockaddr_in* from,const char* data, size_t len) { m_udp->sendto(from, data, len); } private: void onMessageCallback(weak_ptr webSocket, shared_ptr connectionState, const ix::WebSocketMessagePtr& msg); diff --git a/src/iflytop/components/simple_udp/simple_udp.cpp b/src/iflytop/components/simple_udp/simple_udp.cpp index e1430ae..a64ed23 100644 --- a/src/iflytop/components/simple_udp/simple_udp.cpp +++ b/src/iflytop/components/simple_udp/simple_udp.cpp @@ -1,7 +1,8 @@ #include "simple_udp.hpp" - - +#include +#include +#include using namespace std; using namespace iflytop; using namespace core; @@ -33,15 +34,15 @@ void SimpleUDP::initialize(int port) { socklen_t peerlen; while (true) { memset(m_rxbuf, 0, sizeof(m_rxbuf)); - // 网络节点的信息,用来保存客户端的网络信息 - // sockaddr_in clientAddr; + memset(&peeraddr, 0, sizeof(sockaddr_in)); - int clientAddrLen = sizeof(sockaddr); - // 接收客户端发来的数据 + peerlen = sizeof(sockaddr_in); + int ret = recvfrom(m_socket, m_rxbuf, sizeof(m_rxbuf), 0, (struct sockaddr *)&peeraddr, &peerlen); - // printf("Recv msg:%s from IP:[%s] Port:[%d]\n", m_rxbuf, inet_ntoa(m_context.clientAddr.sin_addr), ntohs(m_context.clientAddr.sin_port)); - // process_rx_cmd(m_rxbuf, ret); - // sendto(m_socket, "Hello World!", strlen("Hello World!"), 0, (sockaddr *)&m_context.clientAddr, clientAddrLen); + logger->debug("Recv msg {} from IP:{} Port:{}\n", m_rxbuf, inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port)); + // int wret = ::sendto(m_socket, "Hello World!", strlen("Hello World!"), 0, (sockaddr *)&peeraddr, peerlen); + // logger->debug("sendto ret:{}", wret); + // perror("sendto"); if (ret < 0) { logger->error("recvfrom failed, {}", strerror(errno)); continue; diff --git a/src/iflytop/components/zcanreceiver/zcanhost.cpp b/src/iflytop/components/zcanreceiver/zcanhost.cpp index 0ac3313..c9a2a52 100644 --- a/src/iflytop/components/zcanreceiver/zcanhost.cpp +++ b/src/iflytop/components/zcanreceiver/zcanhost.cpp @@ -7,9 +7,64 @@ using namespace zcr; #define zint16p(x) ((int16_t*)(x)) #define zint32p(x) ((int32_t*)(x)) +#define CHECK_ARGC_NUM(x) \ + if (argc != (x + 1)) { \ + logger->error("do {},argc error", argv[0]); \ + retval = "argc num error"; \ + return false; \ + } + void ZCanHost::initialize(string can_if_name, int baudrate, bool enablLoopback) { m_zcanReceiverHost = make_shared(); m_zcanReceiverHost->initialize(can_if_name, baudrate, enablLoopback); + + m_cmdMap["pumpctrl_c1004"] = [this](int argc, char** argv, string& retval) { + CHECK_ARGC_NUM(4); + uint8_t id = atoi(argv[1]); + int16_t acc = atoi(argv[2]); + int16_t rpm = atoi(argv[3]); + return pumpctrl_c1004(id, acc, rpm) != 0; + }; + + // ZCanHost::readio(int id, bool& value) + // ZCanHost::writeio(int id, bool value) + // ZCanHost::readadc(int id, int& value) + + m_cmdMap["readio"] = [this](int argc, char** argv, string& retval) { + CHECK_ARGC_NUM(1); + uint8_t id = atoi(argv[1]); + bool v = false; + if (readio(id, v) != 0) { + logger->error("readio fail"); + return false; + } + retval = to_string(v); + return true; + }; + + m_cmdMap["writeio"] = [this](int argc, char** argv, string& retval) { + CHECK_ARGC_NUM(2); + uint8_t id = atoi(argv[1]); + bool v = atoi(argv[2]); + if (writeio(id, v) != 0) { + logger->error("writeio fail"); + return false; + } + return true; + }; + + m_cmdMap["readadc"] = [this](int argc, char** argv, string& retval) { + CHECK_ARGC_NUM(1); + uint8_t id = atoi(argv[1]); + int v = 0; + if (readadc(id, v) != 0) { + logger->error("readadc fail"); + return false; + } + logger->info("readadc:{},{}", id, v); + retval = fmt::format("ACK:{}", v); + return true; + }; } static void prase_cmd(char* input, int inputlen, int& argc, char* argv[]) { diff --git a/src/iflytop/components/zcanreceiver/zcanreceiverhost.cpp b/src/iflytop/components/zcanreceiver/zcanreceiverhost.cpp index 38e08ff..9bf3e97 100644 --- a/src/iflytop/components/zcanreceiver/zcanreceiverhost.cpp +++ b/src/iflytop/components/zcanreceiver/zcanreceiverhost.cpp @@ -24,6 +24,15 @@ void ZCanReceiverHost::registerListener(onpacket_t onpacket) { m_onpacket = onpa shared_ptr ZCanReceiverHost::sendcmdblock(shared_ptr cmd, int overtime_ms) { // lock_guard lock(m_txblocklock); + m_index++; + if (m_index == 0) { + m_index = 1; + } + if (m_index == UINT16_MAX) { + m_index = 1; + } + cmd->packetindex = m_index; + { lock_guard lock(m_txContextLock); m_txContext.txcmdcache = cmd; @@ -52,15 +61,7 @@ shared_ptr ZCanReceiverHost::sendcmdblock(shared_ptrpacketindex = m_index; + header->packetindex = packetindex; header->cmdid = cmdid; header->subcmdid = subcmdid; header->packetType = 0x00; @@ -88,7 +89,7 @@ void ZCanReceiverHost::sendPacket(uint8_t *packet, size_t len) { suc = sendPacketSub(npacket, i, packet + i * 8, 8, OVER_TIME_MS); } if (!suc) { - printf("sendPacket fail, packet(%d:%d)\n", npacket, i); + logger->warn("sendPacket fail, packet(%d:%d)\n", npacket, i); return; } } @@ -123,9 +124,12 @@ void ZCanReceiverHost::processOnePacket(CanPacketRxBuffer *rxbuf, uint8_t *packe /** * @brief 匹配下发的命令 */ + logger->debug("processOnePacket(index {}, packetType {} ,cmd {},subcmd {}),rx(index {})", header->packetindex, header->packetType, header->cmdid, + header->subcmdid, rx->packetindex); if (header->packetType == kpt_ack || header->packetType == kpt_error_ack) { if (header->packetindex == m_txContext.txcmdcache->packetindex) { lock_guard lock(m_txContextLock); + logger->debug("rx ack"); m_txContext.rx = rx; m_txContext.isReady = true; }