PikaStdDevice_Timer.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "PikaStdDevice_Timer.h"
  2. #include "pika_hal.h"
  3. #include "PikaStdDevice_common.h"
  4. extern PikaEventListener* g_pika_device_event_listener;
  5. static pika_dev* _get_dev(PikaObj* self) {
  6. pika_dev* dev = obj_getPtr(self, "pika_dev");
  7. if (NULL != dev) {
  8. return dev;
  9. }
  10. char* name = obj_getStr(self, "name");
  11. if (!strEqu(name, "none")) {
  12. dev = pika_hal_open(PIKA_HAL_TIM, name);
  13. if (NULL == dev) {
  14. __platform_printf("Error: open TIM '%s' failed.\r\n", name);
  15. }
  16. obj_setPtr(self, "pika_dev", dev);
  17. return dev;
  18. }
  19. int id = obj_getInt(self, "id");
  20. if (id != -1) {
  21. char id_str[32] = {0};
  22. sprintf(id_str, "TIM%d", id);
  23. dev = pika_hal_open(PIKA_HAL_TIM, id_str);
  24. if (NULL == dev) {
  25. __platform_printf("Error: open TIM '%s' failed.\r\n", id_str);
  26. }
  27. obj_setPtr(self, "pika_dev", dev);
  28. return dev;
  29. } else {
  30. /* id == -1 means a SOFT timer */
  31. dev = pika_hal_open(PIKA_HAL_SOFT_TIM, "SOFT_TIM");
  32. if (NULL == dev) {
  33. __platform_printf("Error: open SOFT_TIM failed.\r\n");
  34. }
  35. obj_setPtr(self, "pika_dev", dev);
  36. return dev;
  37. }
  38. return dev;
  39. }
  40. void PikaStdDevice_Timer___init__(PikaObj* self) {
  41. obj_setInt(self, "id", -1);
  42. obj_setStr(self, "name", "none");
  43. obj_setInt(self, "period", PIKA_HAL_TIM_PERIOD_1S);
  44. obj_setInt(self, "SIGNAL_TIMEOUT", PIKA_HAL_TIM_EVENT_SIGNAL_TIMEOUT);
  45. obj_setInt(self, "mode", PIKA_HAL_TIM_MODE_CONTINUOUS);
  46. obj_setInt(self, "SIGNAL_ANY", PIKA_HAL_TIM_EVENT_SIGNAL_ANY);
  47. }
  48. void PikaStdDevice_Timer_disable(PikaObj* self) {
  49. pika_dev* dev = _get_dev(self);
  50. if (NULL == dev) {
  51. __platform_printf("Error: open TIM '%d' failed.\r\n",
  52. (int)obj_getInt(self, "id"));
  53. return;
  54. }
  55. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
  56. }
  57. void PikaStdDevice_Timer_enable(PikaObj* self) {
  58. pika_dev* dev = _get_dev(self);
  59. if (NULL == dev) {
  60. __platform_printf("Error: open TIM '%d' failed.\r\n",
  61. (int)obj_getInt(self, "id"));
  62. return;
  63. }
  64. pika_hal_TIM_config cfg = {0};
  65. cfg.period = obj_getInt(self, "period");
  66. if (NULL != obj_getArg(self, "callback")) {
  67. PikaStdDevice_Timer_setCallback(self, obj_getArg(self, "callback"),
  68. obj_getInt(self, "callback_filter"));
  69. }
  70. int err = -1;
  71. err = pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
  72. if (err != 0) {
  73. __platform_printf("Error: config TIM '%d' failed.\r\n",
  74. (int)obj_getInt(self, "id"));
  75. return;
  76. }
  77. err = pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
  78. if (err != 0) {
  79. __platform_printf("Error: enable TIM '%d' failed.\r\n",
  80. (int)obj_getInt(self, "id"));
  81. return;
  82. }
  83. }
  84. void PikaStdDevice_Timer_setCallback(PikaObj* self, Arg* callback, int filter) {
  85. #if PIKA_EVENT_ENABLE
  86. if (NULL != obj_getPtr(self, "pika_dev")) {
  87. pika_dev* dev = _get_dev(self);
  88. _PikaStdDevice_setCallback(self, callback, (uintptr_t)dev);
  89. /* regist event to pika_hal */
  90. pika_hal_TIM_config cfg_cb = {0};
  91. cfg_cb.event_callback = (void*)_PikaStdDevice_event_handler;
  92. cfg_cb.event_callback_filter = filter;
  93. cfg_cb.event_callback_ena = PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE;
  94. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg_cb);
  95. } else {
  96. obj_setArg(self, "callback", callback);
  97. obj_setInt(self, "callback_filter", filter);
  98. }
  99. #else
  100. obj_setErrorCode(self, 1);
  101. obj_setSysOut(self, "[error] PIKA_EVENT_ENABLE is disabled.");
  102. #endif
  103. }
  104. void PikaStdDevice_Timer_setPeriod(PikaObj* self, int period_ms) {
  105. obj_setInt(self, "period", period_ms * PIKA_HAL_TIM_PERIOD_1MS);
  106. pika_hal_TIM_config cfg = {0};
  107. cfg.period = obj_getInt(self, "period");
  108. pika_hal_ioctl(_get_dev(self), PIKA_HAL_IOCTL_CONFIG, &cfg);
  109. }
  110. void PikaStdDevice_Timer_close(PikaObj* self) {
  111. pika_hal_close(_get_dev(self));
  112. obj_setPtr(self, "pika_dev", NULL);
  113. }
  114. void PikaStdDevice_Timer_setId(PikaObj* self, int id) {
  115. obj_setInt(self, "id", id);
  116. }
  117. void PikaStdDevice_Timer_setName(PikaObj* self, char* name) {
  118. obj_setStr(self, "name", name);
  119. }
  120. int PikaStdDevice_Timer_getId(PikaObj* self) {
  121. return obj_getInt(self, "id");
  122. }
  123. char* PikaStdDevice_Timer_getName(PikaObj* self) {
  124. return obj_getStr(self, "name");
  125. }
  126. void PikaStdDevice_Timer_setMode(PikaObj* self, char* mode) {
  127. if (strEqu(mode, "oneshot")) {
  128. obj_setInt(self, "mode", PIKA_HAL_TIM_MODE_ONESHOT);
  129. } else if (strEqu(mode, "continuous")) {
  130. obj_setInt(self, "mode", PIKA_HAL_TIM_MODE_CONTINUOUS);
  131. } else {
  132. obj_setErrorCode(self, 1);
  133. obj_setSysOut(self, "[error] mode is not supported.");
  134. }
  135. pika_dev* dev = _get_dev(self);
  136. pika_hal_TIM_config cfg = {0};
  137. cfg.mode = obj_getInt(self, "mode");
  138. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
  139. }