/
ellersseer
/
MyCheat
Обзор
Документация
Войти
/
ellersseer
/
MyCheat
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
2
CI/CD
Аналитика
Безопасность
master
src/sensor_api.cpp
211 строк
6 KB
Dmitry Zhiltsov
feat: Ad version and inject it into api
09 фев 2026, 14:06
09 фев 2026, 14:06
cf1927f
Код
Авторство
О чём код?
#include "sensor_api.h" #include "app_state.h" #include "wifi_manager.h" #include "config.h" #include <ArduinoJson.h> // ============================================ // Thread-Safe Temperature Access // ============================================ bool setTemperature(int sensorIndex, float temp) { if (sensorIndex < 0 || sensorIndex >= NUM_SENSORS) { return false; } SensorCommand_t cmd; cmd.type = SensorCommandType::SET_TEMPERATURE; cmd.sensorIndex = sensorIndex; cmd.temperature = temp; return xQueueSend(sensorCommandQueue, &cmd, pdMS_TO_TICKS(100)) == pdTRUE; } bool setAllTemperatures(float *temps) { SensorCommand_t cmd; cmd.type = SensorCommandType::SET_ALL_TEMPS; memcpy(cmd.allTemperatures, temps, sizeof(float) * NUM_SENSORS); return xQueueSend(sensorCommandQueue, &cmd, pdMS_TO_TICKS(100)) == pdTRUE; } bool setSensorEnabled(int sensorIndex, bool enabled) { if (sensorIndex < 0 || sensorIndex >= NUM_SENSORS) { return false; } SensorCommand_t cmd; cmd.type = enabled ? SensorCommandType::ENABLE_SENSOR : SensorCommandType::DISABLE_SENSOR; cmd.sensorIndex = sensorIndex; return xQueueSend(sensorCommandQueue, &cmd, pdMS_TO_TICKS(100)) == pdTRUE; } float getTemperature(int sensorIndex) { float temp = 0.0f; if (sensorIndex >= 0 && sensorIndex < NUM_SENSORS) { if (xSemaphoreTake(tempMutex, pdMS_TO_TICKS(100)) == pdTRUE) { temp = temperatures[sensorIndex]; xSemaphoreGive(tempMutex); } } return temp; } void getAllTemperatures(float *buffer) { if (xSemaphoreTake(tempMutex, pdMS_TO_TICKS(100)) == pdTRUE) { memcpy(buffer, temperatures, sizeof(float) * NUM_SENSORS); xSemaphoreGive(tempMutex); } } // ============================================ // Sensor Status Helpers // ============================================ const char *sensorStatusToString(SensorStatus status) { switch (status) { case SensorStatus::ACTIVE: return "active"; case SensorStatus::STALE: return "stale"; case SensorStatus::OFF: return "disabled"; default: return "unknown"; } } void formatSensorAddress(int index, char *buffer, size_t bufferSize) { snprintf(buffer, bufferSize, "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", SENSOR_ADDRESSES[index][0], SENSOR_ADDRESSES[index][1], SENSOR_ADDRESSES[index][2], SENSOR_ADDRESSES[index][3], SENSOR_ADDRESSES[index][4], SENSOR_ADDRESSES[index][5], SENSOR_ADDRESSES[index][6], SENSOR_ADDRESSES[index][7]); } // ============================================ // JSON Builders // ============================================ String getStatusJson() { JsonDocument doc; doc["firmware_version"] = FIRMWARE_VERSION; doc["uptime"] = millis() / 1000; doc["wifi_connected"] = wifiManager.isConnected(); doc["wifi_mode"] = wifiManager.getModeString(); doc["wifi_rssi"] = wifiManager.getRSSI(); doc["ip"] = wifiManager.getIP().toString(); doc["mqtt_connected"] = mqttConnected; doc["mqtt_enabled"] = mqttSettings.enabled; doc["num_sensors"] = NUM_SENSORS; doc["onewire_pin"] = ONEWIRE_PIN; doc["free_heap"] = ESP.getFreeHeap(); doc["min_free_heap"] = ESP.getMinFreeHeap(); // FreeRTOS info JsonObject freertos = doc["freertos"].to<JsonObject>(); freertos["tick_rate_hz"] = configTICK_RATE_HZ; freertos["num_tasks"] = uxTaskGetNumberOfTasks(); // Task stack high water marks JsonObject stacks = freertos["stack_hwm"].to<JsonObject>(); if (oneWireTaskHandle) { stacks["onewire"] = uxTaskGetStackHighWaterMark(oneWireTaskHandle); } if (mqttTaskHandle) { stacks["mqtt"] = uxTaskGetStackHighWaterMark(mqttTaskHandle); } // Queue info JsonObject queues = doc["queues"].to<JsonObject>(); queues["temp_cmd_waiting"] = uxQueueMessagesWaiting(sensorCommandQueue); queues["temp_cmd_free"] = uxQueueSpacesAvailable(sensorCommandQueue); // Stats JsonObject statsObj = doc["stats"].to<JsonObject>(); if (xSemaphoreTake(statsMutex, pdMS_TO_TICKS(100)) == pdTRUE) { statsObj["onewire_polls"] = stats.oneWirePolls; statsObj["mqtt_messages"] = stats.mqttMessages; statsObj["web_requests"] = stats.webRequests; statsObj["temp_updates"] = stats.tempUpdates; statsObj["errors"] = stats.errors; xSemaphoreGive(statsMutex); } String output; serializeJson(doc, output); return output; } String getSensorJson(int index) { JsonDocument doc; doc["index"] = index; doc["temperature"] = getTemperature(index); char addrStr[24]; formatSensorAddress(index, addrStr, sizeof(addrStr)); doc["address"] = addrStr; // Add sensor state info doc["enabled"] = sensorStates[index].enabled; doc["status"] = sensorStatusToString(sensorStates[index].status); doc["lastUpdate"] = sensorStates[index].lastUpdateMs; doc["stale"] = (sensorStates[index].status == SensorStatus::STALE); String output; serializeJson(doc, output); return output; } String getAllSensorsJson() { JsonDocument doc; JsonArray sensorsArray = doc["sensors"].to<JsonArray>(); float temps[NUM_SENSORS]; getAllTemperatures(temps); for (int i = 0; i < NUM_SENSORS; i++) { JsonObject sensor = sensorsArray.add<JsonObject>(); sensor["index"] = i; sensor["temperature"] = temps[i]; char addrStr[24]; formatSensorAddress(i, addrStr, sizeof(addrStr)); sensor["address"] = addrStr; // Add sensor state info sensor["enabled"] = sensorStates[i].enabled; sensor["status"] = sensorStatusToString(sensorStates[i].status); sensor["lastUpdate"] = sensorStates[i].lastUpdateMs; sensor["stale"] = (sensorStates[i].status == SensorStatus::STALE); } // Add stale timeout configuration doc["staleTimeoutMinutes"] = sensorSettings.staleTimeoutMinutes; String output; serializeJson(doc, output); return output; }