JXCT Soil Sensor 7-in-1 v3.4.9 (June 2025)
Professional IoT soil monitoring system with ESP32, Modbus RTU, MQTT, and advanced compensation algorithms
Загрузка...
Поиск...
Не найдено
routes_calibration.cpp
См. документацию.
1#include "web_routes.h"
3#include "logger.h"
4#include "jxct_ui_system.h"
5#include "validation_utils.h"
7#include <vector>
8#include <LittleFS.h>
9
10// Экземпляр веб-сервера объявлен во внешнем модуле
11extern WebServer webServer;
12
13// ------------------------------
14// HTML генераторы (простой MVP)
15// ------------------------------
16
18{
19 String html;
20 html += generatePageHeader("Калибровка", UI_ICON_CALIBRATION);
21
22 html += "<div class='container'>";
23 html += navHtml();
24 html += "<h1>⚙️ Калибровка датчика</h1>";
25 html += "<p>Здесь вы сможете выполнить калибровку датчика и настроить компенсацию показаний.";
26 html += " В этой версии доступен выбор профиля почвы и загрузка калибровочных таблиц (CSV).</p>";
27
28 // Форма выбора профиля почвы
29 html += "<form action='/calibration/save' method='post' enctype='multipart/form-data'>";
30 html += "<div class='section'><h2>Профиль почвы</h2>";
31 html += "<div class='form-group'><label for='soil_profile'>Тип почвы:</label><select id='soil_profile' name='soil_profile'>";
32 html += "<option value='sand'>Песок</option>";
33 html += "<option value='sandpeat'>Песчано-торфяной</option>";
34 html += "<option value='loam'>Суглинок</option>";
35 html += "<option value='peat'>Торф</option>";
36 html += "<option value='clay'>Глина</option>";
37 html += "</select></div></div>";
38
39 // Загрузка CSV файла
40 html += "<div class='section'><h2>Калибровочная таблица";
41 // Статусы профилей
47 html += " <span style='font-size:14px;color:#888'>(";
48 html += "Песок:" + String(hasSand?"✅":"❌") + ", ";
49 html += "Песч.-торф:" + String(hasSandPeat?"✅":"❌") + ", ";
50 html += "Суглинок:" + String(hasLoam?"✅":"❌") + ", ";
51 html += "Глина:" + String(hasClay?"✅":"❌") + ", ";
52 html += "Торф:" + String(hasPeat?"✅":"❌") + ")</span></h2>";
53 html += "<div class='form-group'><label for='calibration_csv'>Файл CSV:</label><input type='file' id='calibration_csv' name='calibration_csv' accept='.csv' required></div></div>";
54
55 html += generateButton(ButtonType::PRIMARY, UI_ICON_SAVE, "Сохранить", "");
56 html += "</form>";
57
58 html += "</div>";
59
60 html += generatePageFooter();
61 return html;
62}
63
64// ------------------------------
65// Обработчики маршрутов
66// ------------------------------
67
69{
70 String html = generateCalibrationPage();
71 if (webServer.hasArg("ok"))
72 {
73 html.replace("<div class='container'>", "<div class='container'><div class='msg msg-success'>✅ Калибровочная таблица сохранена</div>");
74 }
75 webServer.send(200, "text/html; charset=utf-8", html);
76}
77
78// Буфер для загрузки файлов
79static File uploadFile;
81
83{
84 HTTPUpload& upload = webServer.upload();
85 if (upload.status == UPLOAD_FILE_START)
86 {
87 // Получаем профиль почвы из аргумента формы
88 String profileStr = webServer.arg("soil_profile");
89 if (profileStr == "sand") uploadProfile = SoilProfile::SAND;
90 else if (profileStr == "sandpeat") uploadProfile = SoilProfile::SANDPEAT;
91 else if (profileStr == "loam") uploadProfile = SoilProfile::LOAM;
92 else if (profileStr == "peat") uploadProfile = SoilProfile::PEAT;
93 else if (profileStr == "clay") uploadProfile = SoilProfile::CLAY;
94
97 uploadFile = LittleFS.open(path, "w");
98 if (!uploadFile)
99 {
100 logError("Не удалось создать файл %s", path);
101 }
102 }
103 else if (upload.status == UPLOAD_FILE_WRITE)
104 {
105 if (uploadFile)
106 {
107 uploadFile.write(upload.buf, upload.currentSize);
108 }
109 }
110 else if (upload.status == UPLOAD_FILE_END)
111 {
112 if (uploadFile)
113 {
114 uploadFile.close();
115 logSuccess("Файл калибровки загружен (%u байт)", upload.totalSize);
116 }
117 webServer.sendHeader("Location", "/calibration?ok=1", true);
118 webServer.send(302, "text/plain", "Redirect");
119 }
120}
121
122// ------------------------------
123// Основная функция
124// ------------------------------
125
127{
128 logInfo("Маршруты калибровки инициализированы");
130
131 webServer.on("/calibration", HTTP_GET, handleCalibrationPage);
132 webServer.on("/calibration/save", HTTP_POST, []() {
133 // Пустой ack, фактическая обработка в uploadHandler
135}
String generateButton(ButtonType type, const char *icon, const char *text, const char *action)
Определения jxct_ui_system.cpp:286
#define UI_ICON_CALIBRATION
Определения jxct_ui_system.h:60
#define UI_ICON_SAVE
Определения jxct_ui_system.h:42
@ PRIMARY
Определения jxct_ui_system.h:65
void logSuccess(const char *format,...)
Определения logger.cpp:129
void logError(const char *format,...)
Определения logger.cpp:61
void logInfo(const char *format,...)
Определения logger.cpp:95
Система логгирования с красивым форматированием
bool hasTable(SoilProfile profile)
Определения calibration_manager.cpp:94
const char * profileToFilename(SoilProfile)
Определения calibration_manager.cpp:9
bool init()
Определения calibration_manager.cpp:14
static SoilProfile uploadProfile
Определения routes_calibration.cpp:80
static void handleCalibrationPage()
Определения routes_calibration.cpp:68
WebServer webServer
void setupCalibrationRoutes()
Настройка маршрутов калибровки (/calibration)
Определения routes_calibration.cpp:126
static File uploadFile
Определения routes_calibration.cpp:79
static void handleCalibrationUpload()
Определения routes_calibration.cpp:82
static String generateCalibrationPage()
Определения routes_calibration.cpp:17
String navHtml()
Определения wifi_manager.cpp:82
Алгоритмы коррекции показаний датчиков
SoilProfile
Определения sensor_compensation.h:14
@ LOAM
Определения sensor_compensation.h:16
@ CLAY
Определения sensor_compensation.h:18
@ PEAT
Определения sensor_compensation.h:17
@ SANDPEAT
Определения sensor_compensation.h:19
@ SAND
Определения sensor_compensation.h:15
Заголовочный файл утилит валидации
String generatePageHeader(const String &title, const String &icon)
Генерация заголовка HTML страницы
Определения web_templates.cpp:8
String generatePageFooter()
Генерация футера HTML страницы
Определения web_templates.cpp:19