webserver.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #include <user_config.h>
  2. #include <SmingCore/SmingCore.h>
  3. #include "../include/configuration.h"
  4. #include "webserver.h"
  5. bool serverStarted = false;
  6. HttpServer server;
  7. extern float SensorT, SensorH, SensorHI, SensorCR;
  8. extern String StrCF;
  9. extern time_t NTPLastUpdate;
  10. /*
  11. * Index page.
  12. * Show dht22 data as integer.
  13. */
  14. void onIndex(HttpRequest &request, HttpResponse &response)
  15. {
  16. TemplateFileStream *tmpl = new TemplateFileStream("index.html");
  17. auto &vars = tmpl->variables();
  18. vars["T"] = String(SensorT, 0);
  19. vars["RH"] = String(SensorH, 0);
  20. vars["HI"] = String(SensorHI, 0);
  21. vars["CR"] = String(SensorCR, 0);
  22. vars["CF"] = StrCF; // это первое место, где оно используется
  23. vars["ADC"] = String(system_adc_read());
  24. vars["VDD"] = String(system_get_vdd33());
  25. vars["LASTNTP"] = String(SystemClock.now() - NTPLastUpdate);
  26. response.sendTemplate(tmpl);
  27. }
  28. /*
  29. * Configuration page.
  30. */
  31. void onConfiguration(HttpRequest &request, HttpResponse &response)
  32. {
  33. ClockConfig cfg = loadConfig();
  34. if (request.getRequestMethod() == RequestMethod::POST)
  35. {
  36. // Update config
  37. if (request.getPostParameter("SSID").length() > 0) // Network
  38. {
  39. cfg.NetworkSSID = request.getPostParameter("SSID");
  40. cfg.NetworkPassword = request.getPostParameter("Password");
  41. }
  42. if (request.getPostParameter("TZ").length() > 0) // Correction
  43. {
  44. float tz = request.getPostParameter("TZ").toFloat();
  45. if (cfg.AddTZ != tz)
  46. {
  47. cfg.AddTZ = tz;
  48. SystemClock.setTimeZone(cfg.AddTZ);
  49. if (cfg.AddTZ<0 || cfg.AddTZ>23)
  50. {
  51. cfg.AddTZ = 0;
  52. }
  53. }
  54. }
  55. if (request.getPostParameter("BLow").length() > 0) // Low brightness level.
  56. {
  57. cfg.BrightnessLow = request.getPostParameter("BLow").toInt();
  58. if (cfg.BrightnessLow<0 || cfg.BrightnessLow>15)
  59. {
  60. cfg.BrightnessLow = 0;
  61. }
  62. }
  63. if (request.getPostParameter("BMid").length() > 0) // Middle brightness level.
  64. {
  65. cfg.BrightnessMiddle = request.getPostParameter("BMid").toInt();
  66. if (cfg.BrightnessMiddle<0 || cfg.BrightnessMiddle>15)
  67. {
  68. cfg.BrightnessMiddle = 7;
  69. }
  70. }
  71. if (request.getPostParameter("BHigh").length() > 0) // High brightness level.
  72. {
  73. cfg.BrightnessHigh = request.getPostParameter("BHigh").toInt();
  74. if (cfg.BrightnessHigh<0 || cfg.BrightnessHigh>15)
  75. {
  76. cfg.BrightnessHigh = 15;
  77. }
  78. }
  79. if (request.getPostParameter("LLow").length() > 0) // Low light level trh.
  80. {
  81. cfg.LightTrhLow = request.getPostParameter("LLow").toInt();
  82. if (cfg.LightTrhLow<0 || cfg.LightTrhLow>1023)
  83. {
  84. cfg.LightTrhLow = 0;
  85. }
  86. }
  87. if (request.getPostParameter("LHigh").length() > 0) // High light level trh.
  88. {
  89. cfg.LightTrhHigh = request.getPostParameter("LHigh").toInt();
  90. if (cfg.LightTrhHigh<0 || cfg.LightTrhHigh>1023)
  91. {
  92. cfg.LightTrhHigh = 1023;
  93. }
  94. }
  95. saveConfig(cfg);
  96. response.redirect();
  97. }
  98. TemplateFileStream *tmpl = new TemplateFileStream("config.html");
  99. auto &vars = tmpl->variables();
  100. vars["SSID"] = cfg.NetworkSSID;
  101. vars["TZ"] = String(cfg.AddTZ, 2);
  102. vars["LLow"] = String(cfg.LightTrhLow);
  103. vars["LHigh"] = String(cfg.LightTrhHigh);
  104. vars["BLow"] = String(cfg.BrightnessLow);
  105. vars["BMid"] = String(cfg.BrightnessMiddle);
  106. vars["BHigh"] = String(cfg.BrightnessHigh);
  107. response.sendTemplate(tmpl);
  108. }
  109. /*
  110. * роутер
  111. */
  112. void onFile(HttpRequest &request, HttpResponse &response)
  113. {
  114. String file = request.getPath();
  115. if (file[0] == '/')
  116. file = file.substring(1);
  117. if (file[0] == '.')
  118. response.forbidden();
  119. else
  120. {
  121. response.setCache(86400, true); // It's important to use cache for better performance.
  122. response.sendFile(file);
  123. }
  124. }
  125. /// API ///
  126. /*
  127. * API page.
  128. */
  129. void onApiDoc(HttpRequest &request, HttpResponse &response)
  130. {
  131. TemplateFileStream *tmpl = new TemplateFileStream("api.html");
  132. auto &vars = tmpl->variables();
  133. vars["IP"] = (WifiStation.isConnected() ? WifiStation.getIP() : WifiAccessPoint.getIP()).toString();
  134. response.sendTemplate(tmpl);
  135. }
  136. /*
  137. * Get json data
  138. * данные с датчиков выдаём с максимальным разрешением.
  139. */
  140. void onApiSensors(HttpRequest &request, HttpResponse &response)
  141. {
  142. JsonObjectStream* stream = new JsonObjectStream();
  143. JsonObject& json = stream->getRoot();
  144. json["status"] = (bool)true;
  145. JsonObject& sensors = json.createNestedObject("sensors");
  146. sensors["temperature"] = String(SensorT, 2);
  147. sensors["humidity"] = String(SensorH, 2);
  148. sensors["heatindex"] = String(SensorHI, 2);
  149. sensors["comfortp"] = String(SensorCR, 2);
  150. sensors["comforts"] = StrCF.c_str(); // второе место
  151. sensors["adcvalue"] = String(system_adc_read());
  152. sensors["vddvalue"] = String(system_get_vdd33());
  153. time_t now = SystemClock.now();
  154. sensors["datetime"] = String(now);
  155. sensors["lastntp"] = String(now - NTPLastUpdate);
  156. response.sendJsonObject(stream);
  157. }
  158. /*
  159. * Управление выводом. кандидат на удаление.
  160. */
  161. void onApiOutput(HttpRequest &request, HttpResponse &response)
  162. {
  163. int val = request.getQueryParameter("control", "-1").toInt();
  164. if (val == 0 || val == 1)
  165. digitalWrite(CONTROL_PIN, val == 1);
  166. else
  167. val = -1;
  168. JsonObjectStream* stream = new JsonObjectStream();
  169. JsonObject& json = stream->getRoot();
  170. json["status"] = val != -1;
  171. if (val == -1) json["error"] = "Wrong control parameter value, please use: ?control=0|1";
  172. response.sendJsonObject(stream);
  173. }
  174. void startWebServer()
  175. {
  176. if (serverStarted) return;
  177. server.listen(80);
  178. server.addPath("/", onIndex);
  179. server.addPath("/api", onApiDoc);
  180. server.addPath("/api/sensors", onApiSensors);
  181. server.addPath("/api/output", onApiOutput);
  182. server.addPath("/config", onConfiguration);
  183. server.setDefaultHandler(onFile);
  184. serverStarted = true;
  185. /*
  186. if (WifiStation.isEnabled())
  187. debugf("STA: %s", WifiStation.getIP().toString().c_str());
  188. if (WifiAccessPoint.isEnabled())
  189. debugf("AP: %s", WifiAccessPoint.getIP().toString().c_str());
  190. */
  191. }