15 changed files with 343 additions and 248 deletions
-
4src/iflytop/components/iflytop_front_end_service/iflytop_front_end_service.cpp
-
48src/iflytop/components/zcanreceiver/cmd.hpp
-
3src/iflytop/components/zcanreceiver/zcanhost.cpp
-
6src/iflytop/components/zcanreceiver/zcanhost.hpp
-
171src/iflytop/components/zcanreceiver/zcanreceiver_master.cpp
-
70src/iflytop/components/zcanreceiver/zcanreceiver_master.hpp
-
83src/iflytop/components/zcanreceiver/zcanreceiverhost.cpp
-
41src/iflytop/components/zcanreceiver/zcanreceiverhost.hpp
-
28src/iflytop/core/components/stringutils.cpp
-
12src/iflytop/core/components/stringutils.hpp
-
8src/iflytop/core/components/timeutils.hpp
-
4src/iflytop/core/driver/socketcan/socket_can.cpp
-
38src/iflytop/core/error/error_code.cpp
-
73src/iflytop/core/error/error_code.hpp
-
2src/iflytop/zprotocols
@ -1,48 +0,0 @@ |
|||||
#pragma once
|
|
||||
#include <fstream>
|
|
||||
#include <iostream>
|
|
||||
#include <list>
|
|
||||
#include <map>
|
|
||||
#include <memory>
|
|
||||
#include <sstream>
|
|
||||
#include <string>
|
|
||||
#include <vector>
|
|
||||
#include <set>
|
|
||||
#include <functional>
|
|
||||
namespace iflytop { |
|
||||
namespace zcr { |
|
||||
|
|
||||
typedef struct { |
|
||||
uint16_t packetindex; |
|
||||
uint16_t cmdid; |
|
||||
uint8_t subcmdid; |
|
||||
uint8_t packetType; |
|
||||
uint8_t data[]; |
|
||||
} Cmdheader_t; |
|
||||
|
|
||||
typedef enum { |
|
||||
kpt_cmd = 0, |
|
||||
kpt_ack = 1, |
|
||||
kpt_error_ack = 2, |
|
||||
kpt_status_report = 3, |
|
||||
} PacketType_t; |
|
||||
|
|
||||
typedef enum { |
|
||||
kcmd_ping = 0, |
|
||||
kcmd_read_io = 1, |
|
||||
kcmd_set_io = 2, |
|
||||
|
|
||||
kcmd_m211887_operation = 1000, // 维萨拉压力传感器
|
|
||||
kcmd_read_presure_sensor = 1001, |
|
||||
kcmd_triple_warning_light_ctl = 1002, |
|
||||
kcmd_high_power_electrical_ctl = 1003, |
|
||||
kcmd_peristaltic_pump_ctl = 1004, |
|
||||
kcmd_read_huacheng_pressure_sensor = 1005, |
|
||||
} CmdID_t; |
|
||||
|
|
||||
} // namespace zcr
|
|
||||
} // namespace iflytop
|
|
||||
|
|
||||
/**
|
|
||||
* @brief |
|
||||
*/ |
|
@ -0,0 +1,171 @@ |
|||||
|
#include "zcanreceiver_master.hpp"
|
||||
|
using namespace iflytop; |
||||
|
using namespace std; |
||||
|
using namespace core; |
||||
|
|
||||
|
void ZcanReceiverMaster::initialize(string can_if_name, int baudrate, bool enablLoopback) { //
|
||||
|
m_zcanReceiverHost = make_shared<ZCanReceiverHost>(); |
||||
|
m_zcanReceiverHost->initialize(can_if_name, baudrate, enablLoopback); |
||||
|
m_zcanReceiverHost->registerListener([this](uint8_t fromboardid, uint8_t *packet, size_t len) { //
|
||||
|
zcr_cmd_header_t *header = (zcr_cmd_header_t *)packet; |
||||
|
/**
|
||||
|
* @brief 路由规则 |
||||
|
* |
||||
|
* 1. event事件,触发m_onevent |
||||
|
* 2. ack,如果index是60000以上触发m_localonpacket回调 |
||||
|
* 3. 所有packet均触发m_onpacket回调 |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
// 过滤掉回执中index大于60000的回执
|
||||
|
if (header->packetType == kptv2_ack || header->packetType == kptv2_error_ack) { |
||||
|
if (header->packetindex < 60000) { |
||||
|
if (m_onpacket) m_onpacket(fromboardid, header, len); |
||||
|
} |
||||
|
} else { |
||||
|
if (m_onpacket) m_onpacket(fromboardid, header, len); |
||||
|
if (header->packetType == kptv2_event) { |
||||
|
if (m_onevent) m_onevent(fromboardid, header, len); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/*******************************************************************************
|
||||
|
* 本地消息处理 * |
||||
|
*******************************************************************************/ |
||||
|
if (header->packetType == kptv2_ack || header->packetType == kptv2_error_ack) { |
||||
|
if (header->packetindex >= 60000) { |
||||
|
callLocalPacketListener(fromboardid, header, len); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
}); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
void ZcanReceiverMaster::sendraw(uint8_t *packet, size_t len) { m_zcanReceiverHost->sendPacket(packet, len); } |
||||
|
|
||||
|
int32_t ZcanReceiverMaster::sendCmd(int32_t cmdid, int32_t submoduleid, int32_t *param, size_t npara, int32_t *ack, size_t nack, int overtime_ms) { //
|
||||
|
std::lock_guard<std::recursive_mutex> lock(sendlock_); |
||||
|
uint8_t txbuff[1024]; |
||||
|
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; |
||||
|
cmdheader->packetType = kptv2_cmd; |
||||
|
cmdheader->packetindex = generateFreeIndex(); |
||||
|
cmdheader->cmdmoduleid = MODULE_CMDID(cmdid); |
||||
|
cmdheader->subcmdid = SUBCMDID(cmdid); |
||||
|
cmdheader->submoduleid = submoduleid; |
||||
|
|
||||
|
int32_t *sendparam = (int32_t *)cmdheader->data; |
||||
|
for (size_t i = 0; i < npara; i++) { |
||||
|
sendparam[i] = param[i]; |
||||
|
} |
||||
|
int32_t txlen = sizeof(zcr_cmd_header_t) + npara * sizeof(int32_t); |
||||
|
|
||||
|
bool rxdataIsReady = false; |
||||
|
int32_t errocode = 0; |
||||
|
regLocalPacketListener([this, &rxdataIsReady, &ack, &nack, &errocode, cmdheader](int32_t fromboard, zcr_cmd_header_t *packet, int32_t datalen) { |
||||
|
if (packet->packetindex != cmdheader->packetindex) return; |
||||
|
if (packet->packetType == kptv2_error_ack) { |
||||
|
errocode = *(int32_t *)packet->data; |
||||
|
} else { |
||||
|
int32_t *rxbuf = (int32_t *)packet->data; |
||||
|
if (ack != nullptr && nack != 0) { |
||||
|
for (size_t i = 0; i < nack; i++) { |
||||
|
ack[i] = rxbuf[i]; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
rxdataIsReady = true; |
||||
|
}); |
||||
|
|
||||
|
m_zcanReceiverHost->sendPacket(txbuff, txlen); |
||||
|
/**
|
||||
|
* @brief 等待回执 |
||||
|
*/ |
||||
|
auto enterticket = zos_get_tick(); |
||||
|
while (!rxdataIsReady) { |
||||
|
if (zos_haspassedms(enterticket) > (uint32_t)overtime_ms) { |
||||
|
unregLocalPacketListener(); |
||||
|
return err::kovertime; |
||||
|
} |
||||
|
usleep(1000); |
||||
|
} |
||||
|
unregLocalPacketListener(); |
||||
|
return 0; |
||||
|
} |
||||
|
int32_t ZcanReceiverMaster::sendCmdAndReceiveBuf(int32_t cmdid, int32_t submoduleid, int32_t *param, size_t npara, uint8_t *ack, int32_t *rxsize, |
||||
|
int overtime_ms) { //
|
||||
|
std::lock_guard<std::recursive_mutex> lock(sendlock_); |
||||
|
uint8_t txbuff[1024]; |
||||
|
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; |
||||
|
cmdheader->packetType = kptv2_cmd; |
||||
|
cmdheader->packetindex = generateFreeIndex(); |
||||
|
cmdheader->cmdmoduleid = MODULE_CMDID(cmdid); |
||||
|
cmdheader->subcmdid = SUBCMDID(cmdid); |
||||
|
cmdheader->submoduleid = submoduleid; |
||||
|
// ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdmoduleid, cmdheader->subcmdid, cmdheader->submoduleid);
|
||||
|
int32_t *sendparam = (int32_t *)cmdheader->data; |
||||
|
for (size_t i = 0; i < npara; i++) { |
||||
|
sendparam[i] = param[i]; |
||||
|
} |
||||
|
int32_t txlen = sizeof(zcr_cmd_header_t) + npara * sizeof(int32_t); |
||||
|
|
||||
|
// 注册监听者
|
||||
|
bool rxdataIsReady = false; |
||||
|
int32_t errocode = 0; |
||||
|
regLocalPacketListener([this, &cmdheader, &rxdataIsReady, &ack, &rxsize, &errocode](int32_t fromboard, zcr_cmd_header_t *packet, int32_t datalen) { |
||||
|
if (packet->packetindex != cmdheader->packetindex) return; |
||||
|
|
||||
|
rxdataIsReady = true; |
||||
|
if (packet->packetType == kptv2_error_ack) { |
||||
|
errocode = *(int32_t *)packet->data; |
||||
|
} else if (*rxsize < datalen) { |
||||
|
errocode = err::kbuffer_not_enough; |
||||
|
} else { |
||||
|
*rxsize = datalen; |
||||
|
memcpy(ack, packet->data, *rxsize); |
||||
|
} |
||||
|
rxdataIsReady = true; |
||||
|
}); |
||||
|
|
||||
|
// 发送消息
|
||||
|
m_zcanReceiverHost->sendPacket(txbuff, txlen); |
||||
|
|
||||
|
// 等待回执
|
||||
|
uint32_t enterticket = zos_get_tick(); |
||||
|
while (!rxdataIsReady) { |
||||
|
if (zos_haspassedms(enterticket) > (uint32_t)overtime_ms) { |
||||
|
unregLocalPacketListener(); |
||||
|
return err::kovertime; |
||||
|
} |
||||
|
usleep(1000); |
||||
|
} |
||||
|
unregLocalPacketListener(); |
||||
|
|
||||
|
return errocode; |
||||
|
} |
||||
|
void ZcanReceiverMaster::regEventPacketListener(onpacket_t on_event) { |
||||
|
m_onevent = on_event; |
||||
|
return; |
||||
|
} |
||||
|
void ZcanReceiverMaster::regPacketListener(onpacket_t onpacket) { m_onpacket = onpacket; } |
||||
|
void ZcanReceiverMaster::regLocalPacketListener(onpacket_t onpacket) { |
||||
|
lock_guard<recursive_mutex> lock(m_localonpacket_lock_); |
||||
|
m_localonpacket = onpacket; |
||||
|
} |
||||
|
void ZcanReceiverMaster::callLocalPacketListener(int32_t fromboard, zcr_cmd_header_t *packet, int32_t datalen) { |
||||
|
lock_guard<recursive_mutex> lock(m_localonpacket_lock_); |
||||
|
if (m_localonpacket) m_localonpacket(fromboard, packet, datalen); |
||||
|
} |
||||
|
|
||||
|
void ZcanReceiverMaster::unregLocalPacketListener() { |
||||
|
lock_guard<recursive_mutex> lock(m_localonpacket_lock_); |
||||
|
m_localonpacket = nullptr; |
||||
|
} |
||||
|
|
||||
|
uint16_t ZcanReceiverMaster::generateFreeIndex() { |
||||
|
m_startindex++; |
||||
|
if (m_startindex < 60000) { |
||||
|
m_startindex = 60000; |
||||
|
} |
||||
|
return m_startindex; |
||||
|
} |
@ -0,0 +1,70 @@ |
|||||
|
//
|
||||
|
// Created by zwsd
|
||||
|
//
|
||||
|
|
||||
|
#pragma once
|
||||
|
#include <fstream>
|
||||
|
#include <iostream>
|
||||
|
#include <list>
|
||||
|
#include <map>
|
||||
|
#include <memory>
|
||||
|
#include <mutex>
|
||||
|
#include <set>
|
||||
|
#include <sstream>
|
||||
|
#include <string>
|
||||
|
#include <vector>
|
||||
|
|
||||
|
#include "iflytop/core/core.hpp"
|
||||
|
#include "iflytop/zprotocols/api/api.hpp"
|
||||
|
#include "zcanreceiverhost.hpp"
|
||||
|
|
||||
|
/**
|
||||
|
* @brief |
||||
|
* |
||||
|
* service: ZcanReceiverMaster |
||||
|
* |
||||
|
* 监听事件: |
||||
|
* 依赖状态: |
||||
|
* 依赖服务: |
||||
|
* 作用: |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
namespace iflytop { |
||||
|
using namespace std; |
||||
|
using namespace core; |
||||
|
class ZcanReceiverMaster : public IZcanCmderMaster { |
||||
|
ENABLE_LOGGER(ZcanReceiverMaster); |
||||
|
|
||||
|
function<void(int32_t fromboard, zcr_cmd_header_t *packet, int32_t datalen)> m_onevent; |
||||
|
function<void(int32_t fromboard, zcr_cmd_header_t *packet, int32_t datalen)> m_onpacket; |
||||
|
|
||||
|
function<void(int32_t fromboard, zcr_cmd_header_t *packet, int32_t datalen)> m_localonpacket; |
||||
|
recursive_mutex m_localonpacket_lock_; |
||||
|
|
||||
|
shared_ptr<ZCanReceiverHost> m_zcanReceiverHost; |
||||
|
|
||||
|
int32_t m_startindex = 60000; |
||||
|
|
||||
|
std::recursive_mutex sendlock_; |
||||
|
|
||||
|
public: |
||||
|
ZcanReceiverMaster(){}; |
||||
|
|
||||
|
void initialize(string can_if_name, int baudrate, bool enablLoopback); |
||||
|
|
||||
|
virtual int32_t sendCmd(int32_t cmdid, int32_t moduleid, int32_t *param, size_t npara, int32_t *ack, size_t nack, int overtime_ms) override; |
||||
|
virtual int32_t sendCmdAndReceiveBuf(int32_t cmdid, int32_t moduleid, int32_t *param, size_t npara, uint8_t *ack, int32_t *rxsize, int overtime_ms) override; |
||||
|
virtual void regEventPacketListener(onpacket_t on_event) override; |
||||
|
|
||||
|
void regPacketListener(onpacket_t onpacket); |
||||
|
void sendraw(uint8_t *packet, size_t len); |
||||
|
|
||||
|
private: |
||||
|
void regLocalPacketListener(onpacket_t onpacket); |
||||
|
void callLocalPacketListener(int32_t fromboard, zcr_cmd_header_t *packet, int32_t datalen); |
||||
|
void unregLocalPacketListener(); |
||||
|
|
||||
|
uint16_t generateFreeIndex(); |
||||
|
}; |
||||
|
} // namespace iflytop
|
@ -1,38 +0,0 @@ |
|||||
#include "error_code.hpp"
|
|
||||
|
|
||||
namespace iflytop { |
|
||||
namespace err { |
|
||||
|
|
||||
using namespace std; |
|
||||
|
|
||||
typedef struct { |
|
||||
string errordesc; |
|
||||
} error_desc_t; |
|
||||
|
|
||||
static map<error_t, error_desc_t> errormap = { |
|
||||
// {kovertime, {.errordesc = "overtime"}},
|
|
||||
{kfail, {.errordesc = "fail"}}, |
|
||||
{kce_overtime, {.errordesc = "overtime"}}, |
|
||||
{kce_noack, {.errordesc = "noack"}}, |
|
||||
{kce_errorack, {.errordesc = "errorack"}}, |
|
||||
{kce_device_offline, {.errordesc = "device_offline"}}, |
|
||||
{kce_parse_json_err, {.errordesc = "parse_json_err"}}, |
|
||||
{kdbe_user_not_exist, {.errordesc = "user_not_exist"}}, |
|
||||
{kdbe_catch_exception, {.errordesc = "catch_exception"}}, |
|
||||
{kharde_unfound, {.errordesc = "hardware_unfound"}}, |
|
||||
{kre_catch_exception, {.errordesc = "catch_exception"}}, |
|
||||
{kinteraction_error_passwd_error, {.errordesc = "passwd_error"}}, |
|
||||
{kinteraction_error_user_not_exist, {.errordesc = "user_not_exist"}} |
|
||||
|
|
||||
}; |
|
||||
|
|
||||
std::string zecode2str(err::error_t error_type, string extdes) { |
|
||||
string ret = "unkown"; |
|
||||
if (errormap.find(error_type) != errormap.end()) { |
|
||||
ret = errormap[error_type].errordesc; |
|
||||
} |
|
||||
return fmt::format("{},{}", ret, extdes); |
|
||||
} |
|
||||
|
|
||||
} // namespace err
|
|
||||
} // namespace iflytop
|
|
@ -1 +1 @@ |
|||||
Subproject commit 08006637540c73c3615944b5c37f27de0a7c56d2 |
|
||||
|
Subproject commit 9581189118a3a559d3f11895a422a95399113b53 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue