PikaStdDevice_Timer.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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. }
  39. void PikaStdDevice_Timer___init__(PikaObj* self) {
  40. obj_setInt(self, "id", -1);
  41. obj_setStr(self, "name", "none");
  42. obj_setInt(self, "period", PIKA_HAL_TIM_PERIOD_1S);
  43. obj_setInt(self, "SIGNAL_TIMEOUT", PIKA_HAL_TIM_EVENT_SIGNAL_TIMEOUT);
  44. obj_setInt(self, "mode", PIKA_HAL_TIM_MODE_CONTINUOUS);
  45. obj_setInt(self, "SIGNAL_ANY", PIKA_HAL_TIM_EVENT_SIGNAL_ANY);
  46. }
  47. void PikaStdDevice_Timer_disable(PikaObj* self) {
  48. pika_dev* dev = _get_dev(self);
  49. if (NULL == dev) {
  50. __platform_printf("Error: open TIM '%d' failed.\r\n",
  51. (int)obj_getInt(self, "id"));
  52. return;
  53. }
  54. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
  55. }
  56. void PikaStdDevice_Timer_enable(PikaObj* self) {
  57. pika_dev* dev = _get_dev(self);
  58. if (NULL == dev) {
  59. __platform_printf("Error: open TIM '%d' failed.\r\n",
  60. (int)obj_getInt(self, "id"));
  61. return;
  62. }
  63. pika_hal_TIM_config cfg = {0};
  64. cfg.period = obj_getInt(self, "period");
  65. if (NULL != obj_getArg(self, "callback")) {
  66. PikaStdDevice_Timer_setCallback(self, obj_getArg(self, "callback"),
  67. obj_getInt(self, "callback_filter"));
  68. }
  69. int err = -1;
  70. err = pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
  71. if (err != 0) {
  72. __platform_printf("Error: config TIM '%d' failed.\r\n",
  73. (int)obj_getInt(self, "id"));
  74. return;
  75. }
  76. err = pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
  77. if (err != 0) {
  78. __platform_printf("Error: enable TIM '%d' failed.\r\n",
  79. (int)obj_getInt(self, "id"));
  80. return;
  81. }
  82. }
  83. void PikaStdDevice_Timer_setCallback(PikaObj* self, Arg* callback, int filter) {
  84. #if PIKA_EVENT_ENABLE
  85. if (NULL != obj_getPtr(self, "pika_dev")) {
  86. pika_dev* dev = _get_dev(self);
  87. _PikaStdDevice_setCallback(self, callback, (uintptr_t)dev);
  88. /* regist event to pika_hal */
  89. pika_hal_TIM_config cfg_cb = {0};
  90. cfg_cb.event_callback = _PikaStdDevice_TIM_event_handler;
  91. cfg_cb.event_callback_filter = filter;
  92. cfg_cb.event_callback_ena = PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE;
  93. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg_cb);
  94. } else {
  95. obj_setArg(self, "callback", callback);
  96. obj_setInt(self, "callback_filter", filter);
  97. }
  98. #else
  99. obj_setErrorCode(self, 1);
  100. obj_setSysOut(self, "[error] PIKA_EVENT_ENABLE is disabled.");
  101. #endif
  102. }
  103. void PikaStdDevice_Timer_setPeriod(PikaObj* self, int period_ms) {
  104. obj_setInt(self, "period", period_ms * PIKA_HAL_TIM_PERIOD_1MS);
  105. pika_hal_TIM_config cfg = {0};
  106. cfg.period = obj_getInt(self, "period");
  107. pika_hal_ioctl(_get_dev(self), PIKA_HAL_IOCTL_CONFIG, &cfg);
  108. }
  109. void PikaStdDevice_Timer_close(PikaObj* self) {
  110. pika_hal_close(_get_dev(self));
  111. obj_setPtr(self, "pika_dev", NULL);
  112. }
  113. void PikaStdDevice_Timer_setId(PikaObj* self, int id) {
  114. obj_setInt(self, "id", id);
  115. }
  116. void PikaStdDevice_Timer_setName(PikaObj* self, char* name) {
  117. obj_setStr(self, "name", name);
  118. }
  119. int PikaStdDevice_Timer_getId(PikaObj* self) {
  120. return obj_getInt(self, "id");
  121. }
  122. char* PikaStdDevice_Timer_getName(PikaObj* self) {
  123. return obj_getStr(self, "name");
  124. }
  125. void PikaStdDevice_Timer_setMode(PikaObj* self, char* mode) {
  126. if (strEqu(mode, "oneshot")) {
  127. obj_setInt(self, "mode", PIKA_HAL_TIM_MODE_ONESHOT);
  128. } else if (strEqu(mode, "continuous")) {
  129. obj_setInt(self, "mode", PIKA_HAL_TIM_MODE_CONTINUOUS);
  130. } else {
  131. obj_setErrorCode(self, 1);
  132. obj_setSysOut(self, "[error] mode is not supported.");
  133. }
  134. pika_dev* dev = _get_dev(self);
  135. pika_hal_TIM_config cfg = {0};
  136. cfg.mode = obj_getInt(self, "mode");
  137. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
  138. }