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.

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