luat_lib_pin.c 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. @module pin
  3. @summary 管脚命名映射
  4. @version 1.0
  5. @date 2021.12.05
  6. @tag LUAT_USE_PIN
  7. @usage
  8. -- 这个库是为了解决文本形式的PIN脚命名与GPIO编号的映射问题
  9. -- 功能实现上, pin.PA01 就对应数值 1, 代表GPIO 1, 丝印上对应 PA01
  10. -- PA12, GPIO12, 设置为输出, 而且低电平.
  11. gpio.setup(12, 0)
  12. gpio.setup(pin.PA12, 0) -- 推荐使用
  13. gpio.setup(pin.get("PA12"), 0) -- 不推荐, 太长^_^
  14. -- 只有部分BSP有这个库, ESP系列就没这个库
  15. -- 这个库在 Air101/Air103/Air105 上有意义, 但不是必须用这个库, 直接写GPIO号是一样的效果
  16. -- 在 ESP32系列, EC618系列(Air780E等), GPIO号都是直接给出的, 没有"Pxxx"形式, 所以这个库不存在
  17. */
  18. #include "luat_base.h"
  19. #include "luat_pin.h"
  20. #include <stdlib.h>
  21. #define LUAT_LOG_TAG "pin"
  22. #include "luat_log.h"
  23. /**
  24. 获取管脚对应的GPIO号, 可简写为 pin.PA01 , 推荐使用简写
  25. @api pin.get(name)
  26. @name 管脚的名称, 例如PA01, PB12
  27. @return int 对应的GPIO号,如果不存在则返回-1,并打印警告信息
  28. @usage
  29. -- 以下三个语句完全等价, 若提示pin这个库不存在,要么固件版本低,请升级底层固件, 要么就是不需要这个库
  30. -- PA12, GPIO12, 设置为输出, 而且低电平.
  31. gpio.setup(12, 0)
  32. gpio.setup(pin.PA12, 0) -- 推荐使用
  33. gpio.setup(pin.get("PA12"), 0) -- 不推荐, 太长^_^
  34. */
  35. static int luat_pin_index(lua_State *L){
  36. size_t len;
  37. int pin = 0;
  38. const char* pin_name = luaL_checklstring(L, 1, &len);
  39. if (len < 3) {
  40. LLOGW("invaild pin id %s", pin_name);
  41. return 0;
  42. }
  43. pin = luat_pin_to_gpio(pin_name);
  44. if (pin >= 0) {
  45. lua_pushinteger(L, pin);
  46. return 1;
  47. }
  48. else {
  49. LLOGW("invaild pin id %s", pin_name);
  50. return 0;
  51. }
  52. }
  53. int luat_pin_parse(const char* pin_name, size_t* zone, size_t* index) {
  54. if (pin_name[0] != 'P' && pin_name[0] != 'p') {
  55. return -1;
  56. }
  57. // pa~pz
  58. if (pin_name[1] >= 'a' && pin_name[0] <= 'z') {
  59. *zone = pin_name[1] - 'a';
  60. }
  61. // PA~PZ
  62. else if (pin_name[1] >= 'A' && pin_name[0] <= 'Z') {
  63. *zone = pin_name[1] - 'A';
  64. }
  65. else {
  66. return -1;
  67. }
  68. // PA01 ~ PA99
  69. int re = atoi(&pin_name[2]);
  70. if (re < 0) {
  71. return -1;
  72. }
  73. *index = re;
  74. return 0;
  75. }
  76. #include "rotable2.h"
  77. static const rotable_Reg_t reg_pin[] =
  78. {
  79. {"__index", ROREG_FUNC(luat_pin_index)},
  80. {"get", ROREG_FUNC(luat_pin_index)},
  81. { NULL, ROREG_INT(0) }
  82. };
  83. LUAMOD_API int luaopen_pin( lua_State *L ) {
  84. luat_newlib2(L, reg_pin);
  85. return 1;
  86. }