timeline.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /********************************************************************************
  2. * USDK(ATS350B_linux)
  3. * Module: SYSTEM
  4. * Copyright(c) 2003-2017 Actions Semiconductor,
  5. * All Rights Reserved.
  6. *
  7. * History:
  8. * <author> <time> <version > <desc>
  9. * rongxing 2021-9-5 1.0 build this file
  10. ********************************************************************************/
  11. /*!
  12. * \file timeline.c
  13. * \brief
  14. * \author
  15. * \version 1.0
  16. * \date 2021-9-5
  17. *******************************************************************************/
  18. #include <timeline.h>
  19. #ifdef CONFIG_SYS_LOG
  20. #define SYS_LOG_NO_NEWLINE
  21. #ifdef SYS_LOG_DOMAIN
  22. #undef SYS_LOG_DOMAIN
  23. #endif
  24. #define SYS_LOG_DOMAIN "timeline"
  25. #include <logging/sys_log.h>
  26. #endif
  27. static sys_slist_t g_timeline_list = SYS_SLIST_STATIC_INIT(&g_timeline_list);
  28. OS_MUTEX_DEFINE(timeline_lock);
  29. timeline_t * timeline_create(int32_t type,int32_t interval_us){
  30. timeline_t * timeline = mem_malloc(sizeof(timeline_t));
  31. if (!timeline) {
  32. SYS_LOG_ERR("timeline %d malloc failed\n",type);
  33. return NULL;
  34. }
  35. timeline->type = type;
  36. timeline->status = TIMELINE_STATUS_PENDING;
  37. timeline->interval_us = interval_us;
  38. sys_slist_init(&timeline->listener_list);
  39. SYS_LOG_INF("%d %d\n",type,interval_us);
  40. os_mutex_lock(&timeline_lock, OS_FOREVER);
  41. sys_slist_append(&g_timeline_list, &timeline->node);
  42. os_mutex_unlock(&timeline_lock);
  43. return timeline;
  44. }
  45. static int timeline_is_validate(timeline_t *tl){
  46. timeline_t * p_tl = NULL;
  47. sys_snode_t *pnode;
  48. uint8_t validate = 0;
  49. if(!k_is_in_isr())
  50. os_mutex_lock(&timeline_lock, OS_FOREVER);
  51. SYS_SLIST_FOR_EACH_NODE(&g_timeline_list, pnode) {
  52. p_tl = CONTAINER_OF(pnode, timeline_t, node);
  53. if(p_tl == tl){
  54. validate = 1;
  55. }
  56. }
  57. if(!k_is_in_isr())
  58. os_mutex_unlock(&timeline_lock);
  59. if(!validate)
  60. SYS_LOG_INF("%p already release??\n",tl);
  61. return validate;
  62. }
  63. int timeline_start(timeline_t *tl){
  64. if(tl && timeline_is_validate(tl)){
  65. if(!k_is_in_isr())
  66. os_mutex_lock(&timeline_lock, OS_FOREVER);
  67. tl->status = TIMELINE_STATUS_RUNNING;
  68. if(!k_is_in_isr())
  69. os_mutex_unlock(&timeline_lock);
  70. }
  71. return 0;
  72. }
  73. int timeline_add_listener(timeline_t *tl,timeline_listener_t* listener)
  74. {
  75. if(tl && timeline_is_validate(tl) && listener){
  76. SYS_LOG_INF("tl %p add %p\n",tl,listener);
  77. if(!k_is_in_isr())
  78. os_mutex_lock(&timeline_lock, OS_FOREVER);
  79. sys_slist_append(&tl->listener_list, &listener->node);
  80. if(!k_is_in_isr())
  81. os_mutex_unlock(&timeline_lock);
  82. return 0;
  83. }else
  84. return -EINVAL;
  85. }
  86. int timeline_remove_listener(timeline_t *tl,timeline_listener_t* listener){
  87. if(tl && timeline_is_validate(tl) && listener){
  88. SYS_LOG_INF("tl %p remove %p\n",tl,listener);
  89. if(!k_is_in_isr())
  90. os_mutex_lock(&timeline_lock, OS_FOREVER);
  91. sys_slist_find_and_remove(&tl->listener_list, &listener->node);
  92. if(!k_is_in_isr())
  93. os_mutex_unlock(&timeline_lock);
  94. return 0;
  95. }else
  96. return -EINVAL;
  97. }
  98. int timeline_trigger_listener(timeline_t *tl){
  99. timeline_listener_t *listener;
  100. sys_snode_t *pnode;
  101. if(tl && timeline_is_validate(tl) && tl->status == TIMELINE_STATUS_RUNNING){
  102. if(!k_is_in_isr())
  103. os_mutex_lock(&timeline_lock, OS_FOREVER);
  104. SYS_SLIST_FOR_EACH_NODE(&tl->listener_list, pnode) {
  105. listener = CONTAINER_OF(pnode, timeline_listener_t, node);
  106. listener->trigger(listener->param);
  107. }
  108. if(!k_is_in_isr())
  109. os_mutex_unlock(&timeline_lock);
  110. return 0;
  111. }else
  112. return -EINVAL;
  113. }
  114. int timeline_get_interval(timeline_t * tl){
  115. if(tl && timeline_is_validate(tl))
  116. return tl->interval_us;
  117. else
  118. return 0;
  119. }
  120. int timeline_stop(timeline_t *tl){
  121. if(tl && timeline_is_validate(tl)){
  122. if(!k_is_in_isr())
  123. os_mutex_lock(&timeline_lock, OS_FOREVER);
  124. tl->status = TIMELINE_STATUS_PENDING;
  125. if(!k_is_in_isr())
  126. os_mutex_unlock(&timeline_lock);
  127. }
  128. return 0;
  129. }
  130. int timeline_release(timeline_t * tl){
  131. if(tl && timeline_is_validate(tl)){
  132. SYS_LOG_INF("%p\n",tl);
  133. if(!k_is_in_isr())
  134. os_mutex_lock(&timeline_lock, OS_FOREVER);
  135. sys_slist_find_and_remove(&g_timeline_list, &tl->node);
  136. mem_free(tl);
  137. if(!k_is_in_isr())
  138. os_mutex_unlock(&timeline_lock);
  139. }
  140. return 0;
  141. }
  142. timeline_t * timeline_get_by_type(int32_t type){
  143. timeline_t * tl;
  144. sys_snode_t *pnode;
  145. if(!k_is_in_isr())
  146. os_mutex_lock(&timeline_lock, OS_FOREVER);
  147. SYS_SLIST_FOR_EACH_NODE(&g_timeline_list, pnode) {
  148. tl = CONTAINER_OF(pnode, timeline_t, node);
  149. if(tl->type == type){
  150. if(!k_is_in_isr())
  151. os_mutex_unlock(&timeline_lock);
  152. return tl;
  153. }
  154. }
  155. if(!k_is_in_isr())
  156. os_mutex_unlock(&timeline_lock);
  157. return NULL;
  158. }