Browse Source

修复接收数据BUG

master
zhaohe 1 year ago
parent
commit
d22261b5da
  1. 2
      disinfection_iflytop_can_protocol
  2. 26
      iflytop_canbus/iflytop_canbus_master.cpp
  3. 23
      iflytop_canbus/iflytop_canbus_master.hpp
  4. 4
      iflytop_canbus/waveshare_can.cpp
  5. 4
      libzqt/zui/z_function_list_box.cpp
  6. 2
      libzqt/zui/z_reg_table_list_box.cpp
  7. 4
      libzqt/zui/zqui.cpp
  8. 6
      libzqt/zui/zqui.hpp
  9. 66
      src/mainwindow.cpp
  10. 4
      src/mainwindow.h

2
disinfection_iflytop_can_protocol

@ -1 +1 @@
Subproject commit e8f1bf27941f432c968aa9c029e6493664204eda
Subproject commit fc6162a1f1af5c5be894fc42c7991750d54d812d

26
iflytop_canbus/iflytop_canbus_master.cpp

@ -12,9 +12,7 @@ IflytopCanbusMaster *IflytopCanbusMaster::ins() {
static IflytopCanbusMaster *ins = new IflytopCanbusMaster();
return ins;
}
void IflytopCanbusMaster::updateChannelConfig() {
m_waveCan.setCanpPrameter(CANUSB_SPEED_500000, CANUSB_MODE_NORMAL, CANUSB_FRAME_EXTENDED);
}
void IflytopCanbusMaster::updateChannelConfig() { m_waveCan.setCanpPrameter(CANUSB_SPEED_500000, CANUSB_MODE_NORMAL, CANUSB_FRAME_EXTENDED); }
void IflytopCanbusMaster::initialize(IDataChannel *channel) { //
m_channel = channel;
@ -37,6 +35,8 @@ void IflytopCanbusMaster::initialize(IDataChannel *channel) { //
uint8_t frameId = canid->frameNumAndFrameId & 0x0f;
CanPacketRxBuffer *rxbuf = nullptr;
// ZLOGI(TAG, "from:%d to:%d frameNum:%d ", canid->from, canid->to, canid->frameNumAndFrameId);
rxbuf = findRxBuff(from);
if (!rxbuf) {
ZLOGE(TAG, "board[%d] packetId[%d] find rx buff fail", from, frameId);
@ -49,6 +49,7 @@ void IflytopCanbusMaster::initialize(IDataChannel *channel) { //
rxbuf->from = from;
rxbuf->to = to;
}
// ZLOGI(TAG, "rx packet %d %d /%d", rxbuf->rxPacketNum, frameId,nframe);
if (rxbuf->rxPacketNum != frameId) {
ZLOGE(TAG, "lost subpacket from %d", from);
@ -211,3 +212,22 @@ void IflytopCanbusMaster::callcmd3(int32_t device_id, int32_t cmdid, int32_t par
callcmd(device_id, cmdid, (uint8_t *)param, 12, overtime);
}
void IflytopCanbusMaster::sendraw(int32_t from, int32_t to, uint8_t *data, size_t len) { sendframe(from, to, data, len); }
ack_read_board_info_data_t IflytopCanbusMaster::readboardinfo(int to) {
ack_read_board_info_data_t ack;
callcmd0(to, kcmd_read_board_info, 100);
memcpy(&ack, m_receipt_frame->params, sizeof(ack));
return ack;
}
ack_sysinfo_t IflytopCanbusMaster::readsysinfo(int to) {
ack_sysinfo_t ack;
callcmd0(to, kcmd_read_sysinfo, 100);
memcpy(&ack, m_receipt_frame->params, sizeof(ack));
return ack;
}
ask_taskinfo_t IflytopCanbusMaster::readtaskinfo(int to, int32_t taskoff) {
ask_taskinfo_t ack;
callcmd1(to, kcmd_read_taskinfo, taskoff, 100);
memcpy(&ack, m_receipt_frame->params, sizeof(ack));
return ack;
}

23
iflytop_canbus/iflytop_canbus_master.hpp

@ -29,17 +29,16 @@ class RxReceiptContext {
class CanPacketRxBuffer {
public:
int32_t id = 0;
uint8_t from;
uint8_t to;
int32_t id = 0;
uint8_t from = 0;
uint8_t to = 0;
uint8_t rxdata[2048] = {0};
int rxdataSize = 0;
int rxPacketNum;
int rxPacketNum = 0;
};
typedef function<void(packet_type_t type, uint8_t from, uint8_t to, uint8_t *hex, uint32_t hexlen)> on_raw_data_t;
class IflytopCanbusMaster {
@ -47,7 +46,7 @@ class IflytopCanbusMaster {
IDataChannel *m_channel = nullptr;
uint8_t m_rxcache[1024];
uint8_t m_rxcache[1024] = {0};
int32_t m_rxlen = 0;
bool m_rxcache_is_full = false;
@ -62,9 +61,9 @@ class IflytopCanbusMaster {
* TX CONTEXT *
*******************************************************************************/
mutex m_tx_lock;
uint8_t m_txbuf[1024];
int32_t m_rxsize;
uint8_t m_txindex = 0;
uint8_t m_txbuf[1024] = {0};
int32_t m_rxsize = 0;
uint8_t m_txindex = 0;
WaveshareCan m_waveCan;
@ -74,7 +73,7 @@ class IflytopCanbusMaster {
uint8_t m_receipt_cache[1024];
zcanbus_packet_t *m_receipt_frame = (zcanbus_packet_t *)m_receipt_cache;
size_t m_receipt_len = 0;
size_t m_receipt_len = 0;
public:
static IflytopCanbusMaster *ins();
@ -91,6 +90,10 @@ class IflytopCanbusMaster {
void sendraw(int32_t from, int32_t to, uint8_t *data, size_t len);
ack_read_board_info_data_t readboardinfo(int to);
ack_sysinfo_t readsysinfo(int to);
ask_taskinfo_t readtaskinfo(int to,int32_t taskoff);
private:
void sendframe(int32_t from, int32_t to, uint8_t *frame, size_t len);
void sendsubframe(int32_t from, int32_t to, int npacket, int packetIndex, uint8_t *packet, size_t len);

4
iflytop_canbus/waveshare_can.cpp

@ -157,8 +157,8 @@ int WaveshareCan::onReceivePacket(uint8_t* data, size_t len) {
canframe.data[3] = rxpacket->frame_data_4;
canframe.data[4] = rxpacket->frame_data_5;
canframe.data[5] = rxpacket->frame_data_6;
canframe.data[6] = rxpacket->frame_data_6;
canframe.data[7] = rxpacket->frame_data_6;
canframe.data[6] = rxpacket->frame_data_7;
canframe.data[7] = rxpacket->frame_data_8;
if (m_frame_callback) {
m_frame_callback(&canframe);

4
libzqt/zui/z_function_list_box.cpp

@ -69,9 +69,9 @@ void ZQFunctionListBox::newFunc(QString zh_name, QStringList params, std::functi
try {
ZQUI::ins()->instructionPreviewClear();
onButtonClick(params.size(), (const char **)args);
ZQUI::ins()->instructionPreviewShow("OK");
ZQUI::ins()->ishow("OK");
} catch (const std::zexception &e) {
ZQUI::ins()->instructionPreviewShow("%s", e.what());
ZQUI::ins()->ishow("%s", e.what());
}
});
});

2
libzqt/zui/z_reg_table_list_box.cpp

@ -155,7 +155,7 @@ void ZRegTableList::readAll() {
ZRegItem *item = it.value();
int32_t val;
try {
ZQUI::ins()->instructionPreviewShow("try read reg %s", it.key().toStdString().c_str());
ZQUI::ins()->ishow("try read reg %s", it.key().toStdString().c_str());
m_readreg_fn(item->m_addr, &val);
QString displayval = formatRegVal(val, item->m_flag);
QLineEdit *displayiterm = item->m_val;

4
libzqt/zui/zqui.cpp

@ -11,14 +11,14 @@ ZQUI *ZQUI::ins() {
return &instance;
}
void ZQUI::instructionPreviewShow(const char *fmt, ...) {
void ZQUI::ishow(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
char buf[1024] = {0};
vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args);
QString text(buf);
if (m_instructionPreviewShow) m_instructionPreviewShow(text);
if (m_ishow) m_ishow(text);
}
void ZQUI::instructionPreviewClear() {

6
libzqt/zui/zqui.hpp

@ -41,7 +41,7 @@ class ZQUI : public QObject {
public:
typedef std::function<void(QString)> display_func_t;
std::function<void(QString)> m_instructionPreviewShow;
std::function<void(QString)> m_ishow;
std::function<void(QString)> m_reportPreviewShow;
std::function<void(QString)> m_blockDataUploadPreviewShow;
std::function<void(QString)> m_rawDataPreviewShow;
@ -53,13 +53,13 @@ class ZQUI : public QObject {
void initialize();
void doinui(std::function<void()> dowhat);
void instructionPreviewShow(const char *fmt, ...);
void ishow(const char *fmt, ...);
void reportPreviewShow(const char *fmt, ...);
void blockDataUploadPreviewShow(const char *fmt, ...);
void rawDataPreviewShow(const char *fmt, ...);
void instructionPreviewClear();
void setInstructionPreviewShow(std::function<void(QString)> func) { m_instructionPreviewShow = func; }
void setishow(std::function<void(QString)> func) { m_ishow = func; }
void setReportPreviewShow(std::function<void(QString)> func) { m_reportPreviewShow = func; }
void setBlockDataUploadPreviewShow(std::function<void(QString)> func) { m_blockDataUploadPreviewShow = func; }
void setRawDataPreviewShow(std::function<void(QString)> func) { m_rawDataPreviewShow = func; }

66
src/mainwindow.cpp

@ -51,7 +51,7 @@ void MainWindow::doinui_slot(QFunction func) {
* PreviewShow *
***********************************************************************************************************************/
void MainWindow::instructionPreviewShow(QString text) {
void MainWindow::ishow(QString text) {
QString info;
info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz "));
info.append(" |");
@ -136,7 +136,7 @@ void MainWindow::constructBaseUI() {
ui->serialBaudrateCB->addItem("460800");
ui->serialBaudrateCB->addItem("500000");
ui->serialBaudrateCB->addItem("2000000");
ui->serialBaudrateCB->setCurrentIndex(6);
ui->serialBaudrateCB->setCurrentIndex(8);
connect(ui->serialPortRefreshKey, &QPushButton::clicked, this, [this](bool check) {
ui->serialPortCB->clear();
@ -197,7 +197,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction)));
ZQUI::ins()->initialize();
ZQUI::ins()->setBlockDataUploadPreviewShow([this](QString text) { blockDataUploadPreviewShow(text); });
ZQUI::ins()->setInstructionPreviewShow([this](QString text) { instructionPreviewShow(text); });
ZQUI::ins()->setishow([this](QString text) { ishow(text); });
ZQUI::ins()->setReportPreviewShow([this](QString text) { reportPreviewShow(text); });
ZQUI::ins()->setRawDataPreviewShow([this](QString text) { rawDataPreviewShow(text); });
ZQUI::ins()->setInstructionPreviewClear([this]() { instructionPreviewClear(); });
@ -207,6 +207,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
*/
constructBaseUI();
constructAppUI();
ui->uploadDataPreview->hide();
/**
* @brief
@ -217,28 +218,71 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
IflytopCanbusMaster::ins()->regOnRawData([this](packet_type_t type, uint8_t from, uint8_t to, uint8_t *hex, uint32_t hexlen) {
if (type == kcmd) {
zcanbus_packet_t *frame = (zcanbus_packet_t *)hex;
ZQUI::ins()->rawDataPreviewShow("[CMD ] [from:%d to:%d,index:%02x cmd:%d] %s", from, to, frame->index, frame->function_id, //
zhex2str(frame->params, hexlen - sizeof(zcanbus_packet_t)).c_str() //
);
ZQUI::ins()->rawDataPreviewShow("[CMD ] [%d->%d],%s", from, to, zhex2str(hex, hexlen).c_str()); //
} else if (type == kerror_receipt) {
ZQUI::ins()->rawDataPreviewShow("[E-RECEIPT] %s", zhex2str(hex, hexlen).c_str());
ZQUI::ins()->rawDataPreviewShow("[E-RECEIPT] [%d->%d],%s", from, to, zhex2str(hex, hexlen).c_str()); //
} else if (type == kreceipt) {
ZQUI::ins()->rawDataPreviewShow("[RECEIPT ] %s", zhex2str(hex, hexlen).c_str());
ZQUI::ins()->rawDataPreviewShow("[RECEIPT ] [%d->%d],%s", from, to, zhex2str(hex, hexlen).c_str()); //
} else if (type == kreport) {
ZQUI::ins()->rawDataPreviewShow("[REPORT ] %s", zhex2str(hex, hexlen).c_str());
ZQUI::ins()->rawDataPreviewShow("[REPORT ] [%d->%d],%s", from, to, zhex2str(hex, hexlen).c_str()); //
}
});
}
MainWindow::~MainWindow() { delete ui; }
void MainWindow::processException(const zexception &e) { //
ZQUI::ins()->instructionPreviewShow("%s", e.what());
ZQUI::ins()->ishow("%s", e.what());
}
int32_t MainWindow::getDeviceId() { return PublicState_DeviceIDVal; }
void MainWindow::constructAppUI() {
void MainWindow::constructAppUI() {
/***********************************************************************************************************************
* *
***********************************************************************************************************************/
{
ZQVTabPage *tab = new ZQVTabPage(ui->buttonTabWidget, "基础方法");
// static
// ack_read_board_info_data_t readboardinfo(int to);
// ack_sysinfo_t readsysinfo(int to);
// ask_taskinfo_t readtaskinfo(int to,int32_t taskoff);
{
ZQFunctionListBox *box = new ZQFunctionListBox(tab, "通用方法", 4);
box->newFunc("读板卡信息", {}, [this](int argn, const char **args) { //
ack_read_board_info_data_t ack = IflytopCanbusMaster::ins()->readboardinfo(getDeviceId());
ZQUI::ins()->ishow("boardType :%s(%d)", BoardTypeToString(ack.boardType), ack.boardType);
ZQUI::ins()->ishow("projectId :%s(%d)", ProjectIDToString(ack.projectId), ack.projectId);
ZQUI::ins()->ishow("protcol_version :%d", ack.protcol_version);
ZQUI::ins()->ishow("software_version :%d", ack.software_version);
ZQUI::ins()->ishow("hardware_version :%d", ack.hardware_version);
});
box->newFunc("读系统信息", {}, [this](int argn, const char **args) { //
ack_sysinfo_t ack = IflytopCanbusMaster::ins()->readsysinfo(getDeviceId());
ask_taskinfo_t task[20];
for (int i = 0; i < ack.taskNum; i++) {
task[i] = IflytopCanbusMaster::ins()->readtaskinfo(getDeviceId(), i);
}
ZQUI::ins()->ishow("=========================== sys info ===========================");
ZQUI::ins()->ishow("total_heap_size :%d", ack.total_heap_size);
ZQUI::ins()->ishow("free_heap_size :%d", ack.free_heap_size);
ZQUI::ins()->ishow("sysHasRun :%d", ack.sysHasRun);
ZQUI::ins()->ishow("=");
ZQUI::ins()->ishow("=========================== task info ===========================");
ZQUI::ins()->ishow("taskoff name state stackRemainSize priority");
for (int i = 0; i < ack.taskNum; i++) {
ZQUI::ins()->ishow("%d %10s %c %d", i, task[i].taskName, task[i].state, task[i].stackRemindSize, task[i].priority);
}
ZQUI::ins()->ishow("=");
});
}
}
}
void MainWindow::on_PublicState_ConfirmKey_clicked() { PublicState_DeviceIDVal = ui->PublicState_DeviceID->toPlainText().toInt(); }
void MainWindow::on_clearPreview_clicked() {
// ZQUI()->
}

4
src/mainwindow.h

@ -90,6 +90,8 @@ class MainWindow : public QMainWindow {
void on_PublicState_ConfirmKey_clicked();
void on_clearPreview_clicked();
signals:
void doinui_signal(QFunction);
@ -97,7 +99,7 @@ signals:
static void log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg);
void instructionPreviewClear();
void instructionPreviewShow(QString info);
void ishow(QString info);
void reportPreviewShow(QString info);
void blockDataUploadPreviewShow(QString info);
void rawDataPreviewShow(QString info);

Loading…
Cancel
Save