PikaStdDevice_GPIO.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #include "PikaStdDevice_GPIO.h"
  2. #include "PikaStdDevice_common.h"
  3. static pika_dev* _get_dev(PikaObj* self) {
  4. pika_dev* dev = PIKA_HAL_OBJ2DEV(self);
  5. if (NULL != dev) {
  6. return dev;
  7. }
  8. dev = pika_hal_open(PIKA_HAL_GPIO, obj_getStr(self, "pin"));
  9. if (NULL == dev) {
  10. __platform_printf("Error: open GPIO '%s' failed.\r\n",
  11. obj_getStr(self, "pin"));
  12. }
  13. obj_setPtr(self, "pika_dev", dev);
  14. return dev;
  15. }
  16. void PikaStdDevice_GPIO_init(PikaObj* self) {
  17. obj_setInt(self, "isEnable", 0);
  18. obj_setStr(self, "pin", "none");
  19. obj_setStr(self, "mode", "out");
  20. obj_setInt(self, "isOn", 0);
  21. obj_setStr(self, "pull", "none");
  22. obj_setInt(self, "id", -999);
  23. obj_setPtr(self, "pika_dev", NULL);
  24. }
  25. int PikaStdDevice_GPIO_getId(PikaObj* self) {
  26. return obj_getInt(self, "id");
  27. }
  28. void PikaStdDevice_GPIO_setId(PikaObj* self, int id) {
  29. obj_setInt(self, "id", id);
  30. }
  31. void PikaStdDevice_GPIO___init__(PikaObj* self) {
  32. PikaStdDevice_GPIO_init(self);
  33. obj_setInt(self, "SIGNAL_RISING", PIKA_HAL_GPIO_EVENT_SIGNAL_RISING);
  34. obj_setInt(self, "SIGNAL_FALLING", PIKA_HAL_GPIO_EVENT_SIGNAL_FALLING);
  35. obj_setInt(self, "SIGNAL_ANY", PIKA_HAL_GPIO_EVENT_SIGNAL_ANY);
  36. }
  37. void PikaStdDevice_GPIO_disable(PikaObj* self) {
  38. obj_setInt(self, "isEnable", 0);
  39. pika_dev* dev = _get_dev(self);
  40. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
  41. }
  42. void PikaStdDevice_GPIO_enable(PikaObj* self) {
  43. obj_setInt(self, "isEnable", 1);
  44. pika_dev* dev = _get_dev(self);
  45. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
  46. }
  47. char* PikaStdDevice_GPIO_getMode(PikaObj* self) {
  48. return obj_getStr(self, "mode");
  49. }
  50. char* PikaStdDevice_GPIO_getPin(PikaObj* self) {
  51. return obj_getStr(self, "pin");
  52. }
  53. void PikaStdDevice_GPIO_low(PikaObj* self) {
  54. obj_setInt(self, "isOn", 0);
  55. pika_dev* dev = _get_dev(self);
  56. uint32_t val = 0;
  57. pika_hal_write(dev, &val, sizeof(val));
  58. }
  59. void PikaStdDevice_GPIO_high(PikaObj* self) {
  60. obj_setInt(self, "isOn", 1);
  61. pika_dev* dev = _get_dev(self);
  62. uint32_t val = 1;
  63. pika_hal_write(dev, &val, sizeof(val));
  64. }
  65. int PikaStdDevice_GPIO_read(PikaObj* self) {
  66. pika_dev* dev = _get_dev(self);
  67. uint32_t val = 0;
  68. pika_hal_read(dev, &val, sizeof(val));
  69. obj_setInt(self, "readBuff", val);
  70. return obj_getInt(self, "readBuff");
  71. }
  72. void PikaStdDevice_GPIO_setMode(PikaObj* self, char* mode) {
  73. if (strEqu(mode, "out") || strEqu(mode, "in")) {
  74. obj_setStr(self, "mode", mode);
  75. pika_hal_GPIO_config cfg = {0};
  76. if (strEqu(mode, "in")) {
  77. cfg.dir = PIKA_HAL_GPIO_DIR_IN;
  78. } else {
  79. cfg.dir = PIKA_HAL_GPIO_DIR_OUT;
  80. }
  81. pika_dev* dev = _get_dev(self);
  82. char* pull = obj_getStr(self, "pull");
  83. if (strEqu(pull, "up")) {
  84. cfg.pull = PIKA_HAL_GPIO_PULL_UP;
  85. }
  86. if (strEqu(pull, "down")) {
  87. cfg.pull = PIKA_HAL_GPIO_PULL_DOWN;
  88. }
  89. if (strEqu(pull, "none")) {
  90. cfg.pull = PIKA_HAL_GPIO_PULL_NONE;
  91. }
  92. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
  93. } else {
  94. obj_setErrorCode(self, 1);
  95. obj_setSysOut(self, "[error] GPIO mode should be 'out' or 'in'.");
  96. }
  97. }
  98. void PikaStdDevice_GPIO_setPull(PikaObj* self, char* pull) {
  99. if (strEqu(pull, "up") || strEqu(pull, "down") || strEqu(pull, "none")) {
  100. obj_setStr(self, "pull", pull);
  101. } else {
  102. obj_setErrorCode(self, 1);
  103. obj_setSysOut(self,
  104. "[error] GPIO pull should be 'up', 'down' or 'none'.");
  105. }
  106. }
  107. void PikaStdDevice_GPIO_setPin(PikaObj* self, char* pinName) {
  108. obj_setStr(self, "pin", pinName);
  109. }
  110. void PikaStdDevice_GPIO_setCallback(PikaObj* self,
  111. Arg* eventCallback,
  112. int filter) {
  113. #if PIKA_EVENT_ENABLE
  114. pika_dev* dev = _get_dev(self);
  115. _PikaStdDevice_setCallback(self, eventCallback, (uintptr_t)dev);
  116. /* regist event to pika_hal */
  117. pika_hal_GPIO_config cfg_cb = {0};
  118. cfg_cb.event_callback = _PikaStdDevice_GPIO_event_handler;
  119. cfg_cb.event_callback_filter = filter;
  120. cfg_cb.event_callback_ena = PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE;
  121. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg_cb);
  122. #else
  123. obj_setErrorCode(self, 1);
  124. obj_setSysOut(self, "[error] PIKA_EVENT_ENABLE is disabled.");
  125. #endif
  126. }
  127. void PikaStdDevice_GPIO_setCallBack(PikaObj* self,
  128. Arg* eventCallback,
  129. int filter) {
  130. pika_platform_printf(
  131. "Warning: setCallBack is deprecated, use "
  132. "setCallback instead.\r\n");
  133. PikaStdDevice_GPIO_setCallback(self, eventCallback, filter);
  134. }
  135. void PikaStdDevice_GPIO_close(PikaObj* self) {
  136. pika_dev* dev = _get_dev(self);
  137. pika_hal_close(dev);
  138. }