webserver.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include <SmingCore.h>
  2. #include "configuration.h"
  3. bool serverStarted = false;
  4. HttpServer server;
  5. extern float SensorT, SensorH, SensorHI, SensorCR;
  6. extern String StrCF;
  7. extern time_t NTPLastUpdate;
  8. void onIndex(HttpRequest& request, HttpResponse& response)
  9. {
  10. TemplateFileStream* tmpl = new TemplateFileStream("index.html");
  11. auto& vars = tmpl->variables();
  12. vars["T"] = String(SensorT, 0);
  13. vars["RH"] = String(SensorH, 0);
  14. vars["HI"] = String(SensorHI, 0);
  15. vars["CR"] = String(SensorCR, 0);
  16. vars["CF"] = StrCF; // это первое место, где оно используется
  17. vars["ADC"] = String(system_adc_read ());
  18. vars["VDD"] = String(system_get_vdd33 ());
  19. vars["LASTNTP"] = String (SystemClock.now () - NTPLastUpdate);
  20. response.sendNamedStream(tmpl);
  21. }
  22. void onConfiguration(HttpRequest& request, HttpResponse& response)
  23. {
  24. ClockConfig cfg = loadConfig();
  25. if(request.method == HTTP_POST) {
  26. debugf("Update config");
  27. // Update config
  28. // Network
  29. if(request.getPostParameter("SSID").length() > 0)
  30. {
  31. cfg.NetworkSSID = request.getPostParameter("SSID");
  32. cfg.NetworkPassword = request.getPostParameter("Password");
  33. }
  34. // Correction
  35. if(request.getPostParameter("TZ").length() > 0) {
  36. float tz = request.getPostParameter("TZ").toFloat();
  37. if (cfg.AddTZ != tz) {
  38. cfg.AddTZ = tz;
  39. if (cfg.AddTZ < 0 || cfg.AddTZ > 23) {
  40. cfg.AddTZ = 0;
  41. }
  42. SystemClock.setTimeZone(cfg.AddTZ);
  43. }
  44. }
  45. // Low brightness level.
  46. if (request.getPostParameter ("BLow").length () > 0) {
  47. cfg.BrightnessLow = request.getPostParameter ("BLow").toInt ();
  48. if (cfg.BrightnessLow < LedBrightMin || cfg.BrightnessLow > LedBrightMax) {
  49. cfg.BrightnessLow = LedBrightMin;
  50. }
  51. }
  52. // Middle brightness level.
  53. if (request.getPostParameter ("BMid").length () > 0) {
  54. cfg.BrightnessMiddle = request.getPostParameter ("BMid").toInt ();
  55. if (cfg.BrightnessMiddle < LedBrightMin || cfg.BrightnessMiddle > LedBrightMax) {
  56. cfg.BrightnessMiddle = LedBrightMiddl;
  57. }
  58. }
  59. // High brightness level.
  60. if (request.getPostParameter ("BHigh").length () > 0) {
  61. cfg.BrightnessHigh = request.getPostParameter ("BHigh").toInt ();
  62. if (cfg.BrightnessHigh < LedBrightMin || cfg.BrightnessHigh > LedBrightMax) {
  63. cfg.BrightnessHigh = LedBrightMax;
  64. }
  65. }
  66. // Low light level trh.
  67. if (request.getPostParameter ("LLow").length () > 0) {
  68. cfg.LightTrhLow = request.getPostParameter ("LLow").toInt ();
  69. if (cfg.LightTrhLow < MinLightThreshold || cfg.LightTrhLow > MaxLightThreshold) {
  70. cfg.LightTrhLow = MinLightThreshold;
  71. }
  72. }
  73. // High light level trh.
  74. if (request.getPostParameter ("LHigh").length () > 0) {
  75. cfg.LightTrhHigh = request.getPostParameter ("LHigh").toInt ();
  76. if (cfg.LightTrhHigh < MinLightThreshold || cfg.LightTrhHigh > MaxLightThreshold) {
  77. cfg.LightTrhHigh = MaxLightThreshold;
  78. }
  79. }
  80. saveConfig(cfg);
  81. response.headers[HTTP_HEADER_LOCATION] = "/";
  82. }
  83. debugf("Send template");
  84. TemplateFileStream* tmpl = new TemplateFileStream("config.html");
  85. auto& vars = tmpl->variables();
  86. vars["SSID"] = cfg.NetworkSSID;
  87. vars["TZ"] = String(cfg.AddTZ, 2);
  88. vars["LLow"] = String(cfg.LightTrhLow);
  89. vars["LHigh"] = String(cfg.LightTrhHigh);
  90. vars["BLow"] = String(cfg.BrightnessLow);
  91. vars["BMid"] = String(cfg.BrightnessMiddle);
  92. vars["BHigh"] = String(cfg.BrightnessHigh);
  93. response.sendNamedStream(tmpl);
  94. }
  95. /**
  96. * @brief Router
  97. */
  98. void onFile(HttpRequest& request, HttpResponse& response)
  99. {
  100. String file = request.uri.getRelativePath();
  101. if(file[0] == '.')
  102. response.code = HTTP_STATUS_FORBIDDEN;
  103. else {
  104. response.setCache(86400, true); // It's important to use cache for better performance.
  105. response.sendFile(file);
  106. }
  107. }
  108. /// API ///
  109. void onApiDoc(HttpRequest& request, HttpResponse& response)
  110. {
  111. TemplateFileStream* tmpl = new TemplateFileStream("api.html");
  112. auto& vars = tmpl->variables();
  113. vars["IP"] = (WifiStation.isConnected() ? WifiStation.getIP() : WifiAccessPoint.getIP()).toString();
  114. response.sendNamedStream(tmpl);
  115. }
  116. /**
  117. * @brief Get json data
  118. * данные с датчиков выдаём с максимальным разрешением.
  119. */
  120. void onApiSensors(HttpRequest& request, HttpResponse& response)
  121. {
  122. JsonObjectStream* stream = new JsonObjectStream();
  123. JsonObject json = stream->getRoot();
  124. json["status"] = (bool)true;
  125. JsonObject sensors = json.createNestedObject("sensors");
  126. sensors["temperature"] = String(SensorT, 2);
  127. sensors["humidity"] = String(SensorH, 2);
  128. sensors["heatindex"] = String(SensorHI, 2);
  129. sensors["comfortp"] = String(SensorCR, 2);
  130. sensors["comforts"] = StrCF.c_str (); //??? второе место
  131. sensors["adcvalue"] = String(system_adc_read ());
  132. sensors["vddvalue"] = String(system_get_vdd33 ());
  133. time_t now = SystemClock.now();
  134. sensors["datetime"] = String(now);
  135. sensors["lastntp"] = String(now - NTPLastUpdate);
  136. response.sendDataStream(stream, MIME_JSON);
  137. }
  138. void startWebServer()
  139. {
  140. if(serverStarted)
  141. return;
  142. server.listen(80);
  143. server.paths.set("/", onIndex);
  144. server.paths.set("/api", onApiDoc);
  145. server.paths.set("/api/sensors", onApiSensors);
  146. server.paths.set("/config", onConfiguration);
  147. server.paths.setDefault(onFile);
  148. serverStarted = true;
  149. if(WifiStation.isEnabled())
  150. debugf("STA: %s", WifiStation.getIP().toString().c_str());
  151. if(WifiAccessPoint.isEnabled())
  152. debugf("AP: %s", WifiAccessPoint.getIP().toString().c_str());
  153. }