Browse Source

update

master
zhaohe 1 year ago
parent
commit
02c4f0120e
  1. 23
      README.md
  2. 60
      iflytop_canbus/iflytop_canbus_master.cpp
  3. 21
      iflytop_canbus/iflytop_canbus_master.hpp
  4. 2
      libzqt/logger.cpp
  5. 5
      libzqt/logger.hpp
  6. 20
      mainwindow.cpp
  7. 149
      mainwindow.ui

23
README.md

@ -37,4 +37,27 @@ V4:
4. 上报某条记录
5. 打印记录的checksum
```
```
模块名:
模块基本操作:
打印寄存器列表
初始化
1. 脚本解析器
电机初始化(人造方法....),设定好所有必要的初始化参数,按下按键即可。
必要参数:
方法.....
.........
```

60
iflytop_canbus/iflytop_canbus_master.cpp

@ -19,9 +19,67 @@ void IflytopCanbusMaster::initialize(IDataChannel *channel) { //
m_waveCan.init(channel, [this](WaveshareCan::can_rx_frame_t *canframe) { //
ZLOGI(TAG, "can rx: 0x%08x %d %s", canframe->id, canframe->dlc, zhex2str(canframe->data, canframe->dlc).c_str());
/**
* @brief
*
* [2] [3bit] [8bit] [8bit] [8bit]
* , from frameNum frameId
*/
uint8_t from = (canframe->id >> 16 & 0xFF);
uint8_t nframe = (canframe->id & 0xFF00) >> 8;
uint8_t frameId = (canframe->id & 0x00FF);
CanPacketRxBuffer *rxbuf = nullptr;
rxbuf = findRxBuff(from);
if (frameId == 0) {
rxbuf->rxdataSize = 0;
rxbuf->rxPacketNum = 0;
}
if (!rxbuf) {
ZLOGE(TAG, "board[%d] packetId[%d] find rx buff fail", from, frameId);
return;
}
memcpy(rxbuf->rxdata + rxbuf->rxdataSize, canframe->data, canframe->dlc);
rxbuf->rxdataSize += canframe->dlc;
/**
* @brief
*/
rxbuf->rxPacketNum++;
if (nframe == frameId + 1) {
if (rxbuf->rxPacketNum == nframe) {
processRxPacket((iflytop_canbus_frame_t *)rxbuf->rxdata, rxbuf->rxdataSize);
} else {
ZLOGE(TAG, "lost packet from %d", from);
}
}
});
}
CanPacketRxBuffer *IflytopCanbusMaster::findRxBuff(int deviceId) {
for (int i = 0; i < ZARRAY_SIZE(m_rxbuf); i++) {
if (m_rxbuf[i].id == deviceId) {
return &m_rxbuf[i];
}
if (m_rxbuf[i].id == 0) {
m_rxbuf[i].id = deviceId;
return &m_rxbuf[i];
}
}
ZASSERT(0);
return nullptr;
}
void IflytopCanbusMaster::processRxPacket(iflytop_canbus_frame_t *frame, size_t len) {
if (on_rx_raw) on_rx_raw(kcmd_receipt, (uint8_t *)frame, len);
}
void IflytopCanbusMaster::updateChannelConfig() { //
m_waveCan.setCanpPrameter(CANUSB_SPEED_500000, CANUSB_MODE_NORMAL, CANUSB_FRAME_EXTENDED);
}
@ -62,6 +120,8 @@ void IflytopCanbusMaster::callcmd(int32_t device_id, int32_t cmdid, uint8_t *dat
}
void IflytopCanbusMaster::sendframe(iflytop_canbus_frame_t *frame, size_t len) {
if (on_rx_raw) on_rx_raw(kcmd_cmd, (uint8_t *)frame, len);
uint8_t *packet = (uint8_t *)frame;
int npacket = len / 8 + (len % 8 == 0 ? 0 : 1);

21
iflytop_canbus/iflytop_canbus_master.hpp

@ -30,11 +30,20 @@ class RxReceiptContext {
size_t receiptLen;
};
class CanPacketRxBuffer {
public:
int32_t id = 0;
uint8_t rxdata[2048] = {0};
int rxdataSize = 0;
int rxPacketNum;
};
typedef enum {
kcmd_cmd,
kcmd_receipt,
kcmd_report,
kcmd_ch4_data,
} raw_data_type_t;
typedef function<void(raw_data_type_t type, uint8_t *hex, uint32_t hexlen)> on_raw_data_t;
@ -60,16 +69,20 @@ class IflytopCanbusMaster {
*******************************************************************************/
mutex m_tx_lock;
uint8_t m_txbuf[1024];
uint8_t m_rxbuf[1024];
int32_t m_rxsize;
uint8_t m_txindex = 0;
WaveshareCan m_waveCan;
CanPacketRxBuffer m_rxbuf[255];
on_raw_data_t on_rx_raw;
public:
static IflytopCanbusMaster *ins();
void initialize(IDataChannel *channel);
void regOnRawData(on_raw_data_t cb) { on_rx_raw = cb; }
void updateChannelConfig();
void callcmd(int32_t device_id, int32_t cmdid, uint8_t *data, size_t len);
@ -81,6 +94,10 @@ class IflytopCanbusMaster {
private:
void sendframe(iflytop_canbus_frame_t *frame, size_t len);
void sendsubframe(int npacket, int packetIndex, uint8_t *packet, size_t len);
void processRxPacket(iflytop_canbus_frame_t *frame, size_t len);
private:
CanPacketRxBuffer *findRxBuff(int deviceId);
};
} // namespace iflytop

2
libzqt/logger.cpp

@ -14,7 +14,7 @@ void zos_log(const char* fmt, ...) {
va_end(args);
}
int32_t zos_get_ticket() { return (int32_t)QDateTime::currentMSecsSinceEpoch(); }
uint32_t zos_get_ticket() { return (uint32_t)QDateTime::currentMSecsSinceEpoch(); }
std::string zhex2str(const uint8_t* hex, size_t len) {
std::string str;

5
libzqt/logger.hpp

@ -5,7 +5,7 @@
#include <string>
void zos_log(const char* fmt, ...);
int32_t zos_get_ticket();
uint32_t zos_get_ticket();
std::string zhex2str(const uint8_t* hex, size_t len);
std::string zhex2binary(uint8_t hex);
@ -20,3 +20,6 @@ std::string zhex32ToBinary(uint32_t hex);
ZLOGE("ASSERT", "condition: %s", #cond); \
exit(-1); \
}
#define ZARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))

20
mainwindow.cpp

@ -24,8 +24,8 @@ typedef enum {
static MainWindow *m_mainWindow;
static QTDataChannel G_QTDataChannel;
static QTDataChannel G_WaveDataChannel;
static device_type_t m_devicetype;
static IflytopCanbusMaster *m_canbusMaster;
QT_REQUIRE_CONFIG(groupbox);
@ -313,7 +313,7 @@ QWidget *MainWindow::allocNewTab(QString zh_name) {
newtab->setLayout(verticalLayout);
// 添加Tab
ui->buttonTabWidget->addTab(newtab, QString());
ui->buttonTabWidget->insertTab(0,newtab, QString());
ui->buttonTabWidget->setTabText(ui->buttonTabWidget->indexOf(newtab), zh_name);
return newtab;
}
@ -410,6 +410,16 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
G_QTDataChannel.init();
G_WaveDataChannel.init();
IflytopCanbusMaster::ins()->initialize(&G_QTDataChannel);
IflytopCanbusMaster::ins()->regOnRawData([this](raw_data_type_t type, uint8_t *hex, uint32_t hexlen) {
if (type == kcmd_cmd) {
rawDataPreviewShow("[CMD ] %s", zhex2str(hex, hexlen).c_str());
} else if (type == kcmd_receipt) {
rawDataPreviewShow("[RECEIPT] %s", zhex2str(hex, hexlen).c_str());
} else if (type == kcmd_report) {
rawDataPreviewShow("[REPORT ] %s", zhex2str(hex, hexlen).c_str());
}
});
}
MainWindow::~MainWindow() { delete ui; }
@ -425,6 +435,10 @@ void MainWindow::constructAppUI() {
addNewButtonStyle1(box, "扫描模块", {"deviceId"}, [](int argn, const char **args) { //
IflytopCanbusMaster::ins()->callcmd(atoi(args[0]), kmodule_ping);
});
endAllocNewBox(box);
}
endAllocNewTab(tab);

149
mainwindow.ui

@ -659,48 +659,79 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {
</widget>
</item>
<item>
<widget class="QGroupBox" name="serialSettingGB_2">
<widget class="QGroupBox" name="PublicStateBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="title">
<string>波形串口设置</string>
<string>通用参数</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="1">
<widget class="QComboBox" name="waveSerialPortCB"/>
</item>
<item row="3" column="0" colspan="2">
<widget class="QPushButton" name="waveSerialOpenKey">
<property name="text">
<string>打开</string>
<layout class="QFormLayout" name="formLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="PublicState_DeviceID_Lable">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="waveSerialBaudrateCB"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="serialBaudrateLable_2">
<property name="text">
<string>波特率</string>
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>25</height>
</size>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="serialPortLable_2">
<property name="text">
<string>串口</string>
<string>设备ID </string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QPushButton" name="waveSerialPortRefreshKey">
<property name="text">
<string>刷新</string>
<item row="0" column="1">
<widget class="QTextBrowser" name="PublicState_DeviceID">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>25</height>
</size>
</property>
<property name="lineWrapColumnOrWidth">
<number>2</number>
</property>
</widget>
</item>
@ -881,8 +912,68 @@ p, li { white-space: pre-wrap; }
<enum>Qt::DefaultContextMenu</enum>
</property>
<property name="currentIndex">
<number>-1</number>
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>波形显示器</string>
</attribute>
<widget class="QGroupBox" name="serialSettingGB_2">
<property name="geometry">
<rect>
<x>20</x>
<y>20</y>
<width>182</width>
<height>126</height>
</rect>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>波形串口设置</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="1">
<widget class="QComboBox" name="waveSerialPortCB"/>
</item>
<item row="3" column="0" colspan="2">
<widget class="QPushButton" name="waveSerialOpenKey">
<property name="text">
<string>打开</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="waveSerialBaudrateCB"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="serialBaudrateLable_2">
<property name="text">
<string>波特率</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="serialPortLable_2">
<property name="text">
<string>串口</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QPushButton" name="waveSerialPortRefreshKey">
<property name="text">
<string>刷新</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</widget>
</item>
<item>

Loading…
Cancel
Save