luat_gpio_win32.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. int l_gpio_handler(lua_State *L, void* ptr) ;
  7. typedef struct gpio_state {
  8. luat_gpio_t gpio;
  9. uint8_t open;
  10. uint8_t state;
  11. }gpio_state_t;
  12. gpio_state_t win32gpios[LUAT_WIN32_GPIO_COUNT] = {0};
  13. int luat_gpio_setup(luat_gpio_t* gpio) {
  14. if (gpio->pin < 0 || gpio->pin >= LUAT_WIN32_GPIO_COUNT) {
  15. return -1;
  16. }
  17. memcpy(&win32gpios[gpio->pin], gpio, sizeof(luat_gpio_t));
  18. win32gpios[gpio->pin].open = 1;
  19. if (gpio->mode == Luat_GPIO_OUTPUT) {
  20. win32gpios[gpio->pin].state = gpio->irq;
  21. }
  22. else {
  23. win32gpios[gpio->pin].state = 0;
  24. }
  25. return 0;
  26. }
  27. int luat_gpio_set(int pin, int level) {
  28. if (pin < 0 || pin >= LUAT_WIN32_GPIO_COUNT) {
  29. return -1;
  30. }
  31. if (win32gpios[pin].open == 0) {
  32. return -1;
  33. }
  34. if (win32gpios[pin].state != level) {
  35. win32gpios[pin].state = level;
  36. rtos_msg_t msg = {0};
  37. msg.ptr = NULL;
  38. msg.arg1 = pin;
  39. msg.arg2 = level;
  40. msg.handler = l_gpio_handler;
  41. luat_msgbus_put(&msg, 0);
  42. };
  43. return 0;
  44. }
  45. int luat_gpio_get(int pin) {
  46. if (pin < 0 || pin >= LUAT_WIN32_GPIO_COUNT) {
  47. return 0;
  48. }
  49. if (win32gpios[pin].open == 0) {
  50. return 0;
  51. }
  52. return win32gpios[pin].state;
  53. }
  54. void luat_gpio_close(int pin) {
  55. if (pin < 0 || pin >= LUAT_WIN32_GPIO_COUNT) {
  56. return;
  57. }
  58. win32gpios[pin].open = 0;
  59. }
  60. void luat_gpio_pulse(int pin, uint8_t *level, uint16_t len, uint16_t delay_ns) {
  61. }