zhaohe 2 years ago
parent
commit
2312b32cc0
  1. 165
      components/step_motor_ctrl_module/zcan_master_step_motor_ctrl_module.cpp
  2. 10
      components/step_motor_ctrl_module/zcan_master_step_motor_ctrl_module.hpp
  3. 92
      components/step_motor_ctrl_module/zcan_step_motor_ctrl_module.cpp
  4. 17
      components/step_motor_ctrl_module/zcan_step_motor_ctrl_module.hpp
  5. 100
      components/xy_robot_ctrl_module/zcan_xy_robot_master_module.cpp
  6. 10
      components/xy_robot_ctrl_module/zcan_xy_robot_master_module.hpp
  7. 126
      components/xy_robot_ctrl_module/zcan_xy_robot_module.cpp
  8. 19
      components/xy_robot_ctrl_module/zcan_xy_robot_module.hpp
  9. 31
      components/zcancmder/basic.cpp
  10. 6
      components/zcancmder/basic.hpp
  11. 89
      components/zcancmder/zcanreceiver.cpp
  12. 33
      components/zcancmder/zcanreceiver.hpp
  13. 105
      components/zcancmder/zcanreceiver_master.cpp
  14. 48
      components/zcancmder/zcanreceiver_master.hpp
  15. 3
      components/zcancmder_module/zcan_basic_order_module.cpp
  16. 2
      components/zcancmder_module/zcan_basic_order_module.hpp
  17. 2
      components/zcancmder_module/zcan_eeprom_module.cpp
  18. 2
      components/zcancmder_module/zcan_eeprom_module.hpp
  19. 4
      components/zcancmder_module/zcan_mini_servo_ctrl_module.cpp
  20. 3
      components/zcancmder_module/zcan_mini_servo_ctrl_module.hpp
  21. 2
      components/zcancmder_module/zcan_motor_laser_code_scanner_scan_module.cpp
  22. 3
      components/zcancmder_module/zcan_motor_laser_code_scanner_scan_module.hpp
  23. 2
      components/zcancmder_module/zcan_pipette_module.cpp
  24. 3
      components/zcancmder_module/zcan_pipette_module.hpp

165
components/step_motor_ctrl_module/zcan_master_step_motor_ctrl_module.cpp

@ -1,165 +0,0 @@
#include "zcan_master_step_motor_ctrl_module.hpp"
#include "sdk\components\zprotocols\errorcode\errorcode.hpp"
using namespace iflytop;
#define TAG "StepMotorCtrlModule"
#define OVERTIME 30
namespace iflytop {
namespace zcancmder_master {
class StepMotorCtrlModule : public I_StepMotorCtrlModule {
int m_id = 0;
uint8_t m_txbuf[128] = {0};
ZCanCommnaderMaster* m_cancmder;
map<int, uint16_t> indexcache;
public:
void initialize(ZCanCommnaderMaster* cancmder, int id) {
m_cancmder = cancmder;
m_id = id;
}
uint16_t& getindexcache(int cmdid) {
auto it = indexcache.find(cmdid);
if (it == indexcache.end()) {
indexcache[cmdid] = 0;
return indexcache[cmdid];
} else {
return it->second;
}
}
virtual int32_t move_to(int32_t x, action_cb_status_t status_cb) { //
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_step_motor_ctrl_move_to, OVERTIME, cmd->x = x;);
}
virtual int32_t move_by(int32_t dx, action_cb_status_t status_cb) { //
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_step_motor_ctrl_move_by, OVERTIME, cmd->dx = dx;);
}
virtual int32_t move_to(int32_t x, int32_t velocity, action_cb_status_t status_cb) { //
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_step_motor_ctrl_move_to, OVERTIME, cmd->x = x; cmd->speed = velocity;);
}
virtual int32_t move_by(int32_t dx, int32_t velocity, action_cb_status_t status_cb) { //
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_step_motor_ctrl_move_by, OVERTIME, cmd->dx = dx; cmd->speed = velocity;);
}
virtual int32_t move_to_zero(action_cb_status_t status_cb) { //
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_step_motor_ctrl_move_to_zero, OVERTIME);
}
virtual int32_t move_to_zero_with_calibrate(int32_t x, action_cb_status_t status_cb) { //
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_step_motor_ctrl_move_to_zero_with_calibrate, OVERTIME, cmd->x = x;);
}
virtual int32_t rotate(int32_t speed, int32_t lastforms, action_cb_status_t status_cb) { //
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_step_motor_ctrl_rotate, OVERTIME, cmd->speed = speed; cmd->run_time = lastforms;);
}
virtual int32_t enable(bool venable) { //
ZCAN_SEND_CMD_NO_ACK(kcmd_step_motor_ctrl_enable, OVERTIME, cmd->enable = venable;);
}
virtual int32_t stop(uint8_t stopType) { //
ZCAN_SEND_CMD_NO_ACK(kcmd_step_motor_ctrl_stop, OVERTIME, cmd->stop_type = stopType;);
}
virtual int32_t force_change_current_pos(int32_t x) { //
ZCAN_SEND_CMD_NO_ACK(kcmd_step_motor_ctrl_force_change_current_pos, OVERTIME, cmd->x = x;);
}
virtual int32_t move_to_logic_point(int32_t logic_point_num, action_cb_status_t status_cb) { //
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_step_motor_ctrl_move_to_logic_point, OVERTIME, cmd->logic_point_num = logic_point_num;);
}
virtual int32_t set_logic_point(int logic_point_num, int32_t x, int32_t vel, s32 acc, s32 dec) { //
ZCAN_SEND_CMD_NO_ACK(kcmd_step_motor_ctrl_set_logic_point, OVERTIME, cmd->index = logic_point_num; cmd->x = x; cmd->velocity = vel; cmd->acc = acc; cmd->dec = dec;);
}
virtual int32_t get_logic_point(int logic_point_num, logic_point_t& logic_point) { //
ZCAN_SEND_CMD(kcmd_step_motor_ctrl_get_logic_point, logic_point, OVERTIME, cmd->logic_point_num = logic_point_num;);
}
virtual int32_t flush() { //
ZCAN_SEND_CMD_NO_ACK(kcmd_step_motor_ctrl_flush, 3000);
}
virtual int32_t factory_reset() { //
ZCAN_SEND_CMD_NO_ACK(kcmd_step_motor_ctrl_factory_reset, 3000);
}
virtual int32_t read_version(version_t& version) { //
ZCAN_SEND_CMD(kcmd_step_motor_ctrl_read_version, version, OVERTIME);
}
virtual int32_t read_status(status_t& status) { //
ZCAN_SEND_CMD(kcmd_step_motor_ctrl_read_status, status, OVERTIME);
}
virtual int32_t read_detailed_status(detailed_status_t& debug_info) { //
ZCAN_SEND_CMD(kcmd_step_motor_ctrl_read_detailed_status, debug_info, OVERTIME);
}
virtual int32_t set_base_param(const base_param_t& param) { //
ZCAN_SEND_CMD_NO_ACK(kcmd_step_motor_ctrl_set_base_param, OVERTIME, cmd->param = param;);
}
virtual int32_t get_base_param(base_param_t& param) { //
ZCAN_SEND_CMD(kcmd_step_motor_ctrl_get_base_param, param, OVERTIME);
}
virtual bool isbusy() { //
status_t status;
int32_t err = read_status(status);
if (err != 0) {
return status.status != 0;
}
return false;
}
virtual int32_t get_last_exec_status() { //
detailed_status_t status;
int32_t err = read_detailed_status(status);
if (err != 0) {
return status.last_exec_status;
}
return err;
}
virtual int32_t read_pos(int32_t& pos) { //
status_t status;
int32_t err = read_status(status);
if (err == 0) {
pos = status.x;
}
return err;
}
virtual int32_t read_pos() { //
int32_t pos = 0;
read_pos(pos);
return pos;
}
virtual bool read_zero_io_state() { //
status_t status;
int32_t err = read_status(status);
if (err != 0) {
return status.io_state & 0x01;
}
return 0;
}
virtual int32_t move_to_block(int32_t tox, int overtime) { //
return err::kovertime;
}
virtual int32_t move_by_block(int32_t dx, int overtime) { //
return err::kovertime;
}
virtual int32_t move_to_block(int32_t tox, int32_t velocity, int overtime) { //
return err::kovertime;
}
virtual int32_t move_by_block(int32_t dx, int32_t velocity, int overtime) { //
return err::kovertime;
}
virtual int32_t move_to_zero_block(int overtime) { //
return err::kovertime;
}
virtual int32_t move_to_zero_with_calibrate_block(int32_t x, int overtime) { //
return err::kovertime;
}
};
I_StepMotorCtrlModule* create_zcan_master_step_motor_ctrl_module(ZCanCommnaderMaster* cancmder, int id) {
StepMotorCtrlModule* module = new StepMotorCtrlModule();
ZASSERT(module);
module->initialize(cancmder, id);
return module;
}
} // namespace zcancmder_master
} // namespace iflytop

