1 /*
2  * SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include "esp_event.h"
8 #include "esp_event_internal.h"
9 #include "esp_task.h"
10 
11 /* ------------------------- Static Variables ------------------------------- */
12 
13 static esp_event_loop_handle_t s_default_loop = NULL;
14 
15 /* ---------------------------- Public API ---------------------------------- */
16 
esp_event_handler_register(esp_event_base_t event_base,int32_t event_id,esp_event_handler_t event_handler,void * event_handler_arg)17 esp_err_t esp_event_handler_register(esp_event_base_t event_base, int32_t event_id,
18         esp_event_handler_t event_handler, void* event_handler_arg)
19 {
20     if (s_default_loop == NULL) {
21         return ESP_ERR_INVALID_STATE;
22     }
23 
24     return esp_event_handler_register_with(s_default_loop, event_base, event_id,
25             event_handler, event_handler_arg);
26 }
27 
esp_event_handler_instance_register(esp_event_base_t event_base,int32_t event_id,esp_event_handler_t event_handler,void * event_handler_arg,esp_event_handler_instance_t * context)28 esp_err_t esp_event_handler_instance_register(esp_event_base_t event_base,
29                                               int32_t event_id,
30                                               esp_event_handler_t event_handler,
31                                               void *event_handler_arg,
32                                               esp_event_handler_instance_t *context)
33 {
34     if (s_default_loop == NULL) {
35         return ESP_ERR_INVALID_STATE;
36     }
37 
38     return esp_event_handler_instance_register_with(s_default_loop,
39                                                     event_base,
40                                                     event_id,
41                                                     event_handler,
42                                                     event_handler_arg,
43                                                     context);
44 }
45 
esp_event_handler_unregister(esp_event_base_t event_base,int32_t event_id,esp_event_handler_t event_handler)46 esp_err_t esp_event_handler_unregister(esp_event_base_t event_base, int32_t event_id,
47         esp_event_handler_t event_handler)
48 {
49     if (s_default_loop == NULL) {
50         return ESP_ERR_INVALID_STATE;
51     }
52 
53     return esp_event_handler_unregister_with(s_default_loop, event_base, event_id,
54             event_handler);
55 }
56 
esp_event_handler_instance_unregister(esp_event_base_t event_base,int32_t event_id,esp_event_handler_instance_t context)57 esp_err_t esp_event_handler_instance_unregister(esp_event_base_t event_base,
58                                                 int32_t event_id,
59                                                 esp_event_handler_instance_t context)
60 {
61     if (s_default_loop == NULL) {
62         return ESP_ERR_INVALID_STATE;
63     }
64 
65     return esp_event_handler_instance_unregister_with(s_default_loop, event_base, event_id, context);
66 }
67 
esp_event_post(esp_event_base_t event_base,int32_t event_id,const void * event_data,size_t event_data_size,TickType_t ticks_to_wait)68 esp_err_t esp_event_post(esp_event_base_t event_base, int32_t event_id,
69         const void* event_data, size_t event_data_size, TickType_t ticks_to_wait)
70 {
71     if (s_default_loop == NULL) {
72         return ESP_ERR_INVALID_STATE;
73     }
74 
75     return esp_event_post_to(s_default_loop, event_base, event_id,
76             event_data, event_data_size, ticks_to_wait);
77 }
78 
79 
80 #if CONFIG_ESP_EVENT_POST_FROM_ISR
esp_event_isr_post(esp_event_base_t event_base,int32_t event_id,const void * event_data,size_t event_data_size,BaseType_t * task_unblocked)81 esp_err_t esp_event_isr_post(esp_event_base_t event_base, int32_t event_id,
82         const void* event_data, size_t event_data_size, BaseType_t* task_unblocked)
83 {
84     if (s_default_loop == NULL) {
85         return ESP_ERR_INVALID_STATE;
86     }
87 
88     return esp_event_isr_post_to(s_default_loop, event_base, event_id,
89             event_data, event_data_size, task_unblocked);
90 }
91 #endif
92 
93 
esp_event_loop_create_default(void)94 esp_err_t esp_event_loop_create_default(void)
95 {
96     if (s_default_loop) {
97         return ESP_ERR_INVALID_STATE;
98     }
99 
100     esp_event_loop_args_t loop_args = {
101         .queue_size = CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE,
102         .task_name = "sys_evt",
103         .task_stack_size = ESP_TASKD_EVENT_STACK,
104         .task_priority = ESP_TASKD_EVENT_PRIO,
105         .task_core_id = 0
106     };
107 
108     esp_err_t err;
109 
110     err = esp_event_loop_create(&loop_args, &s_default_loop);
111     if (err != ESP_OK) {
112         return err;
113     }
114 
115     return ESP_OK;
116 }
117 
esp_event_loop_delete_default(void)118 esp_err_t esp_event_loop_delete_default(void)
119 {
120     if (!s_default_loop) {
121         return ESP_ERR_INVALID_STATE;
122     }
123 
124     esp_err_t err;
125 
126     err = esp_event_loop_delete(s_default_loop);
127 
128     if (err != ESP_OK) {
129         return err;
130     }
131 
132     s_default_loop = NULL;
133 
134     return ESP_OK;
135 }
136