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.

111 lines
4.2 KiB

2 years ago
1 year 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 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year 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 year ago
2 years ago
2 years ago
2 years ago
  1. #pragma once
  2. #include <stdint.h>
  3. #include <functional>
  4. #include "apibasic/basic.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 ENABLE_MODULE(name, type, version) \
  21. const char *module_name = #name; \
  22. int32_t module_version = version; \
  23. int32_t module_type = type;
  24. #define MODULE_COMMON_PROCESS_REG_CB() \
  25. PROCESS_REG(kreg_module_version, /* */ REG_GET(module_version), ACTION_NONE); \
  26. PROCESS_REG(kreg_module_type, /* */ REG_GET(module_type), ACTION_NONE); \
  27. PROCESS_REG(kreg_module_status, /* */ module_get_status(&val), ACTION_NONE); \
  28. PROCESS_REG(kreg_module_errorcode, /* */ REG_GET(creg.module_errorcode), ACTION_NONE);
  29. typedef struct {
  30. int32_t module_errorcode;
  31. int32_t module_errorbitflag0;
  32. int32_t module_enable;
  33. } module_common_reg_t;
  34. class ZIModule {
  35. int32_t m_inited_flag = 0;
  36. protected:
  37. module_common_reg_t creg;
  38. public:
  39. virtual ~ZIModule() {}
  40. virtual int32_t getid(int32_t *id) = 0;
  41. virtual int32_t getid() {
  42. int32_t id = 0;
  43. getid(&id);
  44. return id;
  45. };
  46. virtual int32_t module_ping() { return 0; };
  47. virtual int32_t module_set_reg(int32_t param_id, int32_t param_value) { return module_xxx_reg(param_id, false, param_value); }
  48. virtual int32_t module_get_reg(int32_t param_id, int32_t *param_value) { return module_xxx_reg(param_id, true, *param_value); }
  49. 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) {
  50. if (val < min || val > max) {
  51. return err::kparam_out_of_range;
  52. }
  53. *regval = val;
  54. return 0;
  55. }
  56. virtual int32_t _module_get_reg(int32_t regoff, int32_t regval, int32_t &val) {
  57. val = regval;
  58. return 0;
  59. }
  60. 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) {
  61. if (val < min || val > max) {
  62. return err::kparam_out_of_range;
  63. }
  64. *regval = val * precision;
  65. return 0;
  66. }
  67. virtual int32_t _module_get_reg_float(int32_t regoff, float regval, int32_t &val, float precision) {
  68. val = regval / precision;
  69. return 0;
  70. }
  71. virtual int32_t module_get_error(int32_t *iserror) {
  72. *iserror = creg.module_errorcode;
  73. return 0;
  74. }
  75. virtual int32_t module_clear_error() {
  76. creg.module_errorcode = 0;
  77. creg.module_errorbitflag0 = 0;
  78. return 0;
  79. }
  80. public:
  81. /***********************************************************************************************************************
  82. * ûʵ *
  83. ***********************************************************************************************************************/
  84. virtual int32_t module_get_status(int32_t *status) = 0;
  85. virtual int32_t module_stop() { return err::koperation_not_support; }
  86. virtual int32_t module_break() { return module_stop(); }
  87. // virtual int32_t module_start() { return err::koperation_not_support; }
  88. virtual int32_t module_enable(int32_t enable) { return err::koperation_not_support; }
  89. virtual int32_t module_xxx_reg(int32_t param_id, bool read, int32_t &val) { return err::koperation_not_support; }
  90. virtual int32_t module_read_raw(int32_t index, uint8_t *data, int32_t *len) { return err::koperation_not_support; }
  91. public:
  92. };
  93. } // namespace iflytop