webserver.cpp 5.7 KB

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