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.

204 lines
9.4 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
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. #pragma once
  2. #include <stdint.h>
  3. #include <functional>
  4. #include "errorcode.hpp"
  5. #include "module_type_index.hpp"
  6. namespace iflytop {
  7. using namespace std;
  8. #define REG_SET(reg, ...) _module_set_reg(param_id, &reg, val, ##__VA_ARGS__)
  9. #define REG_GET(reg) _module_get_reg(param_id, reg, val)
  10. #define REG_SET_FLOAT(reg, precision, ...) _module_set_reg_float(param_id, &reg, val, precision, ##__VA_ARGS__)
  11. #define REG_GET_FLOAT(reg, precision) _module_get_reg_float(param_id, reg, val, precision)
  12. #define ACTION_NONE 0
  13. #define PROCESS_REG(param_id, readaction, writeacton) \
  14. case param_id: { \
  15. if (read) { \
  16. return readaction; \
  17. } else { \
  18. return writeacton; \
  19. } \
  20. } break;
  21. #define PROCESS_ACTION() \
  22. PROCESS_REG(kreg_module_do_action0, /* */ ACTION_NONE, do_action(val)); \
  23. PROCESS_REG(kreg_module_action_param1, /* */ REG_GET(m_reg.module_action_param1), REG_SET(m_reg.module_action_param1)); \
  24. PROCESS_REG(kreg_module_action_param2, /* */ REG_GET(m_reg.module_action_param2), REG_SET(m_reg.module_action_param2)); \
  25. PROCESS_REG(kreg_module_action_param3, /* */ REG_GET(m_reg.module_action_param3), REG_SET(m_reg.module_action_param3)); \
  26. PROCESS_REG(kreg_module_action_ack1, /* */ REG_GET(m_reg.module_action_ack1), ACTION_NONE); \
  27. PROCESS_REG(kreg_module_action_ack2, /* */ REG_GET(m_reg.module_action_ack2), ACTION_NONE);
  28. #define ENABLE_MODULE(name, type, version) \
  29. const char *module_name = #name; \
  30. int32_t module_version = version; \
  31. int32_t module_type = type;
  32. #define MODULE_COMMON_PROCESS_REG_CB() \
  33. PROCESS_REG(kreg_module_version, /* */ REG_GET(module_version), ACTION_NONE); \
  34. PROCESS_REG(kreg_module_type, /* */ REG_GET(module_type), ACTION_NONE); \
  35. PROCESS_REG(kreg_module_status, /* */ module_get_status(&val), ACTION_NONE); \
  36. PROCESS_REG(kreg_module_errorcode, /* */ REG_GET(m_com_reg.module_errorcode), ACTION_NONE); \
  37. PROCESS_REG(kreg_module_initflag, /* */ module_get_inited_flag(&val), module_set_inited_flag(val)); \
  38. PROCESS_REG(kreg_module_errorbitflag0, /* */ REG_GET(m_com_reg.module_errorbitflag0), ACTION_NONE); \
  39. PROCESS_REG(kreg_module_enableflag, /* */ REG_GET(m_com_reg.module_enable), ACTION_NONE); \
  40. PROCESS_REG(kreg_module_do_action0, /* */ ACTION_NONE, do_action(val)); \
  41. PROCESS_REG(kreg_module_action_param1, /* */ REG_GET(m_com_reg.module_action_param1), REG_SET(m_com_reg.module_action_param1)); \
  42. PROCESS_REG(kreg_module_action_param2, /* */ REG_GET(m_com_reg.module_action_param2), REG_SET(m_com_reg.module_action_param2)); \
  43. PROCESS_REG(kreg_module_action_param3, /* */ REG_GET(m_com_reg.module_action_param3), REG_SET(m_com_reg.module_action_param3)); \
  44. PROCESS_REG(kreg_module_action_ack1, /* */ REG_GET(m_com_reg.module_action_ack1), ACTION_NONE); \
  45. PROCESS_REG(kreg_module_action_ack2, /* */ REG_GET(m_com_reg.module_action_ack2), ACTION_NONE); \
  46. PROCESS_REG(kreg_module_last_cmd_exec_status, /* */ REG_GET(m_com_reg.module_last_cmd_exec_status), ACTION_NONE); \
  47. PROCESS_REG(kreg_module_last_cmd_exec_val0, /* */ REG_GET(m_com_reg.module_last_cmd_exec_val0), ACTION_NONE); \
  48. PROCESS_REG(kreg_module_last_cmd_exec_val1, /* */ REG_GET(m_com_reg.module_last_cmd_exec_val1), ACTION_NONE); \
  49. PROCESS_REG(kreg_module_last_cmd_exec_val2, /* */ REG_GET(m_com_reg.module_last_cmd_exec_val2), ACTION_NONE); \
  50. PROCESS_REG(kreg_module_last_cmd_exec_val3, /* */ REG_GET(m_com_reg.module_last_cmd_exec_val3), ACTION_NONE); \
  51. PROCESS_REG(kreg_module_last_cmd_exec_val4, /* */ REG_GET(m_com_reg.module_last_cmd_exec_val4), ACTION_NONE);
  52. typedef struct {
  53. // int32_t module_version;
  54. // int32_t module_type;
  55. int32_t module_errorcode;
  56. int32_t module_errorbitflag0;
  57. int32_t module_enable;
  58. int32_t module_last_cmd_exec_status;
  59. int32_t module_last_cmd_exec_val0;
  60. int32_t module_last_cmd_exec_val1;
  61. int32_t module_last_cmd_exec_val2;
  62. int32_t module_last_cmd_exec_val3;
  63. int32_t module_last_cmd_exec_val4;
  64. int32_t module_do_action0;
  65. int32_t module_action_param1;
  66. int32_t module_action_param2;
  67. int32_t module_action_param3;
  68. int32_t module_action_ack1;
  69. int32_t module_action_ack2;
  70. } module_common_reg_t;
  71. class ModuleCMDExecStatus {
  72. public:
  73. int32_t exec_status = 0;
  74. int32_t exec_val[6] = {0};
  75. void set_exec_status(int32_t status, int32_t val0 = 0, int32_t val1 = 0, int32_t val2 = 0, int32_t val3 = 0, int32_t val4 = 0, int32_t val5 = 0) {
  76. exec_status = status;
  77. exec_val[0] = val0;
  78. exec_val[1] = val1;
  79. exec_val[2] = val2;
  80. exec_val[3] = val3;
  81. exec_val[4] = val4;
  82. exec_val[5] = val5;
  83. }
  84. };
  85. class ZIModule {
  86. int32_t m_inited_flag = 0;
  87. protected:
  88. module_common_reg_t m_com_reg;
  89. public:
  90. virtual ~ZIModule() {}
  91. virtual int32_t getid(int32_t *id) = 0;
  92. virtual int32_t getid() {
  93. int32_t id = 0;
  94. getid(&id);
  95. return id;
  96. };
  97. virtual int32_t module_ping() { return 0; };
  98. virtual int32_t module_stop() { return err::koperation_not_support; }
  99. virtual int32_t module_break() { return module_stop(); }
  100. virtual int32_t module_start() { return err::koperation_not_support; }
  101. virtual int32_t module_get_last_exec_status(int32_t *status) { return err::koperation_not_support; }
  102. virtual int32_t module_get_status(int32_t *status) = 0;
  103. virtual int32_t module_get_error(int32_t *iserror) {
  104. *iserror = m_com_reg.module_errorcode;
  105. return 0;
  106. }
  107. virtual int32_t module_clear_error() {
  108. m_com_reg.module_errorcode = 0;
  109. m_com_reg.module_errorbitflag0 = 0;
  110. return 0;
  111. }
  112. virtual int32_t module_enable(int32_t enable) { return err::koperation_not_support; }
  113. virtual int32_t module_xxx_reg(int32_t param_id, bool read, int32_t &val) { return err::koperation_not_support; }
  114. virtual int32_t module_set_reg(int32_t param_id, int32_t param_value) { return module_xxx_reg(param_id, false, param_value); }
  115. virtual int32_t module_get_reg(int32_t param_id, int32_t *param_value) { return module_xxx_reg(param_id, true, *param_value); }
  116. virtual int32_t module_readio(int32_t *io) { return err::koperation_not_support; }
  117. virtual int32_t module_writeio(int32_t idindex, int32_t io) { return err::koperation_not_support; }
  118. virtual int32_t module_read_adc(int32_t adcindex, int32_t *adc) { return err::koperation_not_support; }
  119. virtual int32_t module_read_raw(int32_t index, uint8_t *data, int32_t *len) { return err::koperation_not_support; }
  120. virtual int32_t module_set_inited_flag(int32_t flag) {
  121. m_inited_flag = flag;
  122. return 0;
  123. }
  124. virtual int32_t module_get_inited_flag(int32_t *flag) {
  125. *flag = m_inited_flag;
  126. return 0;
  127. }
  128. virtual int32_t module_get_inited_flag() { return m_inited_flag; }
  129. // kmodule_factory_reset = CMDID(1, 14), // para:{}, ack:{}
  130. // kmodule_flush_cfg = CMDID(1, 15), // para:{}, ack:{}
  131. // kmodule_active_cfg = CMDID(1, 16), // para:{}, ack:{}
  132. virtual int32_t module_factory_reset() { return err::koperation_not_support; }
  133. virtual int32_t module_flush_cfg() { return err::ksucc; }
  134. virtual int32_t module_active_cfg() { return err::ksucc; }
  135. virtual int32_t _module_set_reg(int32_t regoff, int32_t *regval, int32_t val, int32_t min = INT32_MIN, int32_t max = INT32_MAX) {
  136. if (val < min || val > max) {
  137. return err::kparam_out_of_range;
  138. }
  139. *regval = val;
  140. return 0;
  141. }
  142. virtual int32_t _module_get_reg(int32_t regoff, int32_t regval, int32_t &val) {
  143. val = regval;
  144. return 0;
  145. }
  146. virtual int32_t _module_set_reg_float(int32_t regoff, float *regval, int32_t val, float precision, int32_t min = INT32_MIN, int32_t max = INT32_MAX) {
  147. if (val < min || val > max) {
  148. return err::kparam_out_of_range;
  149. }
  150. *regval = val * precision;
  151. return 0;
  152. }
  153. virtual int32_t _module_get_reg_float(int32_t regoff, float regval, int32_t &val, float precision) {
  154. val = regval / precision;
  155. return 0;
  156. }
  157. virtual int32_t _module_set_exec_status(int32_t status, int32_t val0 = 0, int32_t val1 = 0, int32_t val2 = 0, int32_t val3 = 0, int32_t val4 = 0) {
  158. m_com_reg.module_last_cmd_exec_status = status;
  159. m_com_reg.module_last_cmd_exec_val0 = val0;
  160. m_com_reg.module_last_cmd_exec_val1 = val1;
  161. m_com_reg.module_last_cmd_exec_val2 = val2;
  162. m_com_reg.module_last_cmd_exec_val3 = val3;
  163. m_com_reg.module_last_cmd_exec_val4 = val4;
  164. return 0;
  165. }
  166. public:
  167. virtual int32_t do_action(int32_t actioncode) { return err::kmodule_not_support_action; };
  168. };
  169. } // namespace iflytop