luat_gpio_win32.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "luat_base.h"
  2. #include "luat_gpio.h"
  3. #include "luat_msgbus.h"
  4. // 模拟GPIO在win32下的实现
  5. #define LUAT_WIN32_GPIO_COUNT (32)
  6. typedef struct gpio_state {
  7. luat_gpio_t gpio;
  8. uint8_t open;
  9. uint8_t state;
  10. }gpio_state_t;
  11. gpio_state_t win32gpios[LUAT_WIN32_GPIO_COUNT] = {0};
  12. int luat_gpio_setup(luat_gpio_t* gpio) {
  13. if (gpio->pin < 0 || gpio->pin >= LUAT_WIN32_GPIO_COUNT) {
  14. return -1;
  15. }
  16. memcpy(&win32gpios[gpio->pin], gpio, sizeof(luat_gpio_t));
  17. win32gpios[gpio->pin].open = 1;
  18. if (gpio->mode == Luat_GPIO_OUTPUT) {
  19. win32gpios[gpio->pin].state = gpio->irq;
  20. }
  21. else {
  22. win32gpios[gpio->pin].state = 0;
  23. }
  24. return 0;
  25. }
  26. int luat_gpio_set(int pin, int level) {
  27. if (pin < 0 || pin >= LUAT_WIN32_GPIO_COUNT) {
  28. return -1;
  29. }
  30. if (win32gpios[pin].open == 0) {
  31. return -1;
  32. }
  33. if (win32gpios[pin].state != level) {
  34. win32gpios[pin].state = level;
  35. rtos_msg_t msg = {0};
  36. msg.ptr = NULL;
  37. msg.arg1 = pin;
  38. msg.arg2 = level;
  39. msg.handler = l_gpio_handler;
  40. luat_msgbus_put(&msg, 0);
  41. };
  42. return 0;
  43. }
  44. int luat_gpio_get(int pin) {
  45. if (pin < 0 || pin >= LUAT_WIN32_GPIO_COUNT) {
  46. return 0;
  47. }
  48. if (win32gpios[pin].open == 0) {
  49. return 0;
  50. }
  51. return win32gpios[pin].state;
  52. }
  53. void luat_gpio_close(int pin) {
  54. if (pin < 0 || pin >= LUAT_WIN32_GPIO_COUNT) {
  55. return;
  56. }
  57. win32gpios[pin].open = 0;
  58. }