luat_irq.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include "luat_base.h"
  2. #include "luat_irq.h"
  3. #include "luat_msgbus.h"
  4. #include "luat_gpio.h"
  5. #include "luat_uart.h"
  6. #include "luat_mem.h"
  7. int luat_irq_fire(int tp, int arg, void* args);
  8. int l_gpio_handler(lua_State *L, void* ptr) ;
  9. int l_uart_handler(lua_State *L, void* ptr);
  10. int luat_irq_gpio_cb(int pin, void* args) {
  11. rtos_msg_t msg = {0};
  12. msg.handler = l_gpio_handler;
  13. msg.ptr = NULL;
  14. msg.arg1 = pin;
  15. msg.arg2 = luat_gpio_get(pin);
  16. return luat_msgbus_put(&msg, 0);
  17. }
  18. int luat_irq_uart_cb(int id, void* args) {
  19. int len = (int)(args);
  20. rtos_msg_t msg = {0};
  21. msg.handler = l_uart_handler;
  22. msg.ptr = NULL;
  23. msg.arg1 = id;
  24. msg.arg2 = len;
  25. return luat_msgbus_put(&msg, 0);
  26. }
  27. int luat_irq_spi_cb(int id);
  28. static int luat_irq_topic_cb_handler(lua_State *L, void* ptr) {
  29. rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
  30. lua_getglobal(L, "sys_pub");
  31. if (lua_isfunction(L, -1)) {
  32. lua_pushstring(L, msg->ptr);
  33. lua_pushinteger(L, msg->arg1);
  34. lua_pushboolean(L, !msg->arg2);
  35. lua_pushinteger(L, msg->arg2);
  36. lua_call(L, 4, 0);
  37. }
  38. luat_heap_free(msg->ptr);
  39. return 0;
  40. }
  41. //pdata 为 result << 16 | device_id, result 为0 则表示成功,其他失败
  42. //param 为回调topic
  43. int32_t luat_irq_hardware_cb_handler(void *pdata, void *param)
  44. {
  45. rtos_msg_t msg;
  46. msg.handler = luat_irq_topic_cb_handler;
  47. msg.ptr = param;
  48. msg.arg1 = (uint32_t)pdata & 0x0000ffff;
  49. msg.arg2 = ((uint32_t)pdata >> 16);
  50. luat_msgbus_put(&msg, 0);
  51. return 0;
  52. }