Fork of the excellent esp8266-react - https://github.com/rjwats/esp8266-react
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.

99 lines
2.4 KiB

  1. #ifndef APSettingsConfig_h
  2. #define APSettingsConfig_h
  3. #include <HttpEndpoint.h>
  4. #include <FSPersistence.h>
  5. #include <DNSServer.h>
  6. #include <IPAddress.h>
  7. #define MANAGE_NETWORK_DELAY 10000
  8. #define AP_MODE_ALWAYS 0
  9. #define AP_MODE_DISCONNECTED 1
  10. #define AP_MODE_NEVER 2
  11. #define DNS_PORT 53
  12. #ifndef FACTORY_AP_SSID
  13. #define FACTORY_AP_SSID "ESP8266-React"
  14. #endif
  15. #ifndef FACTORY_AP_PASSWORD
  16. #define FACTORY_AP_PASSWORD "esp-react"
  17. #endif
  18. #ifndef FACTORY_AP_PROVISION_MODE
  19. #define FACTORY_AP_PROVISION_MODE AP_MODE_DISCONNECTED
  20. #endif
  21. #define AP_SETTINGS_FILE "/config/apSettings.json"
  22. #define AP_SETTINGS_SERVICE_PATH "/rest/apSettings"
  23. enum APNetworkStatus {
  24. ACTIVE = 0,
  25. INACTIVE,
  26. LINGERING
  27. };
  28. class APSettings {
  29. public:
  30. uint8_t provisionMode;
  31. String ssid;
  32. String password;
  33. static void read(APSettings& settings, JsonObject& root) {
  34. root["provision_mode"] = settings.provisionMode;
  35. root["ssid"] = settings.ssid;
  36. root["password"] = settings.password;
  37. }
  38. static StateUpdateResult update(JsonObject& root, APSettings& settings) {
  39. APSettings newSettings = {};
  40. newSettings.provisionMode = root["provision_mode"] | FACTORY_AP_PROVISION_MODE;
  41. switch (settings.provisionMode) {
  42. case AP_MODE_ALWAYS:
  43. case AP_MODE_DISCONNECTED:
  44. case AP_MODE_NEVER:
  45. break;
  46. default:
  47. newSettings.provisionMode = AP_MODE_ALWAYS;
  48. }
  49. newSettings.ssid = root["ssid"] | FACTORY_AP_SSID;
  50. newSettings.password = root["password"] | FACTORY_AP_PASSWORD;
  51. if (newSettings.provisionMode == settings.provisionMode && newSettings.ssid.equals(settings.ssid) &&
  52. newSettings.password.equals(settings.password)) {
  53. return StateUpdateResult::UNCHANGED;
  54. }
  55. settings = newSettings;
  56. return StateUpdateResult::CHANGED;
  57. }
  58. };
  59. class APSettingsService : public StatefulService<APSettings> {
  60. public:
  61. APSettingsService(AsyncWebServer* server, FS* fs, SecurityManager* securityManager);
  62. void begin();
  63. void loop();
  64. APNetworkStatus getAPNetworkStatus();
  65. private:
  66. HttpEndpoint<APSettings> _httpEndpoint;
  67. FSPersistence<APSettings> _fsPersistence;
  68. // for the captive portal
  69. DNSServer* _dnsServer;
  70. // for the mangement delay loop
  71. volatile unsigned long _lastManaged;
  72. volatile boolean _reconfigureAp;
  73. void reconfigureAP();
  74. void manageAP();
  75. void startAP();
  76. void stopAP();
  77. void handleDNS();
  78. };
  79. #endif // end APSettingsConfig_h