10
components/step_motor_ctrl_module/zcan_master_step_motor_ctrl_module.hpp

@ -1,10 +0,0 @@
#pragma once
#include "sdk\components\zcancmder\zcanreceiver_master.hpp"
#include "sdk\components\zprotocols\zcancmder\api\i_step_motor_ctrl_module.hpp"
#if 1
namespace iflytop {
namespace zcancmder_master {
I_StepMotorCtrlModule* create_zcan_master_step_motor_ctrl_module(ZCanCommnaderMaster* cancmder, int id);
} // namespace zcancmder_master
} // namespace iflytop
#endif

92
components/step_motor_ctrl_module/zcan_step_motor_ctrl_module.cpp

@ -1,92 +0,0 @@
#include "zcan_step_motor_ctrl_module.hpp"
using namespace iflytop;
#define TAG "ZCanStepMotorCtrlModule"
#if 1
void ZCanStepMotorCtrlModule::initialize(ZCanCmder* cancmder, int id, I_StepMotorCtrlModule* module) {
m_cancmder = cancmder;
m_id = id;
m_module = module;
// m_lock.init();
cancmder->registerListener(this);
}
void ZCanStepMotorCtrlModule::onRceivePacket(CanPacketRxBuffer* rxcmd) {
// zlock_guard l(m_lock);
ZLOGI(TAG, "onRceivePacket %d %d", rxcmd->get_cmdheader()->cmdid, rxcmd->get_cmdheader()->subcmdid);
PROCESS_PACKET(kcmd_step_motor_ctrl_enable, m_id) { errorcode = m_module->enable(cmd->enable); }
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_stop, m_id) { errorcode = m_module->stop(cmd->stop_type); }
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_move_to_zero, m_id) {
errorcode = m_module->move_to_zero([this, cmdheader](int32_t status) { PROCESS_REPORT(kcmd_step_motor_ctrl_move_to_zero); });
}
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_move_to_zero_with_calibrate, m_id) {
errorcode = m_module->move_to_zero_with_calibrate(cmd->x, [this, cmdheader](int32_t status) { PROCESS_REPORT(kcmd_step_motor_ctrl_move_to_zero_with_calibrate); });
}
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_move_to, m_id) {
errorcode = m_module->move_to(cmd->x, cmd->speed, [this, cmdheader](int32_t status) { PROCESS_REPORT(kcmd_step_motor_ctrl_move_to); });
}
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_move_by, m_id) {
errorcode = m_module->move_by(cmd->dx, cmd->speed, [this, cmdheader](int32_t status) { PROCESS_REPORT(kcmd_step_motor_ctrl_move_by); });
}
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_force_change_current_pos, m_id) { errorcode = m_module->force_change_current_pos(cmd->x); }
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_rotate, m_id) {
errorcode = m_module->rotate(cmd->speed, cmd->run_time, [this, cmdheader](int32_t status) { PROCESS_REPORT(kcmd_step_motor_ctrl_rotate); });
}
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_read_version, m_id) { //
errorcode = m_module->read_version(ack->ack);
}
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_read_status, m_id) { //
errorcode = m_module->read_status(ack->ack);
}
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_read_detailed_status, m_id) { //
errorcode = m_module->read_detailed_status(ack->ack);
}
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_set_base_param, m_id) { //
errorcode = m_module->set_base_param(cmd->param);
}
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_get_base_param, m_id) { //
errorcode = m_module->get_base_param(ack->ack);
}
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_move_to_logic_point, m_id) {
errorcode = m_module->move_to_logic_point(cmd->logic_point_num, [this, cmdheader](int32_t status) { PROCESS_REPORT(kcmd_step_motor_ctrl_move_to_logic_point); });
}
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_set_logic_point, m_id) { errorcode = m_module->set_logic_point(cmd->index, cmd->x, cmd->velocity, cmd->acc, cmd->dec); }
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_get_logic_point, m_id) { errorcode = m_module->get_logic_point(cmd->logic_point_num, ack->ack); }
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_flush, m_id) { errorcode = m_module->flush(); }
END_PP();
PROCESS_PACKET(kcmd_step_motor_ctrl_factory_reset, m_id) { errorcode = m_module->factory_reset(); }
END_PP();
}
#endif

17
components/step_motor_ctrl_module/zcan_step_motor_ctrl_module.hpp

