settings_controller.cpp 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "pairing_service/settings_controller.h"
  2. #include <esp_log.h>
  3. #include <kbf.h>
  4. #include <kbf/rtos.h>
  5. #include <kbf/wifi.h>
  6. #include "tasks/display_manager.h"
  7. using namespace kbf;
  8. SettingsController::SettingsController() : Controller("/settings") {}
  9. static bool validate(const nlohmann::json &json) {
  10. if (json == nullptr) {
  11. ESP_LOGE(SettingsController::TAG, "json is null");
  12. return false;
  13. } else if (json.find("ssid") == json.end()) {
  14. ESP_LOGE(SettingsController::TAG, "no SSID");
  15. return false;
  16. } else if (json.find("password") == json.end()) {
  17. ESP_LOGE(SettingsController::TAG, "no password");
  18. return false;
  19. }
  20. return true;
  21. }
  22. static rtos::EventGroup eventGroup;
  23. enum ConnectStatus {
  24. DISCONNECTED,
  25. GOT_IP
  26. };
  27. static bool connect(const string &ssid, const string &password) {
  28. static const char *TAG = "SettingsController::connect";
  29. ESP_LOGI(TAG, "connect(\"%s\", ...)", ssid.c_str());
  30. ESP_LOGD(TAG, "credentials: %s; %s", ssid.c_str(), password.c_str());
  31. eventGroup.clear();
  32. wifi::sta::start();
  33. wifi::sta::onDisconnect = {[]() { eventGroup.setBit(DISCONNECTED); }};
  34. wifi::sta::onIp = {[]() { eventGroup.setBit(GOT_IP); }};
  35. wifi::sta::connect(ssid, password, true, CONFIG_DK_PAIRING_WIFI_MAX_RETRY);
  36. eventGroup.waitForAny({DISCONNECTED, GOT_IP}, CONFIG_DK_PAIRING_WIFI_TIMEOUT);
  37. if (eventGroup.getBit(GOT_IP)) {
  38. ESP_LOGI(TAG, "connection successful");
  39. return true;
  40. }
  41. if (eventGroup.getBit(DISCONNECTED)) {
  42. ESP_LOGW(TAG, "connection failed");
  43. return false;
  44. }
  45. ESP_LOGW(TAG, "connection timeout");
  46. return false;
  47. }
  48. http::Response SettingsController::get(const kbf::http::Request &request) {
  49. auto wifiConfig = dk::settings::wifi();
  50. auto response = nlohmann::json({
  51. {"ssid", wifiConfig.ssid},
  52. {"password", wifiConfig.password}
  53. });
  54. return http::Response(response);
  55. }
  56. http::Response SettingsController::post(const kbf::http::Request &request) {
  57. auto json = request.json();
  58. if (!validate(json)) return http::Response("", 500);
  59. auto ssid = json.find("ssid")->get<string>();
  60. auto password = json.find("password")->get<string>();
  61. DisplayManager::setMessage("SSID " + ssid);
  62. if (!connect(ssid, password)) {
  63. ESP_LOGW(TAG, "unable to connect to SSID: %s", ssid.c_str());
  64. DisplayManager::setMessage("connect failed", 1000);
  65. // TODO set pairing mode
  66. // dk::mainEventGroup->setBit(dk::MainEvents::SET_PAIRING_MODE); // TODO is this OK?
  67. return http::Response(nlohmann::json({{"success", false}}));
  68. }
  69. dk::settings::Wifi wifiConfig = {
  70. .ssid = ssid,
  71. .password = password,
  72. };
  73. dk::settings::setWifi(wifiConfig);
  74. DisplayManager::setMessage("connected");
  75. return http::Response(nlohmann::json({{"success", true}}));
  76. }