driver.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "kbf/wifi.h"
  2. #include <utility>
  3. #include <memory>
  4. #include <freertos/FreeRTOS.h>
  5. #include <freertos/event_groups.h>
  6. #include <esp_log.h>
  7. #include <esp_err.h>
  8. #include <esp_event.h>
  9. #include <esp_netif.h>
  10. #include <esp_wifi.h>
  11. #include <nvs_flash.h>
  12. #include "kbf/macros.h"
  13. #include "kbf/nvs.h"
  14. using std::shared_ptr;
  15. using namespace kbf::wifi;
  16. static shared_ptr<AP> s_ap = nullptr;
  17. static shared_ptr<STA> s_sta = nullptr;
  18. static bool initialized = false;
  19. static void init() {
  20. if (initialized) return;
  21. CHECK(esp_netif_init());
  22. CHECK(esp_event_loop_create_default());
  23. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  24. auto err = esp_wifi_init(&cfg);
  25. if (err == ESP_ERR_NVS_NOT_INITIALIZED) {
  26. ESP_LOGI(TAG, "NVS not initialized");
  27. kbf::nvs::init();
  28. CHECK(esp_wifi_init(&cfg));
  29. } else {
  30. CHECK(err);
  31. }
  32. initialized = true;
  33. }
  34. void kbf::wifi::start(shared_ptr<AP> ap) {
  35. ESP_LOGI(TAG, "starting AP mode");
  36. init();
  37. s_ap = std::move(ap);
  38. s_ap->netif = esp_netif_create_default_wifi_ap();
  39. s_ap->registerEventHandlers();
  40. wifi_config_t config = {.ap = s_ap->config};
  41. CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
  42. CHECK(esp_wifi_set_config(WIFI_IF_AP, &config));
  43. CHECK(esp_wifi_start());
  44. }
  45. void kbf::wifi::start(shared_ptr<STA> sta) {
  46. ESP_LOGI(TAG, "starting STA mode");
  47. init();
  48. if (sta == nullptr) {
  49. s_sta = STA::create();
  50. } else {
  51. s_sta = std::move(sta);
  52. }
  53. s_sta->netif = esp_netif_create_default_wifi_sta();
  54. s_sta->registerEventHandlers();
  55. wifi_config_t config = {.sta = s_sta->config};
  56. CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
  57. CHECK(esp_wifi_set_config(WIFI_IF_STA, &config));
  58. CHECK(esp_wifi_start());
  59. }
  60. void kbf::wifi::start(shared_ptr<AP>, shared_ptr<STA>) {
  61. ABORT("not implemented");
  62. }
  63. void kbf::wifi::stop() {
  64. CHECK(esp_wifi_stop());
  65. if (s_ap) {
  66. esp_netif_destroy(s_ap->netif);
  67. s_ap = nullptr;
  68. }
  69. if (s_sta) {
  70. esp_netif_destroy(s_sta->netif);
  71. s_sta = nullptr;
  72. }
  73. }
  74. shared_ptr<kbf::wifi::AP> kbf::wifi::getAP() {
  75. return s_ap;
  76. }
  77. shared_ptr<kbf::wifi::STA> kbf::wifi::getSTA() {
  78. return s_sta;
  79. }