@ -1,17 +0,0 @@
#pragma once
#include "sdk/components/zprotocols/zcancmder/api/i_step_motor_ctrl_module.hpp"
#include "sdk\components\zcancmder\zcanreceiver.hpp"
namespace iflytop {
class ZCanStepMotorCtrlModule : public ZCanCmderListener {
ZCanCmder* m_cancmder = nullptr;
int m_id = 0;
I_StepMotorCtrlModule* m_module;
uint8_t m_txbuf[128] = {0};
// zmutex m_lock;
public:
void initialize(ZCanCmder* cancmder, int id, I_StepMotorCtrlModule* m_module);
virtual void onRceivePacket(CanPacketRxBuffer* rxcmd);
};
} // namespace iflytop

100
components/xy_robot_ctrl_module/zcan_xy_robot_master_module.cpp

@ -1,100 +0,0 @@
#include "zcan_xy_robot_master_module.hpp"
using namespace iflytop;
#define TAG "ZCANXYRobotCtrlMasterModule"
#define OVERTIME 30
namespace iflytop {
namespace zcancmder_master {
class ZCANXYRobotCtrlMasterModule : public I_XYRobotCtrlModule {
int m_id = 0;
uint8_t m_txbuf[128] = {0};
ZCanCommnaderMaster* m_cancmder;
map<int, uint16_t> indexcache;
public:
void initialize(ZCanCommnaderMaster* cancmder, int id) {
m_cancmder = cancmder;
m_id = id;
}
uint16_t& getindexcache(int cmdid) {
auto it = indexcache.find(cmdid);
if (it == indexcache.end()) {
indexcache[cmdid] = 0;
return indexcache[cmdid];
} else {
return it->second;
}
}
virtual int32_t move_to(int32_t x, int32_t y, int speed, action_cb_status_t status_cb) override { //
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_xy_robot_ctrl_move_to, OVERTIME, cmd->x = x; cmd->y = y; cmd->speed = speed;);
}
virtual int32_t move_by(int32_t dx, int32_t dy, int speed, action_cb_status_t status_cb) override { //
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_xy_robot_ctrl_move_by, OVERTIME, cmd->dx = dx; cmd->dy = dy; cmd->speed = speed;);
}
virtual int32_t move_by_no_limit(int32_t dx, int32_t dy, int speed, action_cb_status_t status_cb) override { //
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_xy_robot_ctrl_move_by_no_limit, OVERTIME, cmd->dx = dx; cmd->dy = dy; cmd->speed = speed;);
}
virtual int32_t move_to_zero(action_cb_status_t status_cb) override {
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_xy_robot_ctrl_move_to_zero, OVERTIME); //
}
virtual int32_t move_to_zero_with_calibrate(int32_t nowx, int32_t nowxy, action_cb_status_t status_cb) override { //
ZCAN_SEND_CMD_WITH_STATUS_CB(kcmd_xy_robot_ctrl_move_to_zero_with_calibrate, OVERTIME, cmd->nowx = nowx; cmd->nowy = nowxy;);
}
virtual int32_t enable(bool venable) override { //
ZCAN_SEND_CMD_NO_ACK(kcmd_xy_robot_ctrl_enable, OVERTIME, cmd->enable = venable;);
}
virtual int32_t stop(uint8_t stop_type) override { //
ZCAN_SEND_CMD_NO_ACK(kcmd_xy_robot_ctrl_stop, OVERTIME, cmd->stop_type = stop_type;);
}
virtual int32_t force_change_current_pos(int32_t x, int32_t y) override { //
ZCAN_SEND_CMD_NO_ACK(kcmd_xy_robot_ctrl_force_change_current_pos, OVERTIME, cmd->x = x; cmd->y = y;);
}
virtual int32_t read_version(version_t& version) override { //
ZCAN_SEND_CMD(kcmd_xy_robot_ctrl_read_version, version, OVERTIME);
}
virtual int32_t read_status(status_t& status) override { //
// ZCAN_SEND_CMD(kcmd_xy_robot_ctrl_read_status, status, OVERTIME);
auto* cmdheader = (Cmdheader_t*)m_txbuf;
auto* cmd = (kcmd_xy_robot_ctrl_read_status_cmd_t*)cmdheader->data;
cmdheader->cmdid = (kcmd_xy_robot_ctrl_read_status >> 8);
cmdheader->subcmdid = (kcmd_xy_robot_ctrl_read_status & 0xff);
cmdheader->packetType = zcr::kpt_cmd;
static_assert(sizeof(kcmd_xy_robot_ctrl_read_status_cmd_t) <= sizeof(m_txbuf), "m_txbuf is too small");
cmd->id = m_id;
int32_t errorcode = m_cancmder->sendCmd((uint8_t*)m_txbuf, sizeof(*cmdheader) + sizeof(*cmd), (uint8_t*)&status, sizeof(status), 30);
return errorcode;
}
virtual int32_t read_detailed_status(detailed_status_t& debug_info) override { //
ZCAN_SEND_CMD(kcmd_xy_robot_ctrl_read_detailed_status, debug_info, OVERTIME);
}
virtual int32_t set_base_param(const base_param_t& param) override { //
ZCAN_SEND_CMD_NO_ACK(kcmd_xy_robot_ctrl_set_base_param, OVERTIME, cmd->param = param;);
}
virtual int32_t get_base_param(base_param_t& ack) override { //
ZCAN_SEND_CMD(kcmd_xy_robot_ctrl_get_base_param, ack, OVERTIME);
}
virtual int32_t flush() override { //
ZCAN_SEND_CMD_NO_ACK(kcmd_xy_robot_ctrl_flush, 3000);
}
virtual int32_t factory_reset() override { //
ZCAN_SEND_CMD_NO_ACK(kcmd_xy_robot_ctrl_factory_reset, 3000);
}
};
I_XYRobotCtrlModule* create_xyrobot_ctrl_module(ZCanCommnaderMaster* cancmder, int id) {
ZCANXYRobotCtrlMasterModule* module = new ZCANXYRobotCtrlMasterModule();
ZASSERT(module);
module->initialize(cancmder, id);
return module;
}
} // namespace zcancmder_master
} // namespace iflytop

10
components/xy_robot_ctrl_module/zcan_xy_robot_master_module.hpp

@ -1,10 +0,0 @@
#pragma once
#include "sdk\components\zcancmder\zcanreceiver_master.hpp"
#include "sdk\components\zprotocols\zcancmder\api\i_xyrobot_ctrl_module.hpp"
#if 1
namespace iflytop {
namespace zcancmder_master {
I_XYRobotCtrlModule* create_xyrobot_ctrl_module(ZCanCommnaderMaster* cancmder, int id);
} // namespace zcancmder_master
} // namespace iflytop
#endif

126
components/xy_robot_ctrl_module/zcan_xy_robot_module.cpp

