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