luat_lib_yhm27xx.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. @module yhm27xx
  3. @summary yhm27xx充电芯片
  4. @version 1.0
  5. @date 2025.04.2
  6. @tag LUAT_USE_GPIO
  7. @demo yhm27xxx
  8. @usage
  9. -- 请查阅demo/yhm27xx
  10. */
  11. #include "luat_base.h"
  12. #include "luat_timer.h"
  13. #include "luat_mem.h"
  14. #include "luat_gpio.h"
  15. #include "luat_zbuff.h"
  16. #include "luat_msgbus.h"
  17. #define LUAT_LOG_TAG "yhm27xx"
  18. #include "luat_log.h"
  19. /*
  20. 单总线命令读写YHM27XX
  21. @api yhm27xx.cmd(pin, chip_id, reg, data)
  22. @int gpio端口号
  23. @int 芯片ID
  24. @int 寄存器地址
  25. @int 要写入的数据,如果没填,则表示从寄存器读取数据
  26. @return boolean 成功返回true,失败返回false
  27. @return int 读取成功返回寄存器值,写入成功无返回
  28. @usage
  29. while 1 do
  30. sys.wait(1000)
  31. local result, data = yhm27xx.cmd(15, 0x04, 0x05)
  32. log.info("yhm27xx", result, data)
  33. end
  34. */
  35. static int l_yhm27xx_cmd(lua_State *L)
  36. {
  37. uint8_t pin = luaL_checkinteger(L, 1);
  38. uint8_t chip_id = luaL_checkinteger(L, 2);
  39. uint8_t reg = luaL_checkinteger(L, 3);
  40. uint8_t data = 0;
  41. uint8_t is_read = 1;
  42. int ret = 0;
  43. if (!lua_isnone(L, 4))
  44. {
  45. is_read = 0;
  46. data = luaL_checkinteger(L, 4);
  47. }
  48. #ifdef LUAT_USE_DRV_GPIO
  49. if (pin >= 128) {
  50. ret = luat_drv_gpio_driver_yhm27xx(pin, chip_id, reg, is_read, &data);
  51. }
  52. else
  53. #else
  54. ret = luat_gpio_driver_yhm27xx(pin, chip_id, reg, is_read, &data);
  55. #endif
  56. if (ret != 0)
  57. {
  58. lua_pushboolean(L, 0);
  59. return 1;
  60. }
  61. lua_pushboolean(L, 1);
  62. if (is_read)
  63. {
  64. lua_pushinteger(L, data);
  65. return 2;
  66. }
  67. return 1;
  68. }
  69. static uint8_t reg_infos[9] = {0};
  70. static int l_yhm_27xx_cb(lua_State *L, void *ptr) {
  71. lua_getglobal(L, "sys_pub");
  72. if (lua_isfunction(L, -1)) {
  73. lua_pushstring(L, "YHM27XX_REG");
  74. lua_pushlstring(L, (const char*)reg_infos, 9);
  75. lua_call(L, 2, 0);
  76. }
  77. return 0;
  78. }
  79. static void luat_gpio_driver_yhm27xx_reqinfo(uint8_t pin, uint8_t chip_id) {
  80. for (uint8_t i = 0; i < 9; i++)
  81. {
  82. luat_gpio_driver_yhm27xx(pin, chip_id, i, 1, &(reg_infos[i]));
  83. }
  84. rtos_msg_t msg = {0};
  85. msg.handler = l_yhm_27xx_cb;
  86. luat_msgbus_put(&msg, 0);
  87. }
  88. /*
  89. 获取最新的寄存器信息(异步)
  90. @api yhm27xx.reqinfo(pin, chip_id)
  91. @int gpio端口号
  92. @int 芯片ID
  93. @return nil 无返回值
  94. @usage
  95. sys.subscribe("YHM27XX_REG", function(data)
  96. -- 注意, 会一次性读出0-9,总共8个寄存器值
  97. log.info("yhm27xx", data and data:toHex())
  98. end)
  99. yhm27xx.reqinfo(24, 0x04)
  100. */
  101. static int l_yhm27xx_reqinfo(lua_State *L)
  102. {
  103. uint8_t pin = luaL_checkinteger(L, 1);
  104. uint8_t chip_id = luaL_checkinteger(L, 2);
  105. #ifdef LUAT_USE_DRV_GPIO
  106. if (pin >= 128) {
  107. luat_drv_gpio_driver_yhm27xx_reqinfo(pin, chip_id);
  108. return 0;
  109. }
  110. #endif
  111. luat_gpio_driver_yhm27xx_reqinfo(pin, chip_id);
  112. return 0;
  113. }
  114. #include "rotable2.h"
  115. static const rotable_Reg_t reg_yhm27xx[] = {
  116. {"cmd", ROREG_FUNC(l_yhm27xx_cmd)},
  117. {"reqinfo", ROREG_FUNC(l_yhm27xx_reqinfo)},
  118. {NULL, ROREG_INT(0)}
  119. };
  120. LUAMOD_API int luaopen_yhm27xx(lua_State *L)
  121. {
  122. luat_newlib2(L, reg_yhm27xx);
  123. return 1;
  124. }