@ -1,126 +0,0 @@
#include "zcan_xy_robot_module.hpp"
using namespace iflytop;
#define TAG "ZCANXYRobotCtrlModule"
#if 1
void ZCANXYRobotCtrlModule::initialize(ZCanCmder* cancmder, int id, I_XYRobotCtrlModule* xyRobotCtrlModule) {
m_cancmder = cancmder;
m_id = id;
m_xyRobotCtrlModule = xyRobotCtrlModule;
m_lock.init();
cancmder->registerListener(this);
}
void ZCANXYRobotCtrlModule::onRceivePacket(CanPacketRxBuffer* rxcmd) {
zlock_guard l(m_lock);
PROCESS_PACKET(kcmd_xy_robot_ctrl_enable, m_id) { //
errorcode = m_xyRobotCtrlModule->enable(cmd->enable);
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_stop, m_id) { //
errorcode = m_xyRobotCtrlModule->stop(cmd->stop_type);
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_move_to_zero, m_id) { //
errorcode = m_xyRobotCtrlModule->move_to_zero([this, cmdheader](int32_t status) {
osDelay(5); // 用来保证回执消息在前面
kcmd_xy_robot_ctrl_move_to_zero_report_t report = {0};
ZLOGI(TAG, "kcmd_xy_robot_ctrl_move_to_zero exec_status:%d", status);
report.exec_status = status;
m_cancmder->sendExecStatusReport(cmdheader, (uint8_t*)&report, sizeof(report));
});
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_move_to_zero_with_calibrate, m_id) { //
errorcode = m_xyRobotCtrlModule->move_to_zero_with_calibrate(cmd->nowx, cmd->nowy, [this, cmdheader](int32_t status) {
osDelay(5); // 用来保证回执消息在前面
kcmd_xy_robot_ctrl_move_to_zero_with_calibrate_report_t report = {0};
ZLOGI(TAG, "kcmd_xy_robot_ctrl_move_to_zero_with_calibrate exec_status:%d", status);
report.exec_status = status;
m_cancmder->sendExecStatusReport(cmdheader, (uint8_t*)&report, sizeof(report));
});
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_move_to, m_id) { //
errorcode = m_xyRobotCtrlModule->move_to(cmd->x, cmd->y, cmd->speed, [this, cmdheader](int32_t status) {
osDelay(5); // 用来保证回执消息在前面
kcmd_xy_robot_ctrl_move_to_report_t report = {0};
ZLOGI(TAG, "kcmd_xy_robot_ctrl_move_to exec_status:%d", status);
report.exec_status = status;
m_cancmder->sendExecStatusReport(cmdheader, (uint8_t*)&report, sizeof(report));
});
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_move_by, m_id) { //
errorcode = m_xyRobotCtrlModule->move_by(cmd->dx, cmd->dy, cmd->speed, [this, cmdheader](int32_t status) {
osDelay(5); // 用来保证回执消息在前面
kcmd_xy_robot_ctrl_move_by_report_t report = {0};
ZLOGI(TAG, "kcmd_xy_robot_ctrl_move_by exec_status:%d", status);
report.exec_status = status;
m_cancmder->sendExecStatusReport(cmdheader, (uint8_t*)&report, sizeof(report));
});
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_move_by_no_limit, m_id) { //
errorcode = m_xyRobotCtrlModule->move_by(cmd->dx, cmd->dy, cmd->speed, [this, cmdheader](int32_t status) {
osDelay(5); // 用来保证回执消息在前面
kcmd_xy_robot_ctrl_move_by_report_t report = {0};
ZLOGI(TAG, "kcmd_xy_robot_ctrl_move_by exec_status:%d", status);
report.exec_status = status;
m_cancmder->sendExecStatusReport(cmdheader, (uint8_t*)&report, sizeof(report));
});
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_force_change_current_pos, m_id) { //
errorcode = m_xyRobotCtrlModule->force_change_current_pos(cmd->x, cmd->y);
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_read_version, m_id) { //
errorcode = m_xyRobotCtrlModule->read_version(ack->ack);
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_read_status, m_id) { //
errorcode = m_xyRobotCtrlModule->read_status(ack->ack);
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_read_detailed_status, m_id) { //
errorcode = m_xyRobotCtrlModule->read_detailed_status(ack->ack);
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_set_base_param, m_id) { //
errorcode = m_xyRobotCtrlModule->set_base_param(cmd->param);
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_get_base_param, m_id) { //
errorcode = m_xyRobotCtrlModule->get_base_param(ack->ack);
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_flush, m_id) { //
errorcode = m_xyRobotCtrlModule->flush();
}
END_PP();
PROCESS_PACKET(kcmd_xy_robot_ctrl_factory_reset, m_id) { //
errorcode = m_xyRobotCtrlModule->factory_reset();
}
END_PP();
// PROCESS_PACKET(kcmd_xy_robot_ctrl_set_warning_limit_param, m_id) { //
// errorcode = m_xyRobotCtrlModule->set_warning_limit_param(cmd->opt_type, cmd->param, ack->ack);
// }
// END_PP();
// PROCESS_PACKET(kcmd_xy_robot_ctrl_set_run_to_zero_param, m_id) { //
// errorcode = m_xyRobotCtrlModule->set_run_to_zero_param(cmd->opt_type, cmd->param, ack->ack);
// }
// END_PP();
}
#endif

19
components/xy_robot_ctrl_module/zcan_xy_robot_module.hpp

@ -1,19 +0,0 @@
#pragma once
#include "sdk\components\xy_robot_ctrl_module\xy_robot_ctrl_module.hpp"
#include "sdk\components\zcancmder\zcanreceiver.hpp"
#if 1
namespace iflytop {
class ZCANXYRobotCtrlModule : public ZCanCmderListener {
ZCanCmder* m_cancmder = nullptr;
int m_id = 0;
I_XYRobotCtrlModule* m_xyRobotCtrlModule;
uint8_t m_txbuf[128] = {0};
zmutex m_lock;
public:
void initialize(ZCanCmder* cancmder, int id, I_XYRobotCtrlModule* xyRobotCtrlModule);
virtual void onRceivePacket(CanPacketRxBuffer* rxcmd);
};
} // namespace iflytop
#endif

31
components/zcancmder/basic.cpp

