event_loop_legacy.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "esp_err.h"
  15. #include "esp_log.h"
  16. #include "esp_event.h"
  17. #include "esp_event_legacy.h"
  18. #include "sdkconfig.h"
  19. static const char* TAG = "event";
  20. static system_event_cb_t s_event_handler_cb;
  21. static void *s_event_ctx;
  22. static bool s_initialized;
  23. ESP_EVENT_DEFINE_BASE(SYSTEM_EVENT);
  24. static void esp_event_post_to_user(void* arg, esp_event_base_t base, int32_t id, void* data)
  25. {
  26. if (s_event_handler_cb) {
  27. system_event_t* event = (system_event_t*) data;
  28. (*s_event_handler_cb)(s_event_ctx, event);
  29. }
  30. }
  31. system_event_cb_t esp_event_loop_set_cb(system_event_cb_t cb, void *ctx)
  32. {
  33. system_event_cb_t old_cb = s_event_handler_cb;
  34. s_event_handler_cb = cb;
  35. s_event_ctx = ctx;
  36. return old_cb;
  37. }
  38. esp_err_t esp_event_send_legacy(system_event_t *event)
  39. {
  40. if (!s_initialized) {
  41. ESP_LOGE(TAG, "system event loop not initialized via esp_event_loop_init");
  42. return ESP_ERR_INVALID_STATE;
  43. }
  44. return esp_event_post(SYSTEM_EVENT, event->event_id, event, sizeof(*event), portMAX_DELAY);
  45. }
  46. esp_err_t esp_event_loop_init(system_event_cb_t cb, void *ctx)
  47. {
  48. if (s_initialized) {
  49. ESP_LOGE(TAG, "system event loop already initialized");
  50. return ESP_ERR_INVALID_STATE;
  51. }
  52. esp_err_t err = esp_event_loop_create_default();
  53. if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) {
  54. return err;
  55. }
  56. err = esp_event_handler_register(SYSTEM_EVENT, ESP_EVENT_ANY_ID, esp_event_post_to_user, NULL);
  57. if (err != ESP_OK) {
  58. return err;
  59. }
  60. s_initialized = true;
  61. s_event_handler_cb = cb;
  62. s_event_ctx = ctx;
  63. return ESP_OK;
  64. }
  65. esp_err_t esp_event_loop_deinit(void)
  66. {
  67. if (!s_initialized) {
  68. ESP_LOGE(TAG, "system event loop not initialized");
  69. return ESP_ERR_INVALID_STATE;
  70. }
  71. esp_err_t err = esp_event_handler_unregister(SYSTEM_EVENT, ESP_EVENT_ANY_ID, esp_event_post_to_user);
  72. if (err != ESP_OK) {
  73. return err;
  74. }
  75. err = esp_event_loop_delete_default();
  76. if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) {
  77. return err;
  78. }
  79. s_initialized = false;
  80. s_event_handler_cb = NULL;
  81. s_event_ctx = NULL;
  82. return ESP_OK;
  83. }