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.

129 lines
5.2 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
  1. #pragma once
  2. #include <stdint.h>
  3. #include <functional>
  4. #include "errorcode.hpp"
  5. namespace iflytop {
  6. using namespace std;
  7. #define REG_SET(reg, ...) _module_set_reg(param_id, &reg, val, ##__VA_ARGS__)
  8. #define REG_GET(reg) _module_get_reg(param_id, reg, val)
  9. #define REG_SET_FLOAT(reg, precision, ...) _module_set_reg_float(param_id, &reg, val, precision, ##__VA_ARGS__)
  10. #define REG_GET_FLOAT(reg, precision) _module_get_reg_float(param_id, reg, val, precision)
  11. #define ACTION_NONE 0
  12. #define PROCESS_REG(param_id, readaction, writeacton) \
  13. case param_id: { \
  14. if (read) { \
  15. return readaction; \
  16. } else { \
  17. return writeacton; \
  18. } \
  19. } break;
  20. #define PROCESS_ACTION() \
  21. PROCESS_REG(kreg_module_do_action0, /* */ ACTION_NONE, do_action(val)); \
  22. PROCESS_REG(kreg_module_action_param1, /* */ REG_GET(m_reg.module_action_param1), REG_SET(m_reg.module_action_param1)); \
  23. PROCESS_REG(kreg_module_action_param2, /* */ REG_GET(m_reg.module_action_param2), REG_SET(m_reg.module_action_param2)); \
  24. PROCESS_REG(kreg_module_action_param3, /* */ REG_GET(m_reg.module_action_param3), REG_SET(m_reg.module_action_param3)); \
  25. PROCESS_REG(kreg_module_action_ack1, /* */ REG_GET(m_reg.module_action_ack1), ACTION_NONE); \
  26. PROCESS_REG(kreg_module_action_ack2, /* */ REG_GET(m_reg.module_action_ack2), ACTION_NONE);
  27. class ModuleCMDExecStatus {
  28. public:
  29. int32_t exec_status = 0;
  30. int32_t exec_val[6] = {0};
  31. 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) {
  32. exec_status = status;
  33. exec_val[0] = val0;
  34. exec_val[1] = val1;
  35. exec_val[2] = val2;
  36. exec_val[3] = val3;
  37. exec_val[4] = val4;
  38. exec_val[5] = val5;
  39. }
  40. };
  41. class ZIModule {
  42. int32_t m_inited_flag = 0;
  43. public:
  44. virtual ~ZIModule() {}
  45. virtual int32_t getid(int32_t *id) = 0;
  46. virtual int32_t getid() {
  47. int32_t id = 0;
  48. getid(&id);
  49. return id;
  50. };
  51. virtual int32_t module_ping() = 0;
  52. virtual int32_t module_stop() { return err::koperation_not_support; }
  53. virtual int32_t module_break() { return err::koperation_not_support; }
  54. virtual int32_t module_start() { return err::koperation_not_support; }
  55. virtual int32_t module_get_last_exec_status(int32_t *status) { return err::koperation_not_support; }
  56. virtual int32_t module_get_status(int32_t *status) { return err::koperation_not_support; }
  57. virtual int32_t module_get_error(int32_t *iserror) { return err::koperation_not_support; }
  58. virtual int32_t module_clear_error() { return err::koperation_not_support; }
  59. virtual int32_t module_enable(int32_t enable) { return err::koperation_not_support; }
  60. virtual int32_t module_set_reg(int32_t param_id, int32_t param_value) { return err::koperation_not_support; }
  61. virtual int32_t module_get_reg(int32_t param_id, int32_t *param_value) { return err::koperation_not_support; }
  62. virtual int32_t module_readio(int32_t *io) { return err::koperation_not_support; }
  63. virtual int32_t module_writeio(int32_t idindex, int32_t io) { return err::koperation_not_support; }
  64. virtual int32_t module_read_adc(int32_t adcindex, int32_t *adc) { return err::koperation_not_support; }
  65. virtual int32_t module_read_raw(int32_t index, uint8_t *data, int32_t *len) { return err::koperation_not_support; }
  66. virtual int32_t module_set_inited_flag(int32_t flag) {
  67. m_inited_flag = flag;
  68. return 0;
  69. }
  70. virtual int32_t module_get_inited_flag(int32_t *flag) {
  71. *flag = m_inited_flag;
  72. return 0;
  73. }
  74. virtual int32_t module_get_inited_flag() { return m_inited_flag; }
  75. // kmodule_factory_reset = CMDID(1, 14), // para:{}, ack:{}
  76. // kmodule_flush_cfg = CMDID(1, 15), // para:{}, ack:{}
  77. // kmodule_active_cfg = CMDID(1, 16), // para:{}, ack:{}
  78. virtual int32_t module_factory_reset() { return err::koperation_not_support; }
  79. virtual int32_t module_flush_cfg() { return err::koperation_not_support; }
  80. virtual int32_t module_active_cfg() { return err::koperation_not_support; }
  81. 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) {
  82. if (val < min || val > max) {
  83. return err::kparam_out_of_range;
  84. }
  85. *regval = val;
  86. return 0;
  87. }
  88. virtual int32_t _module_get_reg(int32_t regoff, int32_t regval, int32_t &val) {
  89. val = regval;
  90. return 0;
  91. }
  92. 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) {
  93. if (val < min || val > max) {
  94. return err::kparam_out_of_range;
  95. }
  96. *regval = val * precision;
  97. return 0;
  98. }
  99. virtual int32_t _module_get_reg_float(int32_t regoff, float regval, int32_t &val, float precision) {
  100. val = regval / precision;
  101. return 0;
  102. }
  103. };
  104. } // namespace iflytop