zcancmder_v2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

194 lines
13 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "protocol_parser.hpp"
  2. #include <stdio.h>
  3. using namespace iflytop;
  4. using namespace std;
  5. #define TAG "ZIProtocolParser"
  6. #define PROCESS_PACKET_BEGIN(var_cmdid, var_moduleType) \
  7. int32_t* param __attribute__((__unused__)) = (int32_t*)data; \
  8. int paramNum __attribute__((__unused__)) = (len) / sizeof(int32_t); \
  9. if (cmdid == var_cmdid) { \
  10. auto* mod = dynamic_cast<var_moduleType*>(module); \
  11. if (mod == nullptr) { \
  12. m_cancmder->sendErrorAck(rxcmd, err::koperation_not_support); \
  13. return; \
  14. }
  15. #define CHECK_PARAM_NUM(num) \
  16. if (paramNum != num) { \
  17. m_cancmder->sendErrorAck(rxcmd, err::kcmd_param_num_error); \
  18. return; \
  19. }
  20. #define PROCESS_PACKET_XX_END(ackNum) \
  21. if (ecode == 0) { \
  22. m_cancmder->sendAck(rxcmd, ack, ackNum); \
  23. return; \
  24. } \
  25. m_cancmder->sendErrorAck(rxcmd, ecode); \
  26. return; \
  27. }
  28. #define PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, XP, XACK, ...) \
  29. { \
  30. PROCESS_PACKET_BEGIN(var_cmdid, var_moduleType) \
  31. CHECK_PARAM_NUM(XP) \
  32. int32_t ack[XACK + 1] = {0}; \
  33. int32_t ecode = mod->var_funcname(__VA_ARGS__); \
  34. PROCESS_PACKET_XX_END(XACK) \
  35. }
  36. #define PROCESS_PACKET_00(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 0, 0)
  37. #define PROCESS_PACKET_01(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 0, 1, &ack[1])
  38. #define PROCESS_PACKET_02(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 0, 2, &ack[1], &ack[2])
  39. #define PROCESS_PACKET_03(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 0, 3, &ack[1], &ack[2], &ack[3])
  40. #define PROCESS_PACKET_10(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 1, 0, param[0])
  41. #define PROCESS_PACKET_11(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 1, 1, param[0], &ack[1])
  42. #define PROCESS_PACKET_12(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 1, 2, param[0], &ack[1], &ack[2])
  43. #define PROCESS_PACKET_13(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 1, 3, param[0], &ack[1], &ack[2], &ack[3])
  44. #define PROCESS_PACKET_20(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 2, 0, param[0], param[1])
  45. #define PROCESS_PACKET_21(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 2, 1, param[0], param[1], &ack[1])
  46. #define PROCESS_PACKET_22(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 2, 2, param[0], param[1], &ack[1], &ack[2])
  47. #define PROCESS_PACKET_23(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 2, 3, param[0], param[1], &ack[1], &ack[2], &ack[3])
  48. #define PROCESS_PACKET_30(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 3, 0, param[0], param[1], param[2])
  49. #define PROCESS_PACKET_31(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 3, 1, param[0], param[1], param[2], &ack[1])
  50. #define PROCESS_PACKET_32(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 3, 2, param[0], param[1], param[2], &ack[1], &ack[2])
  51. #define PROCESS_PACKET_33(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 3, 3, param[0], param[1], param[2], &ack[1], &ack[2], &ack[3])
  52. #define PROCESS_PACKET_40(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 4, 0, param[0], param[1], param[2], param[3])
  53. #define PROCESS_PACKET_41(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 4, 1, param[0], param[1], param[2], param[3], &ack[1])
  54. #define PROCESS_PACKET_42(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 4, 2, param[0], param[1], param[2], param[3], &ack[1], &ack[2])
  55. #define PROCESS_PACKET_43(var_cmdid, var_moduleType, var_funcname) PROCESS_PACKET_XX(var_cmdid, var_moduleType, var_funcname, 4, 3, param[0], param[1], param[2], param[3], &ack[1], &ack[2], &ack[3])
  56. void ZIProtocolParser::initialize(IZCanCmder* cancmder) {
  57. m_cancmder = cancmder;
  58. m_cancmder->registerListener(this);
  59. }
  60. void ZIProtocolParser::_registerModule(uint16_t id, ZIModule* module) { m_modulers[id] = module; }
  61. void ZIProtocolParser::registerModule(ZIModule* module) {
  62. int32_t moduleid = 0;
  63. module->getid(&moduleid);
  64. uint16_t id = moduleid;
  65. _registerModule(id, module);
  66. }
  67. void ZIProtocolParser::onRceivePacket(zcr_cmd_header_t* rxcmd, uint8_t* data, int32_t len) {
  68. // printf("onRceivePacket cmdid:%d submoduleid:%d subcmdid:%d\n", rxcmd->cmdmoduleid, rxcmd->submoduleid, rxcmd->subcmdid);
  69. uint16_t submoduleid = rxcmd->submoduleid;
  70. auto it = m_modulers.find(submoduleid);
  71. if (it == m_modulers.end()) {
  72. return;
  73. }
  74. ZIModule* module = it->second;
  75. int32_t cmdid = CMDID(rxcmd->cmdmoduleid, rxcmd->subcmdid);
  76. /*******************************************************************************
  77. * module *
  78. *******************************************************************************/
  79. #if 0
  80. virtual ~ZIModule() {}
  81. virtual int32_t getid(int32_t *id) = 0;
  82. virtual int32_t module_stop() = 0;
  83. virtual int32_t module_break() = 0;
  84. virtual int32_t module_get_last_exec_status(int32_t *status) = 0;
  85. virtual int32_t module_get_status(int32_t *status) = 0;
  86. virtual int32_t module_get_error(int32_t *iserror) = 0;
  87. virtual int32_t module_clear_error() = 0;
  88. virtual int32_t module_set_param(int32_t param_id, int32_t param_value) { return err::koperation_not_support; }
  89. virtual int32_t module_get_param(int32_t param_id, int32_t *param_value) { return err::koperation_not_support; }
  90. virtual int32_t module_readio(int32_t *io) { return err::koperation_not_support; }
  91. virtual int32_t module_writeio(int32_t io) { return err::koperation_not_support; }
  92. virtual int32_t module_read_adc(int32_t adcindex, int32_t *adc) { return err::koperation_not_support; }
  93. virtual int32_t module_set_inited_flag(int32_t flag) {
  94. m_inited_flag = flag;
  95. return 0;
  96. }
  97. virtual int32_t module_get_inited_flag(int32_t *flag) {
  98. *flag = m_inited_flag;
  99. return 0;
  100. }
  101. // kmodule_factory_reset = CMDID(1, 14), // para:{}, ack:{}
  102. // kmodule_flush_cfg = CMDID(1, 15), // para:{}, ack:{}
  103. // kmodule_active_cfg = CMDID(1, 16), // para:{}, ack:{}
  104. virtual int32_t module_factory_reset() { return err::koperation_not_support; }
  105. virtual int32_t module_flush_cfg() { return err::koperation_not_support; }
  106. virtual int32_t module_active_cfg() { return err::koperation_not_support; }
  107. virtual int32_t module_set_state(int32_t state_id, int32_t state_value) { return err::koperation_not_support; }
  108. virtual int32_t module_get_state(int32_t state_id, int32_t *state_value) { return err::koperation_not_support; }
  109. #endif
  110. PROCESS_PACKET_00(kmodule_stop, ZIModule, module_stop);
  111. PROCESS_PACKET_00(kmodule_break, ZIModule, module_break);
  112. PROCESS_PACKET_01(kmodule_get_last_exec_status, ZIModule, module_get_last_exec_status);
  113. PROCESS_PACKET_01(kmodule_get_status, ZIModule, module_get_status);
  114. PROCESS_PACKET_20(kmodule_set_param, ZIModule, module_set_param);
  115. PROCESS_PACKET_11(kmodule_get_param, ZIModule, module_get_param);
  116. PROCESS_PACKET_01(kmodule_readio, ZIModule, module_readio);
  117. PROCESS_PACKET_10(kmodule_writeio, ZIModule, module_writeio);
  118. PROCESS_PACKET_11(kmodule_read_adc, ZIModule, module_read_adc);
  119. PROCESS_PACKET_01(kmodule_get_error, ZIModule, module_get_error);
  120. PROCESS_PACKET_00(kmodule_clear_error, ZIModule, module_clear_error);
  121. PROCESS_PACKET_10(kmodule_set_inited_flag, ZIModule, module_set_inited_flag);
  122. PROCESS_PACKET_01(kmodule_get_inited_flag, ZIModule, module_get_inited_flag);
  123. PROCESS_PACKET_00(kmodule_factory_reset, ZIModule, module_factory_reset);
  124. PROCESS_PACKET_00(kmodule_flush_cfg, ZIModule, module_flush_cfg);
  125. PROCESS_PACKET_00(kmodule_active_cfg, ZIModule, module_active_cfg);
  126. PROCESS_PACKET_20(kmodule_set_state, ZIModule, module_set_state);
  127. PROCESS_PACKET_11(kmodule_get_state, ZIModule, module_get_state);
  128. /*******************************************************************************
  129. * motor *
  130. *******************************************************************************/
  131. #if 0
  132. virtual int32_t motor_move_to_zero_forward_and_calculated_shift(int32_t findzerospeed, int32_t findzeroedge_speed, int32_t acc, int32_t overtime) { return err::koperation_not_support; }
  133. virtual int32_t motor_move_to_zero_backward_and_calculated_shift(int32_t findzerospeed, int32_t findzeroedge_speed, int32_t acc, int32_t overtime) { return err::koperation_not_support; }
  134. #endif
  135. PROCESS_PACKET_10(kmotor_enable, ZIMotor, motor_enable);
  136. PROCESS_PACKET_30(kmotor_rotate, ZIMotor, motor_rotate);
  137. PROCESS_PACKET_30(kmotor_move_by, ZIMotor, motor_move_by);
  138. PROCESS_PACKET_30(kmotor_move_to, ZIMotor, motor_move_to);
  139. PROCESS_PACKET_20(kmotor_move_to_with_torque, ZIMotor, motor_move_to_with_torque);
  140. PROCESS_PACKET_30(kmotor_rotate_acctime, ZIMotor, motor_rotate_acctime);
  141. PROCESS_PACKET_30(kmotor_move_by_acctime, ZIMotor, motor_move_by_acctime);
  142. PROCESS_PACKET_30(kmotor_move_to_acctime, ZIMotor, motor_move_to_acctime);
  143. PROCESS_PACKET_40(kmotor_move_to_zero_forward, ZIMotor, motor_move_to_zero_forward);
  144. PROCESS_PACKET_40(kmotor_move_to_zero_backward, ZIMotor, motor_move_to_zero_backward);
  145. PROCESS_PACKET_01(kmotor_read_pos, ZIMotor, motor_read_pos);
  146. PROCESS_PACKET_10(kmotor_set_current_pos_by_change_shift, ZIMotor, motor_set_current_pos_by_change_shift);
  147. PROCESS_PACKET_40(kmotor_motor_move_to_zero_forward_and_calculated_shift, ZIMotor, motor_move_to_zero_forward_and_calculated_shift);
  148. PROCESS_PACKET_40(kmotor_motor_move_to_zero_backward_and_calculated_shift, ZIMotor, motor_move_to_zero_backward_and_calculated_shift);
  149. /*******************************************************************************
  150. * xymotor *
  151. *******************************************************************************/
  152. #if 0
  153. virtual int32_t xymotor_enable(int32_t enable) { return err::koperation_not_support; }
  154. virtual int32_t xymotor_move_by(int32_t dx, int32_t dy, int32_t motor_velocity) { return err::koperation_not_support; }
  155. virtual int32_t xymotor_move_to(int32_t x, int32_t y, int32_t motor_velocity) { return err::koperation_not_support; }
  156. virtual int32_t xymotor_move_to_zero() { return err::koperation_not_support; }
  157. virtual int32_t xymotor_move_to_zero_and_calculated_shift() { return err::koperation_not_support; }
  158. virtual int32_t xymotor_read_pos(int32_t *x, int32_t *y) { return err::koperation_not_support; }
  159. #endif
  160. PROCESS_PACKET_10(kxymotor_enable, ZIXYMotor, xymotor_enable);
  161. PROCESS_PACKET_30(kxymotor_move_by, ZIXYMotor, xymotor_move_by);
  162. PROCESS_PACKET_30(kxymotor_move_to, ZIXYMotor, xymotor_move_to);
  163. PROCESS_PACKET_00(kxymotor_move_to_zero, ZIXYMotor, xymotor_move_to_zero);
  164. PROCESS_PACKET_00(kxymotor_move_to_zero_and_calculated_shift, ZIXYMotor, xymotor_move_to_zero_and_calculated_shift);
  165. PROCESS_PACKET_02(kxymotor_read_pos, ZIXYMotor, xymotor_read_pos);
  166. }