@ -3,36 +3,37 @@
using namespace iflytop;
using namespace std;
uint16_t CanPacketRxBuffer::get_packetindex() {
Cmdheader_t *cmdheader = (Cmdheader_t *)rxdata;
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return cmdheader->packetindex;
}
uint16_t CanPacketRxBuffer::get_cmdid() {
Cmdheader_t *cmdheader = (Cmdheader_t *)rxdata;
return cmdheader->cmdid;
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return CMDID(cmdheader->cmdmoduleid, cmdheader->subcmdid);
}
uint8_t CanPacketRxBuffer::get_subcmdid() {
Cmdheader_t *cmdheader = (Cmdheader_t *)rxdata;
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return cmdheader->subcmdid;
}
uint8_t CanPacketRxBuffer::get_packetType() {
Cmdheader_t *cmdheader = (Cmdheader_t *)rxdata;
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return cmdheader->packetType;
}
uint8_t *CanPacketRxBuffer::get_data() {
Cmdheader_t *cmdheader = (Cmdheader_t *)rxdata;
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return cmdheader->data;
}
uint16_t CanPacketRxBuffer::get_datalen() {
Cmdheader_t *cmdheader = (Cmdheader_t *)rxdata;
return rxdataSize - sizeof(Cmdheader_t);
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return rxdataSize - sizeof(zcr_cmd_header_t);
}
bool CanPacketRxBuffer::iscmd(CmdID_t id) {
Cmdheader_t *cmdheader = (Cmdheader_t *)rxdata;
uint16_t maincmdid = ((uint32_t)id >> 8) & 0xFFFF;
uint8_t subcmdId = ((uint32_t)id) & 0xFF;
return cmdheader->cmdid == maincmdid && cmdheader->subcmdid == subcmdId;
bool CanPacketRxBuffer::iscmd(int32_t id) {
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
uint16_t maincmdid = ((uint32_t)id >> 8) & 0xFFFF;
uint8_t subcmdId = ((uint32_t)id) & 0xFF;
return cmdheader->cmdmoduleid == maincmdid && cmdheader->subcmdid == subcmdId;
}
Cmdheader_t *CanPacketRxBuffer::get_cmdheader() {
Cmdheader_t *cmdheader = (Cmdheader_t *)rxdata;
zcr_cmd_header_t *CanPacketRxBuffer::get_cmdheader() {
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return cmdheader;
}

6
components/zcancmder/basic.hpp

@ -4,7 +4,7 @@
#pragma once
#include "sdk/os/zos.hpp"
#include "sdk\components\zprotocols\zcancmder\zcancmder_protocol.hpp"
#include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp"
namespace iflytop {
namespace zcr {
@ -45,9 +45,9 @@ class CanPacketRxBuffer {
uint8_t *get_data();
uint16_t get_datalen();
Cmdheader_t *get_cmdheader();
zcr_cmd_header_t *get_cmdheader();
bool iscmd(CmdID_t id);
bool iscmd(int32_t id);
template <typename T>
T *get_data_as() {

89
components/zcancmder/zcanreceiver.cpp

@ -108,8 +108,7 @@ HAL_StatusTypeDef ZCanCmder::initializeFilter() {
return HAL_Status;
}
void ZCanCmder::registerListener(ZCanCmderListener *listener) { m_listenerList.push_back(listener); }
void ZCanCmder::regListener(zcan_cmder_listener_t listener) { m_listenerList2.push_back(listener); }
void ZCanCmder::registerListener(IZcanCmderListener *listener) { m_listenerList.push_back(listener); }
void ZCanCmder::sendPacket(uint8_t *packet, size_t len) {
/**
* @brief
@ -134,45 +133,70 @@ void ZCanCmder::sendPacket(uint8_t *packet, size_t len) {
}
}
}
void ZCanCmder::sendAck(Cmdheader_t *cmdheader, uint8_t *data, size_t len) {
zlock_guard l(m_lock);
Cmdheader_t *txheader = (Cmdheader_t *)txbuff;
memcpy(txheader, cmdheader, sizeof(Cmdheader_t));
txheader->packetType = kpt_ack;
#if 0
void ZCanCmder::sendAck(zcr_cmd_header_t *cmdheader, uint8_t *data, size_t len) {
zlock_guard l(m_lock);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
memcpy(txheader, cmdheader, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_ack;
memcpy(txheader->data, data, len);
sendPacket(txbuff, sizeof(Cmdheader_t) + len);
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len);
}
void ZCanCmder::sendExecStatusReport(Cmdheader_t *rxcmdheader, uint8_t *data, size_t len) {
void ZCanCmder::sendErrorAck(zcr_cmd_header_t *cmdheader, uint16_t id, uint32_t errcode) {
zlock_guard l(m_lock);
Cmdheader_t *txheader = (Cmdheader_t *)txbuff;
memcpy(txheader, rxcmdheader, sizeof(Cmdheader_t));
txheader->packetType = kpt_cmd_exec_status_report;
memcpy(txheader->data, data, len);
sendPacket(txbuff, sizeof(Cmdheader_t) + len);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
memcpy(txheader, cmdheader, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_error_ack;
zcan_cmder_error_ack_t *error_ack = (zcan_cmder_error_ack_t *)txheader->data;
error_ack->id = id;
error_ack->errorcode = errcode;
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + sizeof(zcan_cmder_error_ack_t));
}
void ZCanCmder::sendStatusReport(Cmdheader_t *rxcmdheader, uint8_t *data, size_t len) {
void ZCanCmder::sendExecStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len) {
zlock_guard l(m_lock);
Cmdheader_t *txheader = (Cmdheader_t *)txbuff;
memcpy(txheader, rxcmdheader, sizeof(Cmdheader_t));
txheader->packetType = kpt_report;
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
memcpy(txheader, rxcmdheader, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_cmd_exec_status_report;
memcpy(txheader->data, data, len);
sendPacket(txbuff, sizeof(Cmdheader_t) + len);
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len);
}
void ZCanCmder::sendErrorAck(Cmdheader_t *cmdheader, uint16_t id, uint32_t errcode) {
void ZCanCmder::sendStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len) {
zlock_guard l(m_lock);
Cmdheader_t *txheader = (Cmdheader_t *)txbuff;
memcpy(txheader, cmdheader, sizeof(Cmdheader_t));
txheader->packetType = kpt_error_ack;
zcan_cmder_error_ack_t *error_ack = (zcan_cmder_error_ack_t *)txheader->data;
error_ack->id = id;
error_ack->errorcode = errcode;
sendPacket(txbuff, sizeof(Cmdheader_t) + sizeof(zcan_cmder_error_ack_t));
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
memcpy(txheader, rxcmdheader, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_report;
memcpy(txheader->data, data, len);
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len);
}
#endif
int32_t ZCanCmder::sendAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) {
zlock_guard l(m_lock);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
memcpy(txheader, rx_cmd_header, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_ack;
memcpy(txheader->data, data, len);
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len);
return 0;
}
int32_t ZCanCmder::sendAck(zcr_cmd_header_t *rx_cmd_header, int32_t *ackvar, int32_t nack) {
zlock_guard l(m_lock);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
memcpy(txheader, rx_cmd_header, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_ack;
int32_t *txackcache = (int32_t *)txheader->data;
for (int i = 0; i < nack; i++) {
txackcache[i] = ackvar[i];
}
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + sizeof(int32_t) * nack);
return 0;
}
int32_t ZCanCmder::sendErrorAck(zcr_cmd_header_t *rx_cmd_header, int32_t errorcode) {}
bool ZCanCmder::sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems) {
zlock_guard l(m_lock);
@ -301,13 +325,8 @@ void ZCanCmder::loop() {
rxbuf->rxdataSize = dataoff;
for (auto &var : m_listenerList) {
var->onRceivePacket(rxbuf);
if (var) var->onRceivePacket(rxbuf->get_cmdheader(), rxbuf->get_data(), rxbuf->get_datalen());
}
for (auto &var : m_listenerList2) {
var(rxbuf);
}
rxbuf->dataIsReady = false;
}
}

33
components/zcancmder/zcanreceiver.hpp

@ -5,19 +5,21 @@
#pragma once
#include "basic.hpp"
#include "sdk/os/zos.hpp"
#include "sdk\components\zprotocols\zcancmder\zcancmder_protocol.hpp"
#include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp"
namespace iflytop {
using namespace zcr;
#if 0
class ZCanCmderListener {
public:
virtual void onRceivePacket(CanPacketRxBuffer *rxcmd) = 0;
};
#endif
typedef function<void(CanPacketRxBuffer *rxcmd)> zcan_cmder_listener_t;
class ZCanCmder : public ZCanIRQListener {
class ZCanCmder : public ZCanIRQListener, public IZCanCmder {
public:
class CFG {
public:
@ -46,9 +48,8 @@ class ZCanCmder : public ZCanIRQListener {
uint32_t m_lastPacketTicket = 0; // 上一次接收到消息的时间,用于判断与主机是否断开连接
HAL_StatusTypeDef m_lastTransmitStatus; // 上次调用can发送方法的返回值
list<ZCanCmderListener *> m_listenerList;
list<zcan_cmder_listener_t> m_listenerList2;
CanPacketRxBuffer m_canPacketRxBuffer[1];
list<IZcanCmderListener *> m_listenerList;
CanPacketRxBuffer m_canPacketRxBuffer[1];
int txPacketInterval_ms = 0;
zmutex m_lock;
@ -58,19 +59,22 @@ class ZCanCmder : public ZCanIRQListener {
CFG *createCFG(uint8_t deviceId);
void init(CFG *cfg);
void registerListener(ZCanCmderListener *listener);
void regListener(zcan_cmder_listener_t listener);
#if 0
void sendExecStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len);
void sendStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len);
void sendAck(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len);
void sendErrorAck(zcr_cmd_header_t *cmdheader, uint16_t id, uint32_t errcode);
#endif
void sendPacket(uint8_t *packet, size_t len);
void sendExecStatusReport(Cmdheader_t *rxcmdheader, uint8_t *data, size_t len);
void sendStatusReport(Cmdheader_t *rxcmdheader, uint8_t *data, size_t len);
void sendAck(Cmdheader_t *rxcmdheader, uint8_t *data, size_t len);
void sendErrorAck(Cmdheader_t *cmdheader, uint16_t id, uint32_t errcode);
bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems);
uint8_t getDeviceId() { return m_config->deviceId; }
void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; }
virtual void registerListener(IZcanCmderListener *listener) override;
virtual int32_t sendAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) override;
virtual int32_t sendAck(zcr_cmd_header_t *rx_cmd_header, int32_t *ackvar, int32_t nack) override;
virtual int32_t sendErrorAck(zcr_cmd_header_t *rx_cmd_header, int32_t errorcode) override;
void loop();
public:
@ -78,6 +82,9 @@ class ZCanCmder : public ZCanIRQListener {
virtual void STM32_HAL_onCAN_Error(CAN_HandleTypeDef *can);
private:
void sendPacket(uint8_t *packet, size_t len);
bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems);
HAL_StatusTypeDef initializeFilter();
HAL_StatusTypeDef activateRxIT();
HAL_StatusTypeDef deactivateRxIT();

105
components/zcancmder/zcanreceiver_master.cpp

@ -119,61 +119,44 @@ HAL_StatusTypeDef ZCanCommnaderMaster::initializeFilter() {
return HAL_Status;
}
int32_t ZCanCommnaderMaster::sendCmdWithStatusCb(uint8_t *packet, size_t len, uint16_t &packetindex, int overtime_ms, action_cb_status_t status_cb) {
return sendPacketBlock(packet, len, packetindex, NULL, 0, overtime_ms, [status_cb](CanPacketRxBuffer *rxreport) {
if (status_cb) status_cb(rxreport->get_data_as<kcmd_xy_robot_ctrl_move_to_report_t>()->exec_status);
});
}
int32_t ZCanCommnaderMaster::sendCmd(uint8_t *packet, size_t len, uint8_t *rxbuf, size_t rxbuflen, int overtime_ms) {
uint16_t packetindex = 0;
return sendPacketBlock(packet, len, packetindex, rxbuf, rxbuflen, overtime_ms, NULL);
}
int32_t ZCanCommnaderMaster::sendCmdNoAck(uint8_t *packet, size_t len, int overtime_ms) {
uint16_t packetindex = 0;
return sendPacketBlock(packet, len, packetindex, NULL, 0, overtime_ms, NULL);
}
int32_t ZCanCommnaderMaster::sendPacketBlock(uint8_t *packet,
size_t len, //
uint16_t &packetindex, //
uint8_t *rxbuf, //
size_t rxbuflen, //
int overtime_ms, //
zcan_commnader_master_onpacket_t onReport) {
Cmdheader_t *cmdheader = (Cmdheader_t *)packet;
if (packetindex != 0) {
unregListener(packetindex);
packetindex = 0;
int32_t ZCanCommnaderMaster::sendCmd(int32_t cmdid, int32_t submoduleid, int32_t *param, size_t npara, int32_t *ack, size_t nack, int overtime_ms) {
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];
}
cmdheader->packetindex = generateFreeIndex();
int32_t txlen = sizeof(zcr_cmd_header_t) + npara * sizeof(int32_t);
/**
* @brief
*/
bool rxdataIsReady = false;
int32_t errocode = 0;
regListener(
cmdheader->packetindex,
[this, &rxdataIsReady, &rxbuf, &rxbuflen, &errocode](CanPacketRxBuffer *report) {
if (report->get_cmdheader()->packetType == kpt_error_ack) {
auto *error_ack = report->get_data_as<zcan_cmder_error_ack_t>();
errocode = error_ack->errorcode;
} else {
if (rxbuf) {
// ZLOGI(TAG, "rxbuf:%d", report->get_datalen());
safe_memcpy(rxbuf, rxbuflen, report->get_data(), report->get_datalen());
}
regListener(cmdheader->packetindex, [this, &rxdataIsReady, &ack, &nack, &errocode](CanPacketRxBuffer *report) {
if (report->get_cmdheader()->packetType == kptv2_error_ack) {
auto *error_ack = report->get_data_as<int32_t>();
errocode = *error_ack;
} else {
int32_t *rxbuf = report->get_data_as<int32_t>();
if (ack != nullptr && nack != 0) {
for (size_t i = 0; i < nack; i++) {
ack[i] = rxbuf[i];
}
rxdataIsReady = true;
},
onReport, nullptr);
}
}
rxdataIsReady = true;
});
/**
* @brief
*/
sendPacket(packet, len);
sendPacket(txbuff, txlen);
/**
* @brief
@ -187,34 +170,19 @@ int32_t ZCanCommnaderMaster::sendPacketBlock(uint8_t *pa
}
osDelay(1);
}
unregListener(cmdheader->packetindex);
if (errocode != 0) {
unregListener(cmdheader->packetindex);
return errocode;
}
packetindex = cmdheader->packetindex;
if (!onReport) {
unregListener(cmdheader->packetindex);
} else {
unregListenerAckCB(cmdheader->packetindex);
}
return 0;
return errocode;
}
void ZCanCommnaderMaster::regListener(uint16_t index, //
zcan_commnader_master_onpacket_t onack, //
zcan_commnader_master_onpacket_t on_cmd_exec_status_report, //
zcan_commnader_master_onpacket_t on_report) {
void ZCanCommnaderMaster::regListener(uint16_t index, zcan_commnader_master_onpacket_t onack) {
zlock_guard l(m_on_packet_map_lock);
if (m_on_packet_map.size() > 10000) {
ZLOGW(TAG, "m_on_packet_map.size() = %d>10000", m_on_packet_map.size());
}
ZCanCommnaderMasterListener listener;
listener.on_ack = onack;
listener.on_cmd_exec_status_report = on_cmd_exec_status_report;
listener.on_report = on_report;
m_on_packet_map[index] = listener;
listener.on_ack = onack;
m_on_packet_map[index] = listener;
}
void ZCanCommnaderMaster::unregListener(uint16_t index) {
zlock_guard l(m_on_packet_map_lock);
@ -223,13 +191,6 @@ void ZCanCommnaderMaster::unregListener(uint16_t index) {
m_on_packet_map.erase(it);
}
}
void ZCanCommnaderMaster::unregListenerAckCB(uint16_t index) {
zlock_guard l(m_on_packet_map_lock);
auto it = m_on_packet_map.find(index);
if (it != m_on_packet_map.end()) {
it->second.on_ack = nullptr;
}
}
int ZCanCommnaderMaster::getListenerNum() {
zlock_guard l(m_on_packet_map_lock);
@ -252,12 +213,8 @@ void ZCanCommnaderMaster::callListener(CanPacketRxBuffer *report) {
zlock_guard l(m_on_packet_map_lock);
auto it = m_on_packet_map.find(index);
if (it != m_on_packet_map.end()) {
if (report->get_cmdheader()->packetType == kpt_ack || report->get_cmdheader()->packetType == kpt_error_ack) {
if (report->get_cmdheader()->packetType == kptv2_ack || report->get_cmdheader()->packetType == kptv2_error_ack) {
if (it->second.on_ack) it->second.on_ack(report);
} else if (report->get_cmdheader()->packetType == kpt_cmd_exec_status_report) {
if (it->second.on_cmd_exec_status_report) it->second.on_cmd_exec_status_report(report);
} else if (report->get_cmdheader()->packetType == kpt_report) {
if (it->second.on_report) it->second.on_report(report);
}
}
}

48
components/zcancmder/zcanreceiver_master.hpp

@ -7,35 +7,7 @@
#include "basic.hpp"
#include "sdk/os/zos.hpp"
#include "sdk\components\zprotocols\zcancmder\zcancmder_protocol.hpp"
#define ZCAN_SEND_CMD_PREFIX(varcmdid, overtime) \
auto *cmdheader = (Cmdheader_t *)m_txbuf; \
auto *cmd = (varcmdid##_cmd_t *)cmdheader->data; \
cmdheader->cmdid = MODULE_CMDID(varcmdid); \
cmdheader->subcmdid = SUBCMDID(varcmdid); \
cmdheader->packetType = zcr::kpt_cmd; \
static_assert(sizeof(varcmdid##_cmd_t) <= sizeof(m_txbuf), "m_txbuf is too small"); \
cmd->id = m_id;
#define ZCAN_SEND_CMD_WITH_STATUS_CB(varcmdid, overtime, ...) \
ZCAN_SEND_CMD_PREFIX(varcmdid, overtime) \
__VA_ARGS__ \
int32_t errorcode = m_cancmder->sendCmdWithStatusCb((uint8_t *)m_txbuf, sizeof(*cmdheader) + sizeof(*cmd), getindexcache(varcmdid), overtime, status_cb); \
return errorcode;
#define ZCAN_SEND_CMD(varcmdid, ack, overtime, ...) \
ZCAN_SEND_CMD_PREFIX(varcmdid, overtime) \
__VA_ARGS__ \
int32_t errorcode = m_cancmder->sendCmd((uint8_t *)m_txbuf, sizeof(*cmdheader) + sizeof(*cmd), (uint8_t *)&ack, sizeof(ack), overtime); \
return errorcode;
#define ZCAN_SEND_CMD_NO_ACK(varcmdid, overtime, ...) \
ZCAN_SEND_CMD_PREFIX(varcmdid, overtime) \
__VA_ARGS__ \
int32_t errorcode = m_cancmder->sendCmdNoAck((uint8_t *)m_txbuf, sizeof(*cmdheader) + sizeof(*cmd), overtime); \
return errorcode;
// #include "sdk\components\zprotocols\zcancmder\zcancmder_protocol.hpp"
namespace iflytop {
using namespace std;
typedef function<void(CanPacketRxBuffer *report)> zcan_commnader_master_onpacket_t;
@ -43,11 +15,9 @@ typedef function<void(CanPacketRxBuffer *report)> zcan_commnader_master_onpacket
class ZCanCommnaderMasterListener {
public:
zcan_commnader_master_onpacket_t on_ack;
zcan_commnader_master_onpacket_t on_cmd_exec_status_report;
zcan_commnader_master_onpacket_t on_report;
};
class ZCanCommnaderMaster : public ZCanIRQListener {
class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster {
public:
class CFG {
public:
@ -94,12 +64,8 @@ class ZCanCommnaderMaster : public ZCanIRQListener {
CFG *createCFG();
void init(CFG *cfg);
int32_t sendCmd(uint8_t *packet, size_t len, uint8_t *rxbuf, size_t rxbuflen, int overtime_ms);
int32_t sendCmdNoAck(uint8_t *packet, size_t len, int overtime_ms);
int32_t sendCmdWithStatusCb(uint8_t *packet, size_t len, uint16_t &packetindex, int overtime_ms, action_cb_status_t status_cb);
int32_t sendPacketBlock(uint8_t *packet, size_t len, uint16_t &packetindex, uint8_t *rxbuf, size_t rxbuflen, int overtime_ms, zcan_commnader_master_onpacket_t onReport);
void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; }
void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; }
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;
public:
virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can);
@ -110,13 +76,9 @@ class ZCanCommnaderMaster : public ZCanIRQListener {
uint8_t getDeviceId() { return m_config->deviceId; }
void sendPacket(uint8_t *packet, size_t len);
void regListener(uint16_t index, //
zcan_commnader_master_onpacket_t onack, //
zcan_commnader_master_onpacket_t on_cmd_exec_status_report, //
zcan_commnader_master_onpacket_t on_report);
void regListener(uint16_t index, zcan_commnader_master_onpacket_t onack);
void unregListener(uint16_t index);
void callListener(CanPacketRxBuffer *report);
void unregListenerAckCB(uint16_t index);
bool isListenerReg(uint16_t index);
int getListenerNum();
uint16_t generateFreeIndex();

3
components/zcancmder_module/zcan_basic_order_module.cpp

@ -6,7 +6,7 @@
using namespace iflytop;
using namespace zcr;
#if 0
void ZCanBasicOrderModule::initialize(ZCanCmder* zcanReceiver) {
zcanReceiver->registerListener(this);
m_zcanReceiver = zcanReceiver;
@ -71,4 +71,5 @@ void ZCanBasicOrderModule::onRceivePacket(CanPacketRxBuffer* rxbuf) {
void ZCanBasicOrderModule::loop() {}
#endif
#endif

2
components/zcancmder_module/zcan_basic_order_module.hpp

@ -11,6 +11,7 @@
namespace iflytop {
using namespace std;
#if 0
class ZCanBasicOrderModule : public ZCanCmderListener {
public:
private:
@ -47,6 +48,7 @@ class ZCanBasicOrderModule : public ZCanCmderListener {
private:
void loop();
};
#endif
} // namespace iflytop
#endif

2
components/zcancmder_module/zcan_eeprom_module.cpp

@ -2,7 +2,7 @@
using namespace iflytop;
#define TAG "ZCanEepromModule"
#if 1
#if 0
void ZCanEepromModule::initialize(ZCanCmder* cancmder, int id, I_EEPROMModule* module) {
m_cancmder = cancmder;
m_id = id;

2
components/zcancmder_module/zcan_eeprom_module.hpp

@ -4,6 +4,7 @@
#include "sdk\components\zcancmder\zcanreceiver.hpp"
namespace iflytop {
#if 0
class ZCanEepromModule : public ZCanCmderListener {
ZCanCmder* m_cancmder = nullptr;
int m_id = 0;
@ -16,4 +17,5 @@ class ZCanEepromModule : public ZCanCmderListener {
void initialize(ZCanCmder* cancmder, int id, I_EEPROMModule* module);
virtual void onRceivePacket(CanPacketRxBuffer* rxcmd);
};
#endif
} // namespace iflytop

4
components/zcancmder_module/zcan_mini_servo_ctrl_module.cpp

@ -1,6 +1,6 @@
#include "zcan_mini_servo_ctrl_module.hpp"
using namespace iflytop;
#if 0
#define TAG "ZCanMiniServoCtrlModule"
void ZCanMiniServoCtrlModule::initialize(ZCanCmder* cancmder, int id, I_MiniServoModule* module) {
m_cancmder = cancmder;
@ -65,3 +65,5 @@ void ZCanMiniServoCtrlModule::onRceivePacket(CanPacketRxBuffer* rxcmd) {
END_PP();
}
#endif

3
components/zcancmder_module/zcan_mini_servo_ctrl_module.hpp

@ -2,6 +2,8 @@
#include "sdk/components/zprotocols/zcancmder/api/i_mini_servo_module.hpp"
#include "sdk\components\zcancmder\zcanreceiver.hpp"
namespace iflytop {
#if 0
class ZCanMiniServoCtrlModule : public ZCanCmderListener {
ZCanCmder* m_cancmder = nullptr;
int m_id = 0;
@ -14,4 +16,5 @@ class ZCanMiniServoCtrlModule : public ZCanCmderListener {
void initialize(ZCanCmder* cancmder, int id, I_MiniServoModule* module);
virtual void onRceivePacket(CanPacketRxBuffer* rxcmd);
};
#endif
} // namespace iflytop

2
components/zcancmder_module/zcan_motor_laser_code_scanner_scan_module.cpp

@ -4,7 +4,7 @@
using namespace iflytop;
#define TAG "ZcanMotorLaserCodeScannerScanModule"
#if 1
#if 0
void ZcanMotorLaserCodeScannerScanModule::initialize(ZCanCmder* cancmder, int id, I_MotorLaserCodeScanner* module) {
m_cancmder = cancmder;
m_id = id;

3
components/zcancmder_module/zcan_motor_laser_code_scanner_scan_module.hpp

@ -5,7 +5,7 @@
#include "sdk\components\zcancmder\zcanreceiver.hpp"
#include "sdk\os\zos.hpp"
namespace iflytop {
#if 0
class ZcanMotorLaserCodeScannerScanModule : public ZCanCmderListener {
ZCanCmder* m_cancmder = nullptr;
int m_id = 0;
@ -18,4 +18,5 @@ class ZcanMotorLaserCodeScannerScanModule : public ZCanCmderListener {
void initialize(ZCanCmder* cancmder, int id, I_MotorLaserCodeScanner* module);
virtual void onRceivePacket(CanPacketRxBuffer* rxcmd);
};
#endif
} // namespace iflytop

2
components/zcancmder_module/zcan_pipette_module.cpp

@ -2,7 +2,7 @@
using namespace iflytop;
#define TAG "ZcanPipetteModule"
#if 1
#if 0
void ZcanPipetteModule::initialize(ZCanCmder* cancmder, int id, I_PipetteModule* module) {
m_cancmder = cancmder;
m_id = id;

3
components/zcancmder_module/zcan_pipette_module.hpp

@ -3,7 +3,7 @@
#include "sdk/components/zprotocols/zcancmder/api/i_pipette_module.hpp"
#include "sdk\components\zcancmder\zcanreceiver.hpp"
namespace iflytop {
#if 0
class ZcanPipetteModule : public ZCanCmderListener {
ZCanCmder* m_cancmder = nullptr;
int m_id = 0;
@ -16,4 +16,5 @@ class ZcanPipetteModule : public ZCanCmderListener {
void initialize(ZCanCmder* cancmder, int id, I_PipetteModule* module);
virtual void onRceivePacket(CanPacketRxBuffer* rxcmd);
};
#endif
} // namespace iflytop
Loading…
Cancel
Save