You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
10 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. #include "zapp.h"
  2. #include "znordic.h"
  3. typedef struct {
  4. app_event_listener_t cbfunc;
  5. } AppEventListener;
  6. static device_state_t m_device_state = kstate_standby; // �豸״̬
  7. static uint32_t m_change_to_cur_state_tp = 0; // �л�����ǰ״̬��ʱ����
  8. static on_state_change_t m_onstate_change;
  9. static AppEventListener m_listener[10];
  10. static int m_listener_num = 0;
  11. APP_TIMER_DEF(m_state_machine_driver_tmr); // ״̬��������ʱ��
  12. #define SCHED_MAX_EVENT_DATA_SIZE MAX(sizeof(app_event_t), APP_TIMER_SCHED_EVENT_DATA_SIZE)
  13. APP_TIMER_DEF(m_delay_event_preset_tmr0); //
  14. APP_TIMER_DEF(m_delay_event_preset_tmr1); //
  15. APP_TIMER_DEF(m_delay_event_preset_tmr2); //
  16. APP_TIMER_DEF(m_delay_event_preset_tmr3); //
  17. APP_TIMER_DEF(m_delay_event_preset_tmr4); //
  18. APP_TIMER_DEF(m_delay_event_preset_tmr5); //
  19. APP_TIMER_DEF(m_delay_event_preset_tmr6); //
  20. APP_TIMER_DEF(m_delay_event_preset_tmr7); //
  21. APP_TIMER_DEF(m_delay_event_preset_tmr8); //
  22. APP_TIMER_DEF(m_delay_event_preset_tmr9); //
  23. typedef struct {
  24. app_timer_id_t tmrid;
  25. app_event_t eventcache;
  26. bool usage;
  27. } zevent_preset_tmr_t;
  28. zevent_preset_tmr_t m_delay_event_preset_tmr[10] = {0};
  29. /***********************************************************************************************************************
  30. * CALL BAK *
  31. ***********************************************************************************************************************/
  32. static void app_event_process_cb(void* p_event_data, uint16_t event_size) {
  33. app_event_t* p_event = (app_event_t*)p_event_data;
  34. if (p_event->hang_up_flag) {
  35. *p_event->hang_up_flag = 0;
  36. }
  37. for (int i = 0; i < m_listener_num; i++) {
  38. if (m_listener[i].cbfunc) {
  39. m_listener[i].cbfunc(p_event_data, event_size);
  40. }
  41. }
  42. }
  43. static void state_machine_driver_tmr_cb(void* p_context) { //
  44. wd_feed();
  45. static app_event_t appevent;
  46. static uint8_t event_hang_up = 0;
  47. appevent.eventType = kappevent_tmr_scheduler_event;
  48. zapp_ebus_push_event_ext(&event_hang_up, &appevent);
  49. }
  50. static void delay_event_preset_tmr_cb(void* p_context) { //
  51. zevent_preset_tmr_t* tmr = (zevent_preset_tmr_t*)p_context;
  52. tmr->usage = false;
  53. app_event_t* event = &tmr->eventcache;
  54. ZASSERT(zapp_ebus_push_event(event));
  55. }
  56. /***********************************************************************************************************************
  57. * EXTERN *
  58. ***********************************************************************************************************************/
  59. void zapp_early_init() { APP_SCHED_INIT(SCHED_MAX_EVENT_DATA_SIZE, 20); }
  60. void zapp_init() {
  61. ZERROR_CHECK(app_timer_create(&m_state_machine_driver_tmr, APP_TIMER_MODE_REPEATED, state_machine_driver_tmr_cb));
  62. ZERROR_CHECK(app_timer_create(&m_delay_event_preset_tmr0, APP_TIMER_MODE_SINGLE_SHOT, delay_event_preset_tmr_cb));
  63. ZERROR_CHECK(app_timer_create(&m_delay_event_preset_tmr1, APP_TIMER_MODE_SINGLE_SHOT, delay_event_preset_tmr_cb));
  64. ZERROR_CHECK(app_timer_create(&m_delay_event_preset_tmr2, APP_TIMER_MODE_SINGLE_SHOT, delay_event_preset_tmr_cb));
  65. ZERROR_CHECK(app_timer_create(&m_delay_event_preset_tmr3, APP_TIMER_MODE_SINGLE_SHOT, delay_event_preset_tmr_cb));
  66. ZERROR_CHECK(app_timer_create(&m_delay_event_preset_tmr4, APP_TIMER_MODE_SINGLE_SHOT, delay_event_preset_tmr_cb));
  67. ZERROR_CHECK(app_timer_create(&m_delay_event_preset_tmr5, APP_TIMER_MODE_SINGLE_SHOT, delay_event_preset_tmr_cb));
  68. ZERROR_CHECK(app_timer_create(&m_delay_event_preset_tmr6, APP_TIMER_MODE_SINGLE_SHOT, delay_event_preset_tmr_cb));
  69. ZERROR_CHECK(app_timer_create(&m_delay_event_preset_tmr7, APP_TIMER_MODE_SINGLE_SHOT, delay_event_preset_tmr_cb));
  70. ZERROR_CHECK(app_timer_create(&m_delay_event_preset_tmr8, APP_TIMER_MODE_SINGLE_SHOT, delay_event_preset_tmr_cb));
  71. ZERROR_CHECK(app_timer_create(&m_delay_event_preset_tmr9, APP_TIMER_MODE_SINGLE_SHOT, delay_event_preset_tmr_cb));
  72. m_delay_event_preset_tmr[0].tmrid = m_delay_event_preset_tmr0;
  73. m_delay_event_preset_tmr[1].tmrid = m_delay_event_preset_tmr1;
  74. m_delay_event_preset_tmr[2].tmrid = m_delay_event_preset_tmr2;
  75. m_delay_event_preset_tmr[3].tmrid = m_delay_event_preset_tmr3;
  76. m_delay_event_preset_tmr[4].tmrid = m_delay_event_preset_tmr4;
  77. m_delay_event_preset_tmr[5].tmrid = m_delay_event_preset_tmr5;
  78. m_delay_event_preset_tmr[6].tmrid = m_delay_event_preset_tmr6;
  79. m_delay_event_preset_tmr[7].tmrid = m_delay_event_preset_tmr7;
  80. m_delay_event_preset_tmr[8].tmrid = m_delay_event_preset_tmr8;
  81. m_delay_event_preset_tmr[9].tmrid = m_delay_event_preset_tmr9;
  82. }
  83. void zapp_start_schedule() { ZERROR_CHECK(app_timer_start(m_state_machine_driver_tmr, APP_TIMER_TICKS(1000), NULL)); }
  84. /***********************************************************************************************************************
  85. * state_machine *
  86. ***********************************************************************************************************************/
  87. void zapp_state_machine_reg_state_change_listener(on_state_change_t listener) { m_onstate_change = listener; }
  88. static void _zapp_state_machine_change_state(void* tostate_) {
  89. device_state_t tostate = (device_state_t)tostate_;
  90. ZLOGI("change state from %s to %s", device_state_to_str(m_device_state), device_state_to_str(tostate));
  91. device_state_t nowstate = m_device_state;
  92. m_device_state = tostate;
  93. if (m_onstate_change) {
  94. m_onstate_change(nowstate, m_device_state);
  95. }
  96. m_change_to_cur_state_tp = znordic_getpower_on_ms();
  97. }
  98. void zapp_state_machine_change_state(device_state_t tostate) { //
  99. uint32_t ret = zapp_exec_in_main_context(NULL, _zapp_state_machine_change_state, (void*)tostate);
  100. if(ret != 0){
  101. ZLOGE("zapp_state_machine_change_state failed");
  102. ZASSERT(0);
  103. }
  104. }
  105. device_state_t zapp_state_machine_now_state() { return m_device_state; }
  106. uint32_t zapp_state_machine_haspassed_ms() { return znordic_haspassed_ms(m_change_to_cur_state_tp); }
  107. /***********************************************************************************************************************
  108. * EBUS *
  109. ***********************************************************************************************************************/
  110. bool zapp_ebus_push_event(app_event_t* event) {
  111. uint32_t suc = app_sched_event_put(event, sizeof(app_event_t), app_event_process_cb); // app_event_process_cb(event, sizeof(app_event_t)
  112. if (suc != 0) {
  113. ZLOGE("app_sched_event_put failed");
  114. return false;
  115. }
  116. return true;
  117. }
  118. bool zapp_ebus_push_event_ext(uint8_t* hang_up_flag, app_event_t* event) {
  119. event->hang_up_flag = hang_up_flag;
  120. if (event->hang_up_flag) {
  121. if (*event->hang_up_flag) {
  122. return true;
  123. }
  124. *event->hang_up_flag = 1;
  125. if (zapp_ebus_push_event(event)) {
  126. return true;
  127. } else {
  128. *event->hang_up_flag = 0;
  129. return false;
  130. }
  131. } else {
  132. return zapp_ebus_push_event(event);
  133. }
  134. }
  135. bool zapp_ebus_push_delayed_event(int delay, app_event_t* event) {
  136. zevent_preset_tmr_t* tmr = NULL;
  137. CRITICAL_REGION_ENTER();
  138. for (int i = 0; i < 10; i++) {
  139. if (!m_delay_event_preset_tmr[i].usage) {
  140. tmr = &m_delay_event_preset_tmr[i];
  141. tmr->usage = true;
  142. break;
  143. }
  144. }
  145. CRITICAL_REGION_EXIT();
  146. if (tmr == NULL) {
  147. return false;
  148. }
  149. tmr->eventcache = *event;
  150. uint32_t suc = app_timer_start(tmr->tmrid, APP_TIMER_TICKS(delay), tmr);
  151. if (suc != NRF_SUCCESS) {
  152. tmr->usage = false;
  153. return false;
  154. }
  155. return true;
  156. }
  157. void zapp_ebus_reg_event_listener(app_event_listener_t listener) {
  158. ZASSERT(m_listener_num < 10);
  159. m_listener[m_listener_num++].cbfunc = listener;
  160. }
  161. /***********************************************************************************************************************
  162. * GSTATE *
  163. ***********************************************************************************************************************/
  164. static gstate_t gstate;
  165. gstate_t* zapp_get_gstate() { return &gstate; }
  166. void zapp_gstate_set_is_over30s(bool over30s) {
  167. gstate_t* p_gstate = zapp_get_gstate();
  168. p_gstate->sample_capture_state_is_over30s = over30s;
  169. }
  170. void zapp_gstate_set_preview_state(bool is_preview) {
  171. gstate_t* p_gstate = zapp_get_gstate();
  172. p_gstate->is_preview = is_preview;
  173. }
  174. /***********************************************************************************************************************
  175. * zapp_exec_in_main_context *
  176. ***********************************************************************************************************************/
  177. typedef struct {
  178. uint8_t* hang_up_flag;
  179. void (*handler)(void*);
  180. void* usrdata;
  181. } zapp_exec_in_main_context_t;
  182. static void zapp_exec_once_event_handler(void* p_event_data, uint16_t event_size) {
  183. zapp_exec_in_main_context_t* event = (zapp_exec_in_main_context_t*)p_event_data;
  184. if (event->hang_up_flag) {
  185. *event->hang_up_flag = 0;
  186. }
  187. event->handler(event->usrdata);
  188. }
  189. uint32_t zapp_exec_in_main_context(uint8_t* hang_up_flag, void (*handler)(void*), void* usrdata) {
  190. zapp_exec_in_main_context_t event = {0};
  191. event.hang_up_flag = hang_up_flag;
  192. event.handler = handler;
  193. event.usrdata = usrdata;
  194. /**
  195. * @brief
  196. * 1. hang_up_flagΪգ¼ǷѾ¼¼
  197. * 2. hang_up_flagΪգֻе¼ûи¼ʱݼ(Ӧڶʱڵ¼)
  198. */
  199. if (hang_up_flag) {
  200. if (*hang_up_flag != 0) {
  201. return 0;
  202. }
  203. *hang_up_flag = 1;
  204. uint32_t ret = app_sched_event_put(&event, sizeof(zapp_exec_in_main_context_t), zapp_exec_once_event_handler);
  205. if (ret != 0) {
  206. *hang_up_flag = 0;
  207. }
  208. return ret;
  209. } else {
  210. return app_sched_event_put(&event, sizeof(zapp_exec_in_main_context_t), zapp_exec_once_event_handler);
  211. }
  212. }