├── screenshot_main.jpg ├── connection_diagram.jpg ├── photo device ├── IMG_20251104_110615.jpg └── IMG_20251104_110639.jpg ├── Руководство пользователя Makita BMS Tool.docx ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json └── c_cpp_properties.json ├── platformio.ini ├── lib └── OneWireMakita │ ├── OneWireMakita.h │ └── OneWireMakita.cpp ├── LICENSE ├── USER_GUIDE.md ├── README.md ├── src ├── MakitaBMS.h ├── main.cpp └── MakitaBMS.cpp └── data ├── index.html ├── style.css └── app.js /screenshot_main.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Belik1982/esp32-makita-bms-reader/HEAD/screenshot_main.jpg -------------------------------------------------------------------------------- /connection_diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Belik1982/esp32-makita-bms-reader/HEAD/connection_diagram.jpg -------------------------------------------------------------------------------- /photo device/IMG_20251104_110615.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Belik1982/esp32-makita-bms-reader/HEAD/photo device/IMG_20251104_110615.jpg -------------------------------------------------------------------------------- /photo device/IMG_20251104_110639.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Belik1982/esp32-makita-bms-reader/HEAD/photo device/IMG_20251104_110639.jpg -------------------------------------------------------------------------------- /Руководство пользователя Makita BMS Tool.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Belik1982/esp32-makita-bms-reader/HEAD/Руководство пользователя Makita BMS Tool.docx -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # PlatformIO 2 | .pio/ 3 | /env/ 4 | 5 | # Build files (firmware) 6 | *.bin 7 | *.elf 8 | *.hex 9 | 10 | # SPIFFS (временные файлы) 11 | /spiffs_image/ 12 | 13 | # Arduino IDE specific 14 | .arduino/ 15 | *.ino.hex 16 | *.ino.bin 17 | 18 | # macOS / Windows temporary files 19 | .DS_Store 20 | Thumbs.db -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "platformio.platformio-ide" 6 | ], 7 | "unwantedRecommendations": [ 8 | "ms-vscode.cpptools-extension-pack" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /platformio.ini: -------------------------------------------------------------------------------- 1 | ; platformio.ini - Финальная конфигурация 2 | 3 | [env:esp32-c3-devkitm-1] 4 | platform = espressif32 5 | board = esp32-c3-devkitm-1 6 | framework = arduino 7 | monitor_speed = 115200 8 | 9 | ; Включаем файловую систему SPIFFS 10 | board_build.filesystem = spiffs 11 | lib_ldf_mode = deep+ 12 | 13 | ; Библиотеки для веб-сервера, WebSockets и JSON 14 | lib_deps = 15 | bblanchon/ArduinoJson@^6.21.3 16 | esphome/ESPAsyncWebServer-esphome@^3.1.0 17 | esphome/AsyncTCP-esphome@^2.0.0 18 | 19 | ; Флаги сборки для USB и стандарта C++14 20 | build_flags = 21 | -DARDUINO_USB_MODE=1 22 | -DARDUINO_USB_CDC_ON_BOOT=1 23 | -std=c++14 -------------------------------------------------------------------------------- /lib/OneWireMakita/OneWireMakita.h: -------------------------------------------------------------------------------- 1 | // lib/OneWireMakita/OneWireMakita.h 2 | 3 | #ifndef OneWireMakita_h 4 | #define OneWireMakita_h 5 | 6 | #include 7 | 8 | // Класс для реализации модифицированного протокола OneWire для Makita 9 | class OneWireMakita 10 | { 11 | private: 12 | gpio_num_t _pin; // Номер GPIO пина, используемого для шины 13 | 14 | public: 15 | // Конструктор, принимает номер пина 16 | OneWireMakita(uint8_t pin); 17 | 18 | // Выполняет сброс шины и ждет ответа (импульса присутствия) 19 | bool reset(void); 20 | 21 | // Отправляет один байт данных на шину 22 | void write(uint8_t v); 23 | 24 | // Читает один байт данных с шины 25 | uint8_t read(void); 26 | }; 27 | 28 | #endif -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [2025] [Belik1982] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // AUTOMATICALLY GENERATED FILE. PLEASE DO NOT MODIFY IT MANUALLY 2 | // 3 | // PlatformIO Debugging Solution 4 | // 5 | // Documentation: https://docs.platformio.org/en/latest/plus/debugging.html 6 | // Configuration: https://docs.platformio.org/en/latest/projectconf/sections/env/options/debug/index.html 7 | 8 | { 9 | "version": "0.2.0", 10 | "configurations": [ 11 | { 12 | "type": "platformio-debug", 13 | "request": "launch", 14 | "name": "PIO Debug", 15 | "executable": "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/.pio/build/esp32-c3-devkitm-1/firmware.elf", 16 | "projectEnvName": "esp32-c3-devkitm-1", 17 | "toolchainBinDir": "C:/Users/Admin/.platformio/packages/toolchain-riscv32-esp/bin", 18 | "internalConsoleOptions": "openOnSessionStart", 19 | "preLaunchTask": { 20 | "type": "PlatformIO", 21 | "task": "Pre-Debug" 22 | } 23 | }, 24 | { 25 | "type": "platformio-debug", 26 | "request": "launch", 27 | "name": "PIO Debug (skip Pre-Debug)", 28 | "executable": "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/.pio/build/esp32-c3-devkitm-1/firmware.elf", 29 | "projectEnvName": "esp32-c3-devkitm-1", 30 | "toolchainBinDir": "C:/Users/Admin/.platformio/packages/toolchain-riscv32-esp/bin", 31 | "internalConsoleOptions": "openOnSessionStart" 32 | }, 33 | { 34 | "type": "platformio-debug", 35 | "request": "launch", 36 | "name": "PIO Debug (without uploading)", 37 | "executable": "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/.pio/build/esp32-c3-devkitm-1/firmware.elf", 38 | "projectEnvName": "esp32-c3-devkitm-1", 39 | "toolchainBinDir": "C:/Users/Admin/.platformio/packages/toolchain-riscv32-esp/bin", 40 | "internalConsoleOptions": "openOnSessionStart", 41 | "loadMode": "manual" 42 | } 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /USER_GUIDE.md: -------------------------------------------------------------------------------- 1 | # Руководство Пользователя 2 | 3 | ## 1. Первое включение и подключение 4 | 5 | 1. **Подключите аккумулятор Makita** к диагностическому устройству. 6 | 2. **Подайте питание** на само устройство (через USB-порт ESP32). 7 | 3. **Возьмите ваш смартфон или ноутбук** и откройте список доступных Wi-Fi сетей. 8 | 4. Найдите и подключитесь к сети с названием **`OpenMakita-ESP`**. Пароль не требуется. 9 | 5. После подключения к этой сети на вашем устройстве может автоматически открыться страница авторизации. Если этого не произошло, откройте браузер и перейдите по адресу **`http://192.168.4.1`**. 10 | 11 | ## 2. Использование веб-интерфейса 12 | 13 | Вы увидите главный экран программы. 14 | 15 | ### Шаг 1: Чтение информации о батарее 16 | 17 | * Нажмите большую синюю кнопку **"1. Считать Инфо"**. 18 | * Устройство определит модель вашей батареи и покажет основную информацию: циклы заряда, дату производства и т.д. 19 | * После этого станут активны другие кнопки. 20 | 21 | ### Шаг 2: Просмотр данных в реальном времени 22 | 23 | * Под таблицей с основной информацией появится **графическая схема вашей батареи**. 24 | * Каждый прямоугольник — это одна ячейка. Внутри него указано ее точное напряжение. 25 | * **Цвет ячейки** показывает ее состояние: 26 | * **Зеленый:** Ячейка полностью заряжена (близко к 4.2В). 27 | * **Желтый/Салатовый:** Нормальное рабочее напряжение. 28 | * **Красный:** Ячейка сильно разряжена (близко к 2.8В). 29 | * Под схемой отображается **общее напряжение** всей сборки и **уровень заряда в процентах (SOC)**. 30 | * Для обновления этих данных нажмите кнопку **"2. Обновить данные"**. 31 | 32 | ### Шаг 3: Диагностика и предупреждения 33 | 34 | * **Дисбаланс:** Если одна из ячеек на схеме выделена **серым цветом и пунктирной линией**, это значит, что она значительно отстает от других. Под схемой появится **желтое предупреждение** о необходимости балансировки. 35 | * **Критический разряд:** Если напряжение ячейки упадет слишком низко, под схемой появится **красное предупреждение** о том, что элемент, возможно, неисправен. 36 | * **Ограниченная поддержка:** Для некоторых моделей батарей (например, с контроллером F0513) сервисные функции недоступны. В этом случае вы увидите **синее информационное сообщение** об этом, а кнопки "Тест LED" и "Очистить ошибки" останутся неактивными. 37 | 38 | ### Шаг 4: Сервисные функции (для поддерживаемых батарей) 39 | 40 | * **"Очистить ошибки"**: Нажмите эту кнопку, если в таблице "Код статуса" отображается ошибка, чтобы попытаться сбросить ее. 41 | * **"Тест LED"**: Нажмите эту кнопку, чтобы включить светодиоды на корпусе аккумулятора. Повторное нажатие выключит их. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Диагностика аккумуляторов Makita на ESP32 с веб-интерфейсом 2 | 3 | ![Фото вашего устройства](screenshot_main.jpg) 4 | 5 | Этот проект представляет собой автономное устройство на базе ESP32 для полной диагностики Li-ion аккумуляторов Makita LXT. Устройство создает веб-сервер, доступ к которому можно получить с любого смартфона или компьютера по Wi-Fi для просмотра напряжений ячеек, температуры, циклов заряда и выполнения сервисных функций. 6 | 7 | ## Ключевые возможности 8 | 9 | * **Полная совместимость:** Поддерживаются как стандартные контроллеры, так и более редкие F0513. 10 | * **Интерактивный Веб-интерфейс:** Адаптивный дизайн для мобильных и десктопных устройств. 11 | * **Визуализация в реальном времени:** Графическое отображение сборки аккумулятора с цветовой индикацией состояния каждой ячейки. 12 | * **Расчет SOC:** Автоматический расчет уровня заряда (State of Charge) на основе среднего напряжения. 13 | * **Сервисные функции:** Возможность запускать тест светодиодов и сбрасывать ошибки BMS (для поддерживаемых моделей). 14 | * **Мультиязычность:** Поддержка русского и украинского языков. 15 | 16 | ## Аппаратные компоненты 17 | 18 | * Микроконтроллер **ESP32** (любая модель, например, Wemos D1 Mini ESP32 или NodeMCU-32S). 19 | * NPN-транзистор **2SD882** (или аналог, например, BC547, но D882 предпочтительнее для надежности). 20 | * Резистор **1 кОм** (для базы транзистора). 21 | * Резистор **4.7 кОм** (подтягивающий резистор, рекомендуется для совместимости со старыми батареями номинал подбирать до уверенного просыпания батареи 2,2кОм а то и ниже). 22 | * Коннектор для подключения к аккумулятору Makita. 23 | 24 | ## Схема подключения 25 | ![Принципиальная схема подключения](connection_diagram.jpg) 26 | 27 | *Схема реализована на транзисторном ключе для согласования логических уровней 3.3В (ESP32) и 5В (BMS).* 28 | 29 | * **Пин `Enable` батареи** -> к **Коллектору** транзистора. 30 | * **Коллектор** транзистора -> через резистор **4.7 кОм** -> к **+5В** на ESP32. 31 | * **База** транзистора -> через резистор **1 кОм** -> к управляющему **GPIO пину** на ESP32. 32 | * **Эмиттер** транзистора -> к **GND**. 33 | * **Пин данных (Data)** батареи -> к **GPIO пину** на ESP32. 34 | 35 | ## Прошивка 36 | 37 | Проект разработан в среде PlatformIO. 38 | 1. Откройте проект в VS Code с установленным плагином PlatformIO. 39 | 2. Подключите ESP32 к компьютеру. 40 | 3. Нажмите `PlatformIO: Upload and Monitor` для компиляции, прошивки и запуска монитора порта. 41 | 42 | ## Лицензия 43 | 44 | Проект распространяется под лицензией MIT. См. файл `LICENSE` для подробностей. 45 | -------------------------------------------------------------------------------- /src/MakitaBMS.h: -------------------------------------------------------------------------------- 1 | // src/MakitaBMS.h - ФИНАЛЬНАЯ ВЕРСИЯ 2 | 3 | #ifndef MAKITA_BMS_H 4 | #define MAKITA_BMS_H 5 | 6 | #include 7 | #include 8 | #include "OneWireMakita.h" 9 | 10 | // Определяем уровни логирования для более гибкой отладки 11 | enum LogLevel { 12 | LOG_LEVEL_NONE, // Ничего не выводить 13 | LOG_LEVEL_INFO, // Только основные события и ошибки 14 | LOG_LEVEL_DEBUG // Детальный вывод с HEX-дампами 15 | }; 16 | 17 | // Определяем тип для функции обратного вызова (callback), которая будет отправлять логи 18 | using LogCallback = std::function; 19 | 20 | // Структура для хранения ЧИСТЫХ данных 21 | struct BatteryData { 22 | String model = "N/A"; 23 | int charge_cycles = 0; 24 | String lock_status = "N/A"; 25 | String status_code = "00"; 26 | float pack_voltage = 0.0; 27 | float cell_voltages[5] = {0.0}; 28 | float cell_diff = 0.0; 29 | float temp1 = 0.0, temp2 = 0.0; 30 | String mfg_date = "N/A"; 31 | String capacity = "N/A", battery_type = ""; 32 | String rom_id = ""; 33 | }; 34 | 35 | // Структура для хранения информации о том, какие функции поддерживает данный аккумулятор 36 | struct SupportedFeatures { 37 | bool read_dynamic = false; 38 | bool led_test = false; 39 | bool clear_errors = false; 40 | }; 41 | 42 | // Основной класс, инкапсулирующий всю логику работы с BMS 43 | class MakitaBMS { 44 | public: 45 | MakitaBMS(uint8_t onewire_pin, uint8_t enable_pin); 46 | void setLogCallback(LogCallback callback); 47 | void setLogLevel(LogLevel level); 48 | 49 | bool isPresent(); 50 | String readStaticData(BatteryData &data, SupportedFeatures &features); 51 | String readDynamicData(BatteryData &data); 52 | String ledTest(bool on); 53 | String clearErrors(); 54 | String resetMessage(); 55 | 56 | private: 57 | OneWireMakita makita; 58 | uint8_t _enable_pin; 59 | String _controller_type = "UNKNOWN"; 60 | bool _is_identified = false; 61 | LogCallback _log; 62 | LogLevel _logLevel = LOG_LEVEL_DEBUG; 63 | 64 | 65 | 66 | byte _response_buf[64]; 67 | void sendCmd(const byte* cmd_data, int len); 68 | bool readResponse(int len); 69 | 70 | void cmd_and_read_33(const byte* cmd, uint8_t cmd_len, byte* rsp, uint8_t rsp_len); 71 | void cmd_and_read_cc(const byte* cmd, uint8_t cmd_len, byte* rsp, uint8_t rsp_len); 72 | 73 | byte nibble_swap(byte b); 74 | String getModel(); 75 | String getF0513Model(); 76 | 77 | void logger(const String& message, LogLevel level); 78 | void log_hex(const String& prefix, const byte* data, int len); 79 | }; 80 | 81 | #endif -------------------------------------------------------------------------------- /lib/OneWireMakita/OneWireMakita.cpp: -------------------------------------------------------------------------------- 1 | // lib/OneWireMakita/OneWireMakita.cpp 2 | 3 | #include "OneWireMakita.h" 4 | 5 | // Мьютекс для защиты критических секций от прерываний FreeRTOS, 6 | // чтобы гарантировать точность таймингов. 7 | static portMUX_TYPE oneWireMux = portMUX_INITIALIZER_UNLOCKED; 8 | 9 | // Конструктор класса 10 | OneWireMakita::OneWireMakita(uint8_t pin) { 11 | _pin = (gpio_num_t)pin; 12 | // Настраиваем пин в режим "Open Drain" ОДИН РАЗ. 13 | // Это самый эффективный и правильный способ для реализации протоколов с одной шиной. 14 | // digitalWrite(HIGH) "отпускает" шину, позволяя подтягивающему резистору поднять ее. 15 | // digitalWrite(LOW) активно притягивает шину к земле. 16 | pinMode(_pin, OUTPUT_OPEN_DRAIN); 17 | digitalWrite(_pin, HIGH); // Начальное состояние - шина свободна 18 | } 19 | 20 | // Реализация сброса шины 21 | bool OneWireMakita::reset(void) { 22 | digitalWrite(_pin, HIGH); 23 | pinMode(_pin, INPUT); // Временно переключаем на вход, чтобы проверить, не занята ли шина 24 | uint8_t retries = 125; 25 | do { 26 | if (--retries == 0) return false; 27 | delayMicroseconds(2); 28 | } while (digitalRead(_pin) == LOW); 29 | 30 | pinMode(_pin, OUTPUT_OPEN_DRAIN); // Возвращаем в рабочий режим 31 | 32 | portENTER_CRITICAL(&oneWireMux); 33 | digitalWrite(_pin, LOW); // Отправляем импульс сброса 34 | portEXIT_CRITICAL(&oneWireMux); 35 | 36 | delayMicroseconds(750); // Длительность импульса сброса 37 | 38 | portENTER_CRITICAL(&oneWireMux); 39 | digitalWrite(_pin, HIGH); // Отпускаем шину 40 | delayMicroseconds(70); // Ждем, пока BMS ответит 41 | uint8_t r = !digitalRead(_pin); // Читаем импульс присутствия (линия должна быть притянута к земле) 42 | portEXIT_CRITICAL(&oneWireMux); 43 | 44 | delayMicroseconds(410); // Оставшееся время слота 45 | return r; 46 | } 47 | 48 | // Реализация записи байта (побитово) 49 | void OneWireMakita::write(uint8_t v) { 50 | for (uint8_t bitMask = 0x01; bitMask; bitMask <<= 1) { 51 | portENTER_CRITICAL(&oneWireMux); 52 | if ((bitMask & v)) { // Запись '1' 53 | digitalWrite(_pin, LOW); delayMicroseconds(12); 54 | digitalWrite(_pin, HIGH); 55 | portEXIT_CRITICAL(&oneWireMux); 56 | delayMicroseconds(120); 57 | } else { // Запись '0' 58 | digitalWrite(_pin, LOW); delayMicroseconds(100); 59 | digitalWrite(_pin, HIGH); 60 | portEXIT_CRITICAL(&oneWireMux); 61 | delayMicroseconds(30); 62 | } 63 | } 64 | } 65 | 66 | // Реализация чтения байта (побитово) 67 | uint8_t OneWireMakita::read() { 68 | uint8_t r = 0; 69 | for (uint8_t bitMask = 0x01; bitMask; bitMask <<= 1) { 70 | portENTER_CRITICAL(&oneWireMux); 71 | digitalWrite(_pin, LOW); delayMicroseconds(10); 72 | digitalWrite(_pin, HIGH); delayMicroseconds(10); 73 | if (digitalRead(_pin)) { 74 | r |= bitMask; 75 | } 76 | portEXIT_CRITICAL(&oneWireMux); 77 | delayMicroseconds(53); 78 | } 79 | return r; 80 | } -------------------------------------------------------------------------------- /data/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | OpenMakita ESP 7 | 8 | 9 | 10 |
11 |
12 | 13 |
14 |
OpenMakita ESP
15 |
Диагностика батареи
16 |
17 |
18 |
19 |
20 | 21 | 22 | 23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | 31 | 32 |
33 |
34 |
35 |
36 | 37 | 38 |
39 |
40 |
41 |
42 |
Identify model and read static data
43 |
Read voltages and temperatures
44 |
45 |
46 | 47 |
48 |
49 |
50 | 51 | 52 |
53 |
54 |
55 |
56 |
Reset BMS errors
57 |
Turn on/off battery LEDs
58 |
59 |
60 |
61 |
62 | 63 |
64 | 65 | 83 | 84 |
85 | Log 86 |
Initializing...
87 |
88 |
89 |
90 |
Интерфейс: UA / RU — Переключить в верхнем меню. Версия: ESP-OBI Web UI
91 |
92 | 93 | 94 | -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | // src/main.cpp - ФИНАЛЬНАЯ ВЕРСИЯ 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "FS.h" 9 | #include "SPIFFS.h" 10 | #include "MakitaBMS.h" 11 | 12 | // --- Настройки и глобальные объекты --- 13 | #define ONEWIRE_PIN 4 14 | #define ENABLE_PIN 1 15 | const char* ssid = "Makita_BMS_Tool"; 16 | DNSServer dnsServer; 17 | AsyncWebServer server(80); 18 | AsyncWebSocket ws("/ws"); 19 | MakitaBMS bms(ONEWIRE_PIN, ENABLE_PIN); 20 | 21 | // Глобальный кеш для данных, чтобы не терять статику при запросе динамики 22 | static BatteryData cached_data; 23 | 24 | // --- Функции для отправки сообщений клиентам через WebSocket --- 25 | 26 | void sendJsonResponse(const String& type, const BatteryData& data, const SupportedFeatures* features) { 27 | if (ws.count() == 0) return; 28 | DynamicJsonDocument doc(2048); 29 | doc["type"] = type; 30 | 31 | JsonObject dataObj = doc.createNestedObject("data"); 32 | dataObj["model"] = data.model; 33 | dataObj["charge_cycles"] = data.charge_cycles; 34 | dataObj["lock_status"] = data.lock_status; 35 | dataObj["status_code"] = data.status_code; 36 | dataObj["mfg_date"] = data.mfg_date; 37 | dataObj["capacity"] = data.capacity; 38 | dataObj["battery_type"] = data.battery_type; 39 | dataObj["pack_voltage"] = data.pack_voltage; 40 | JsonArray cellV = dataObj.createNestedArray("cell_voltages"); 41 | for(int i=0; i<5; i++) cellV.add(data.cell_voltages[i]); 42 | dataObj["cell_diff"] = data.cell_diff; 43 | dataObj["temp1"] = data.temp1; 44 | dataObj["temp2"] = data.temp2; 45 | dataObj["rom_id"] = data.rom_id; 46 | 47 | if (features) { 48 | JsonObject featuresObj = doc.createNestedObject("features"); 49 | featuresObj["read_dynamic"] = features->read_dynamic; 50 | featuresObj["led_test"] = features->led_test; 51 | featuresObj["clear_errors"] = features->clear_errors; 52 | } 53 | 54 | String output; 55 | serializeJson(doc, output); 56 | ws.textAll(output); 57 | } 58 | 59 | void sendFeedback(const String& type, const String& message) { 60 | if (ws.count() == 0) return; 61 | DynamicJsonDocument doc(512); 62 | doc["type"] = type; 63 | doc["message"] = message; 64 | String output; 65 | serializeJson(doc, output); 66 | ws.textAll(output); 67 | } 68 | 69 | void sendPresence(bool is_present) { 70 | if (ws.count() == 0) return; 71 | DynamicJsonDocument doc(64); 72 | doc["type"] = "presence"; 73 | doc["present"] = is_present; 74 | String output; 75 | serializeJson(doc, output); 76 | ws.textAll(output); 77 | } 78 | 79 | void logToClients(const String& message, LogLevel level) { 80 | Serial.println(message); 81 | String prefix = (level == LOG_LEVEL_DEBUG) ? "[DBG] " : ""; 82 | sendFeedback("debug", prefix + message); 83 | } 84 | 85 | void onWebSocketEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { 86 | if (type == WS_EVT_CONNECT) { 87 | Serial.printf("WS client #%u connected\n", client->id()); 88 | sendPresence(bms.isPresent()); 89 | } else if (type == WS_EVT_DISCONNECT) { 90 | Serial.printf("WS client #%u disconnected\n", client->id()); 91 | } else if (type == WS_EVT_DATA) { 92 | DynamicJsonDocument doc(256); 93 | if (deserializeJson(doc, (char*)data) != DeserializationError::Ok) return; 94 | 95 | String command = doc["command"]; 96 | String error_msg; 97 | 98 | if (command == "presence") { 99 | sendPresence(bms.isPresent()); 100 | } else if (command == "read_static") { 101 | BatteryData fresh_data; 102 | SupportedFeatures fresh_features; 103 | error_msg = bms.readStaticData(fresh_data, fresh_features); 104 | if (error_msg == "") { 105 | cached_data = fresh_data; 106 | sendJsonResponse("static_data", cached_data, &fresh_features); 107 | sendPresence(true); 108 | } else { 109 | sendFeedback("error", error_msg); 110 | } 111 | } else if (command == "read_dynamic") { 112 | error_msg = bms.readDynamicData(cached_data); 113 | if (error_msg == "") { 114 | sendJsonResponse("dynamic_data", cached_data, nullptr); 115 | } else { 116 | sendFeedback("error", error_msg); 117 | } 118 | } else if (command == "led_on") { 119 | error_msg = bms.ledTest(true); 120 | if (error_msg == "") sendFeedback("success", "LEDs ON command sent."); 121 | else sendFeedback("error", error_msg); 122 | } else if (command == "led_off") { 123 | error_msg = bms.ledTest(false); 124 | if (error_msg == "") sendFeedback("success", "LEDs OFF command sent."); 125 | else sendFeedback("error", error_msg); 126 | } else if (command == "clear_errors") { 127 | error_msg = bms.clearErrors(); 128 | if (error_msg == "") sendFeedback("success", "Clear Errors command sent."); 129 | else sendFeedback("error", error_msg); 130 | } else if (command == "set_logging") { 131 | bool enabled = doc["enabled"]; 132 | bms.setLogLevel(enabled ? LOG_LEVEL_DEBUG : LOG_LEVEL_INFO); 133 | logToClients(String("Log level set to ") + (enabled ? "DEBUG" : "INFO"), LOG_LEVEL_INFO); 134 | } 135 | } 136 | } 137 | 138 | class CaptiveRequestHandler : public AsyncWebHandler { 139 | public: 140 | CaptiveRequestHandler() {} 141 | virtual ~CaptiveRequestHandler() {} 142 | bool canHandle(AsyncWebServerRequest *request){ return true; } 143 | void handleRequest(AsyncWebServerRequest *request) { 144 | request->send(SPIFFS, "/index.html", "text/html"); 145 | } 146 | }; 147 | 148 | void setup() { 149 | Serial.begin(115200); 150 | Serial.println("\nStarting Makita BMS Tool..."); 151 | 152 | if(!SPIFFS.begin(true)){ 153 | Serial.println("An Error has occurred while mounting SPIFFS"); 154 | return; 155 | } 156 | Serial.println("SPIFFS mounted successfully."); 157 | 158 | bms.setLogCallback(logToClients); 159 | 160 | WiFi.softAP(ssid); 161 | Serial.print("Access Point '"); 162 | Serial.print(ssid); 163 | Serial.print("' started at IP: "); 164 | Serial.println(WiFi.softAPIP()); 165 | 166 | ws.onEvent(onWebSocketEvent); 167 | server.addHandler(&ws); 168 | 169 | server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html"); 170 | 171 | dnsServer.start(53, "*", WiFi.softAPIP()); 172 | server.addHandler(new CaptiveRequestHandler()); 173 | 174 | server.begin(); 175 | Serial.println("HTTP server with WebSocket is ready."); 176 | } 177 | 178 | void loop() { 179 | dnsServer.processNextRequest(); 180 | } -------------------------------------------------------------------------------- /src/MakitaBMS.cpp: -------------------------------------------------------------------------------- 1 | // src/MakitaBMS.cpp - ИСПРАВЛЕННАЯ ВЕРСИЯ 2 | 3 | #include "MakitaBMS.h" 4 | 5 | // Конструктор: Просто настраиваем пин, питание по умолчанию ВЫКЛЮЧЕНО 6 | MakitaBMS::MakitaBMS(uint8_t onewire_pin, uint8_t enable_pin) 7 | : makita(onewire_pin), _enable_pin(enable_pin) { 8 | pinMode(_enable_pin, OUTPUT); 9 | digitalWrite(_enable_pin, HIGH); // HIGH = ВЫКЛ через NPN-транзистор 10 | } 11 | 12 | // Вспомогательные функции (без изменений) 13 | void MakitaBMS::setLogCallback(LogCallback callback) { _log = callback; } 14 | void MakitaBMS::setLogLevel(LogLevel level) { _logLevel = level; } 15 | void MakitaBMS::logger(const String& message, LogLevel level) { if (_log && level <= _logLevel) _log(message, level); } 16 | void MakitaBMS::log_hex(const String& prefix, const byte* data, int len) { if (_logLevel < LOG_LEVEL_DEBUG) return; String hex_str = prefix; if (data && len > 0) for (int i = 0; i < len; i++) { char buf[4]; sprintf(buf, "%02X ", data[i]); hex_str += buf; } logger(hex_str, LOG_LEVEL_DEBUG); } 17 | void MakitaBMS::cmd_and_read_cc(const byte* cmd, uint8_t cmd_len, byte* rsp, uint8_t rsp_len) { makita.reset(); delayMicroseconds(400); makita.write(0xcc); log_hex(">> CC (payload): ", cmd, cmd_len); if (cmd != nullptr) for (int i = 0; i < cmd_len; i++) { makita.write(cmd[i]); delayMicroseconds(90); } if (rsp != nullptr) for (int i = 0; i < rsp_len; i++) { rsp[i] = makita.read(); delayMicroseconds(90); } log_hex("<< CC (response): ", rsp, rsp_len); } 18 | byte MakitaBMS::nibble_swap(byte b) { return (b >> 4) | (b << 4); } 19 | void MakitaBMS::cmd_and_read_33(const byte* cmd, uint8_t cmd_len, byte* rsp, uint8_t rsp_len) { 20 | makita.reset(); 21 | delayMicroseconds(400); 22 | makita.write(0x33); 23 | log_hex(">> 33 (payload): ", cmd, cmd_len); 24 | byte initial_read[8]; 25 | for (int i = 0; i < 8; i++) { initial_read[i] = makita.read(); delayMicroseconds(90); } 26 | log_hex("<< 33 (initial 8 bytes): ", initial_read, 8); 27 | for (int i = 0; i < cmd_len; i++) { makita.write(cmd[i]); delayMicroseconds(90); } 28 | for (int i = 0; i < rsp_len; i++) { rsp[i] = makita.read(); delayMicroseconds(90); } 29 | log_hex("<< 33 (response): ", rsp, rsp_len); 30 | } 31 | 32 | bool MakitaBMS::isPresent() { 33 | digitalWrite(_enable_pin, LOW); // Включаем (NPN: LOW=ON) 34 | delay(400); 35 | bool present = makita.reset(); 36 | digitalWrite(_enable_pin, HIGH); // Выключаем (NPN: HIGH=OFF) 37 | logger(String("Battery presence check: ") + (present ? "Present" : "Not Present"), LOG_LEVEL_INFO); 38 | return present; 39 | } 40 | 41 | String MakitaBMS::readStaticData(BatteryData &data, SupportedFeatures &features) { 42 | logger("--- Reading Static Data ---", LOG_LEVEL_INFO); 43 | _is_identified = false; 44 | 45 | digitalWrite(_enable_pin, LOW); // ВКЛЮЧАЕМ ПИТАНИЕ В НАЧАЛЕ ОПЕРАЦИИ (NPN: LOW=ON) 46 | delay(400); 47 | 48 | // --- Оригинальный, рабочий протокол --- 49 | const byte read_cmd[] = {0xAA, 0x00}; 50 | byte response[40]; 51 | makita.reset(); delayMicroseconds(400); makita.write(0x33); 52 | log_hex(">> 33 (payload): ", read_cmd, sizeof(read_cmd)); 53 | byte initial_read[8]; for (int i = 0; i < 8; i++) { initial_read[i] = makita.read(); delayMicroseconds(90); } 54 | log_hex("<< 33 (initial 8 bytes): ", initial_read, 8); 55 | for (int i = 0; i < sizeof(read_cmd); i++) { makita.write(read_cmd[i]); delayMicroseconds(90); } 56 | byte remaining_response[32]; for (int i = 0; i < 32; i++) { remaining_response[i] = makita.read(); delayMicroseconds(90); } 57 | memcpy(response, initial_read, 8); 58 | memcpy(response + 8, remaining_response, 32); 59 | log_hex("<< 33 (full response): ", response, 40); 60 | 61 | // --- Оригинальный, рабочий парсинг --- 62 | byte b1 = nibble_swap(response[35]); byte b2 = nibble_swap(response[34]); 63 | data.charge_cycles = ((b2 << 8) | b1) & 0x0FFF; 64 | data.lock_status = (response[28] & 0x0F) > 0 ? "LOCKED" : "UNLOCKED"; 65 | char buf[12]; sprintf(buf, "%02X", response[27]); data.status_code = String(buf); 66 | sprintf(buf, "%02d/%02d/20%02d", response[2], response[1], response[0]); data.mfg_date = String(buf); 67 | data.capacity = String(nibble_swap(response[24]) / 10.0f, 1) + "Ah"; 68 | data.battery_type = String(nibble_swap(response[19])); 69 | String rom_str; for(int i = 0; i < 8; i++) { char rom_buf[4]; sprintf(rom_buf, "%02X ", response[i]); rom_str += rom_buf; } 70 | data.rom_id = rom_str; 71 | 72 | _controller_type = "UNKNOWN"; 73 | String model_str = getModel(); 74 | if (model_str != "") { _controller_type = "STANDARD"; data.model = model_str; } 75 | else { model_str = getF0513Model(); if (model_str != "") { _controller_type = "F0513"; data.model = model_str; } } 76 | 77 | if (_controller_type == "UNKNOWN") { 78 | digitalWrite(_enable_pin, HIGH); // (NPN: HIGH=OFF) 79 | return "Battery connected, but model is not supported."; 80 | } 81 | 82 | _is_identified = true; 83 | features.read_dynamic = true; 84 | if (_controller_type == "STANDARD") { features.led_test = true; features.clear_errors = true; } 85 | logger("Static data parsed successfully.", LOG_LEVEL_INFO); 86 | digitalWrite(_enable_pin, HIGH); // ВЫКЛЮЧАЕМ ПИТАНИЕ В КОНЦЕ ОПЕРАЦИИ (NPN: HIGH=OFF) 87 | return ""; 88 | } 89 | 90 | // ==================================================================== 91 | // === ИЗМЕНЕНИЯ НАЧИНАЮТСЯ ЗДЕСЬ === 92 | // ==================================================================== 93 | 94 | String MakitaBMS::readDynamicData(BatteryData &data) { 95 | if (!_is_identified) return "First read battery info to determine model."; 96 | logger("--- Reading Dynamic Data ---", LOG_LEVEL_INFO); 97 | 98 | // Выключаем питание по умолчанию перед выбором алгоритма 99 | digitalWrite(_enable_pin, HIGH); // (NPN: HIGH=OFF) 100 | 101 | if (_controller_type == "STANDARD") { 102 | // --- Логика STANDARD (нетронутая) --- 103 | // Включаем питание ОДИН РАЗ 104 | digitalWrite(_enable_pin, LOW); // (NPN: LOW=ON) 105 | delay(400); 106 | 107 | byte response[29]; 108 | cmd_and_read_cc((const byte[]){0xD7, 0x00, 0x00, 0xFF}, 4, response, sizeof(response)); 109 | data.pack_voltage = ((response[1] << 8) | response[0]) / 1000.0f; 110 | float min_v=5.0, max_v=0.0; 111 | for(int i=0; i<5; i++) { 112 | float v=((response[i*2+3]<<8)|response[i*2+2])/1000.0f; 113 | data.cell_voltages[i]=v; 114 | if (v>0.5 && vmax_v) max_v=v; 116 | } 117 | data.cell_diff = (max_v > min_v) ? (max_v - min_v) : 0.0; 118 | data.temp1 = ((response[15] << 8) | response[14]) / 100.0f; 119 | data.temp2 = ((response[17] << 8) | response[16]) / 100.0f; 120 | 121 | // Выключаем питание 122 | digitalWrite(_enable_pin, HIGH); // (NPN: HIGH=OFF) 123 | 124 | } else if (_controller_type == "F0513") { 125 | // --- Новая логика F0513 (с циклом питания на каждый запрос) --- 126 | 127 | const byte clear_cmd[] = {0xF0, 0x00}; 128 | byte response[2]; 129 | float v[5]; 130 | float t_v = 0; 131 | 132 | // Вспомогательная lambda-функция для выполнения ОДНОЙ команды F0513 133 | // с полным циклом питания (ВКЛ -> КОМАНДА -> ВЫКЛ) 134 | auto exec_f0513_cmd = [&](const byte* cmd, uint8_t cmd_len, byte* rsp, uint8_t rsp_len) { 135 | digitalWrite(_enable_pin, LOW); // (NPN: LOW=ON) 136 | delay(400); 137 | 138 | cmd_and_read_cc(cmd, cmd_len, rsp, rsp_len); 139 | 140 | digitalWrite(_enable_pin, HIGH); // (NPN: HIGH=OFF) 141 | delay(50); // Небольшая пауза между циклами для стабилизации 142 | }; 143 | 144 | // Выполняем каждую команду через эту обертку 145 | exec_f0513_cmd(clear_cmd, sizeof(clear_cmd), nullptr, 0); 146 | exec_f0513_cmd(clear_cmd, sizeof(clear_cmd), nullptr, 0); 147 | 148 | exec_f0513_cmd((const byte[]){0x31}, 1, response, 2); v[0]=((response[1]<<8)|response[0])/1000.0f; 149 | exec_f0513_cmd((const byte[]){0x32}, 1, response, 2); v[1]=((response[1]<<8)|response[0])/1000.0f; 150 | exec_f0513_cmd((const byte[]){0x33}, 1, response, 2); v[2]=((response[1]<<8)|response[0])/1000.0f; 151 | exec_f0513_cmd((const byte[]){0x34}, 1, response, 2); v[3]=((response[1]<<8)|response[0])/1000.0f; 152 | exec_f0513_cmd((const byte[]){0x35}, 1, response, 2); v[4]=((response[1]<<8)|response[0])/1000.0f; 153 | exec_f0513_cmd((const byte[]){0x52}, 1, response, 2); data.temp1=((response[1]<<8)|response[0])/100.0f; 154 | 155 | data.temp2 = 0; 156 | float min_v=5.0, max_v=0.0; 157 | for(int i=0; i<5; i++) { 158 | data.cell_voltages[i]=v[i]; 159 | t_v+=v[i]; 160 | if(v[i]>0.5 && v[i]max_v) max_v=v[i]; 162 | } 163 | data.pack_voltage = t_v; 164 | data.cell_diff = (max_v > 0.5 && max_v > min_v) ? (max_v - min_v) : 0.0; 165 | } 166 | 167 | logger("Dynamic data parsed successfully.", LOG_LEVEL_INFO); 168 | // Питание уже выключено в каждой ветке 169 | return ""; 170 | } 171 | 172 | // ==================================================================== 173 | // === ИЗМЕНЕНИЯ ЗАКАНЧИВАЮТСЯ ЗДЕСЬ === 174 | // ==================================================================== 175 | 176 | 177 | String MakitaBMS::getModel() { 178 | byte response[16]; 179 | cmd_and_read_cc((const byte[]){0xDC, 0x0C}, 2, response, sizeof(response)); 180 | if (response[0] == 0xFF || response[0] == 0x00) return ""; 181 | char model_str[8]; memcpy(model_str, response, 7); model_str[7] = '\0'; 182 | return String(model_str).c_str(); 183 | } 184 | 185 | String MakitaBMS::getF0513Model() { 186 | cmd_and_read_cc((const byte[]){0x99}, 1, nullptr, 0); delay(100); 187 | makita.reset(); delayMicroseconds(400); makita.write(0x31); 188 | byte response[2]; 189 | delayMicroseconds(90); response[0] = makita.read(); 190 | delayMicroseconds(90); response[1] = makita.read(); 191 | const byte clear_cmd[] = {0xF0, 0x00}; 192 | cmd_and_read_cc(clear_cmd, sizeof(clear_cmd), nullptr, 0); 193 | if (response[0] == 0xFF && response[1] == 0xFF) return ""; 194 | char model_buf[7]; 195 | sprintf(model_buf, "BL%02X%02X", response[1], response[0]); 196 | return String(model_buf); 197 | } 198 | 199 | String MakitaBMS::ledTest(bool on) { 200 | if (!_is_identified || _controller_type != "STANDARD") return "Function not available."; 201 | digitalWrite(_enable_pin, LOW); // (NPN: LOW=ON) 202 | delay(400); 203 | byte b[9]; 204 | const byte t[]={0xD9,0x96,0xA5}; cmd_and_read_33(t,sizeof(t),b,sizeof(b)); 205 | const byte l[]={0xDA,(byte)(on?0x31:0x34)}; cmd_and_read_33(l,sizeof(l),b,sizeof(b)); 206 | digitalWrite(_enable_pin, HIGH); // (NPN: HIGH=OFF) 207 | return ""; 208 | } 209 | String MakitaBMS::clearErrors() { 210 | if (!_is_identified || _controller_type != "STANDARD") return "Function not available."; 211 | digitalWrite(_enable_pin, LOW); // (NPN: LOW=ON) 212 | delay(400); 213 | byte b[9]; 214 | const byte t[]={0xD9,0x96,0xA5}; cmd_and_read_33(t,sizeof(t),b,sizeof(b)); 215 | const byte c[]={0xDA,0x04}; cmd_and_read_33(c,sizeof(c),b,sizeof(b)); 216 | digitalWrite(_enable_pin, HIGH); // (NPN: HIGH=OFF) 217 | return ""; 218 | } 219 | String MakitaBMS::resetMessage() { return "This feature is currently under development."; } -------------------------------------------------------------------------------- /data/style.css: -------------------------------------------------------------------------------- 1 | /* data/style.css - ИСПРАВЛЕННАЯ ВЕРСИЯ (СЖАТИЕ V2 + ФИКС 0V ВИЗУАЛИЗАЦИИ) */ 2 | 3 | :root{ 4 | --bg: #f4f6f9; --card: #ffffff; --muted: #6b6b6b; --primary: #1976d2; 5 | --warn: #d32f2f; --success: #2e7d32; --radius: 12px; --cell-gap: 12px; 6 | --ui-font: "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; 7 | --crit-low: #ff0000; 8 | --gap-v-min: 4px; /* НОВЫЙ минимальный вертикальный отступ */ 9 | } 10 | *{box-sizing:border-box} 11 | html,body{height:100%} 12 | body{ 13 | margin:0; font-family:var(--ui-font); background:var(--bg); color:#111; 14 | -webkit-font-smoothing:antialiased; font-size:16px; 15 | } 16 | 17 | /* --- СЖАТЫЙ TOPBAR --- */ 18 | .topbar{ 19 | display: flex; 20 | flex-wrap: wrap; 21 | justify-content: space-between; 22 | align-items: center; 23 | padding: 8px 12px; 24 | background: #fff; 25 | box-shadow: 0 2px 4px rgba(0,0,0,0.05); 26 | gap: 12px; 27 | } 28 | .header-left{ 29 | display:flex; 30 | align-items:center; 31 | gap:8px; 32 | flex-grow: 1; 33 | } 34 | .header-right{ 35 | display:flex; 36 | align-items:center; 37 | gap:12px; 38 | flex-shrink: 0; 39 | } 40 | .header-status { 41 | width: 100%; 42 | order: 3; 43 | background: #f3f6fa; 44 | border-radius: 8px; 45 | padding: 6px 8px; 46 | text-align: center; 47 | font-weight: 600; 48 | font-size: 14px; 49 | } 50 | .logo{font-size:24px;} 51 | .title-block{display:flex;flex-direction:column;} 52 | .title{font-weight:600;font-size:16px;} 53 | .subtitle{font-size:11px;color:var(--muted)} 54 | .lang-block{ display:flex; gap: 2px; background:#f3f6fa; border-radius:8px; padding: 4px; } 55 | .lang{ 56 | border-radius:6px; padding:4px 8px; border:none; background:transparent; 57 | cursor:pointer; font-size:14px; 58 | } 59 | .lang.active{background:var(--primary); color:white; font-weight:600} 60 | 61 | .btn-refresh{ display: none !important; } 62 | 63 | .container{max-width:980px;margin:12px auto;padding:0 10px} 64 | .card{ 65 | background:var(--card); border-radius:var(--radius); padding:12px; 66 | margin-bottom:12px; box-shadow:0 2px 8px rgba(30,50,80,0.04); 67 | } 68 | .card.small{padding:8px} 69 | .card-header{ 70 | display:flex; justify-content:space-between; align-items:center; 71 | margin-bottom:8px; gap:8px; 72 | } 73 | .card-header h2, .card-header h3{ margin:0; font-size:18px; font-weight:600; } 74 | 75 | /* --- УМЕНЬШЕНИЕ ОТСТУПОВ МЕЖДУ СТРОКАМИ КНОПОК --- */ 76 | .actions-grid { 77 | display: flex; 78 | flex-direction: column; 79 | gap: var(--gap-v-min); /* ИСПОЛЬЗУЕМ МИНИМАЛЬНЫЙ ОТСТУП */ 80 | width: 100%; 81 | } 82 | .service-actions-block { 83 | display: flex; 84 | flex-direction: column; 85 | gap: var(--gap-v-min); 86 | width: 100%; 87 | margin-top: var(--gap-v-min); /* Дополнительный отступ для отделения блоков */ 88 | } 89 | .button-row { 90 | display: flex; 91 | justify-content: center; 92 | width: 100%; 93 | gap: 12px; 94 | } 95 | .button-pair { 96 | display: grid; 97 | grid-template-columns: 1fr 1fr; 98 | gap: 12px; 99 | width: 100%; 100 | max-width: 400px; 101 | } 102 | .hint-row { 103 | display: flex; 104 | justify-content: center; 105 | width: 100%; 106 | } 107 | .hint-pair { 108 | display: grid; 109 | grid-template-columns: 1fr 1fr; 110 | gap: 12px; 111 | width: 100%; 112 | max-width: 400px; 113 | } 114 | .big{ 115 | min-height: 38px; /* СЖАТИЕ V2: Дальнейшее сжатие высоты кнопки */ 116 | padding: 6px 12px; /* СЖАТИЕ V2: Уменьшен padding */ 117 | border-radius: 8px; 118 | border: none; 119 | font-weight: 600; 120 | font-size: 14px; 121 | cursor: pointer; 122 | display: flex; 123 | align-items: center; 124 | justify-content: center; 125 | text-align: center; 126 | line-height: 1.2; 127 | transition: background-color 0.2s, filter 0.2s; 128 | width: 100%; 129 | } 130 | .big:hover:not(:disabled){filter:brightness(0.95)} 131 | .big:disabled { background-color: #e0e0e0; color: #9e9e9e; cursor: not-allowed; } 132 | .btn-data { background-color: var(--primary); color: white; } 133 | .btn-service { background-color: var(--warn); color: white; } 134 | .btn-func { background-color: var(--success); color: white; } 135 | .btn-hint { 136 | font-size: 10px; /* СЖАТИЕ V2: Уменьшен шрифт подсказки */ 137 | color: var(--muted); 138 | text-align: center; 139 | min-height: 2.2em; /* СЖАТИЕ V2: Дальнейшее сжатие высоты */ 140 | line-height: 1.2; 141 | display: flex; 142 | align-items: center; 143 | justify-content: center; 144 | padding: 0 4px; 145 | } 146 | 147 | /* --- Стили для Спиннера --- */ 148 | .spinner { 149 | border: 3px solid rgba(255, 255, 255, 0.3); 150 | border-top: 3px solid #fff; 151 | border-radius: 50%; 152 | width: 16px; 153 | height: 16px; 154 | animation: spin 1s linear infinite; 155 | display: inline-block; 156 | margin-right: 8px; 157 | flex-shrink: 0; 158 | } 159 | @keyframes spin { 160 | 0% { transform: rotate(0deg); } 161 | 100% { transform: rotate(360deg); } 162 | } 163 | /* -------------------------- */ 164 | 165 | .kv { display: flex; flex-direction: column; gap: 6px; } 166 | .kv-row { 167 | display: flex; justify-content: space-between; align-items: baseline; 168 | border-bottom: 1px solid #f0f0f0; padding-bottom: 6px; 169 | font-size: 15px; 170 | } 171 | .kv-row:last-child { border-bottom: none; } 172 | .k { color: var(--muted); flex-shrink: 0; margin-right: 16px; } 173 | .v { font-weight: 600; text-align: right; word-break: break-all; } 174 | 175 | /* --- Стили для Бэйджей --- */ 176 | .badge { 177 | padding: 3px 8px; 178 | border-radius: 12px; 179 | font-size: 13px; 180 | font-weight: 700; 181 | color: white; 182 | text-transform: uppercase; 183 | line-height: 1; 184 | display: inline-block; 185 | } 186 | .badge-danger { background-color: var(--warn); } 187 | .badge-success { background-color: var(--success); } 188 | /* -------------------------- */ 189 | 190 | /* --- СЖАТИЕ И ПОДЪЕМ КОНТУРА БАТАРЕИ --- */ 191 | .battery-container { 192 | display: flex; 193 | flex-direction: column; 194 | align-items: center; 195 | margin: 10px auto 4px; /* СЖАТИЕ V2: ПОДНЯТ ВЫШЕ (10px) и СЖАТ СНИЗУ (4px) */ 196 | max-width: 500px; 197 | } 198 | .battery-pack { 199 | display: flex; 200 | flex-direction: column; 201 | gap: 4px; 202 | padding: 12px; /* СЖАТИЕ V2: Сильное сжатие контура */ 203 | background-color: #f0f2f5; 204 | border-radius: 10px; 205 | width: 100%; 206 | } 207 | .battery-cells { 208 | display: flex; 209 | justify-content: center; 210 | gap: var(--cell-gap); 211 | position: relative; 212 | width: 100%; 213 | } 214 | .battery-numbers { 215 | display: flex; 216 | justify-content: center; 217 | gap: var(--cell-gap); 218 | width: 100%; 219 | } 220 | .cell-container { 221 | position: relative; 222 | z-index: 1; 223 | display: flex; 224 | flex-direction: column; 225 | align-items: center; 226 | width: 65px; 227 | } 228 | .cell-number { 229 | width: 65px; 230 | text-align: center; 231 | font-weight: bold; 232 | font-size: 14px; 233 | color: #333; 234 | height: 20px; 235 | display: flex; 236 | align-items: center; 237 | justify-content: center; 238 | } 239 | .battery-connectors { 240 | position: absolute; 241 | top: 0; left: 0; right: 0; bottom: 0; 242 | pointer-events: none; 243 | z-index: 0; 244 | } 245 | .connector { 246 | position: absolute; 247 | background: #555; 248 | height: 4px; 249 | border-radius: 2px; 250 | z-index: 0; 251 | } 252 | .cell-gfx { 253 | width: 65px; 254 | height: 100px; 255 | border: 2px solid #555; 256 | border-radius: 8px; 257 | background-color: #e0e0e0; 258 | position: relative; 259 | display: flex; 260 | z-index: 1; 261 | } 262 | .cell-gfx.imbalanced { 263 | background-color: #f0f0f0 !important; 264 | border: 2px dashed var(--warn) !important; 265 | animation: pulse-warn 2s infinite; 266 | } 267 | @keyframes pulse-warn { 268 | 0% { border-color: var(--warn); } 269 | 50% { border-color: #ff9800; } 270 | 100% { border-color: var(--warn); } 271 | } 272 | 273 | /* --- FIX 3: Стиль для МЕРТВОЙ (0V) ячейки --- */ 274 | .cell-gfx.dead-cell { 275 | background-color: #f0f0f0 !important; 276 | border: 2px solid var(--crit-low) !important; 277 | position: relative; /* Нужно для pseudo-element */ 278 | overflow: hidden; /* Чтобы крест не вылезал за границы */ 279 | } 280 | 281 | .cell-gfx.dead-cell::before, 282 | .cell-gfx.dead-cell::after { 283 | content: ''; 284 | position: absolute; 285 | top: 50%; 286 | left: 50%; 287 | width: 70%; /* Ширина креста (относительно 65px) */ 288 | height: 6px; /* Толщина креста */ 289 | background-color: var(--crit-low); 290 | transform-origin: center; 291 | z-index: 10; 292 | } 293 | 294 | .cell-gfx.dead-cell::before { 295 | transform: translate(-50%, -50%) rotate(45deg); 296 | } 297 | 298 | .cell-gfx.dead-cell::after { 299 | transform: translate(-50%, -50%) rotate(-45deg); 300 | } 301 | 302 | /* Скрываем содержимое мертвой ячейки, чтобы крест был виден */ 303 | .cell-gfx.dead-cell .cell-gfx-content, 304 | .cell-gfx.dead-cell .cell-cap { 305 | opacity: 0.1; /* Делаем текст и полюсы почти невидимыми */ 306 | } 307 | 308 | /* --- Стиль для критически низкой ячейки (НЕ 0V) --- */ 309 | .cell-gfx.crit-low-animated { 310 | background-color: #f0f0f0 !important; 311 | border: 2px dashed var(--crit-low) !important; 312 | animation: pulse-crit 1s infinite alternate; 313 | } 314 | @keyframes pulse-crit { 315 | 0% { border-color: var(--crit-low); background-color: #fff0f0; } 316 | 100% { border-color: #8b0000; background-color: #fce7e7; } 317 | } 318 | /* ------------------------------------------ */ 319 | 320 | .cell-container.flipped .cell-gfx-content { 321 | flex-direction: column-reverse; 322 | } 323 | .cell-cap { 324 | position: absolute; 325 | width: 24px; 326 | height: 6px; 327 | background-color: #777; 328 | left: 50%; 329 | transform: translateX(-50%); 330 | top: -8px; 331 | border-radius: 3px 3px 0 0; 332 | } 333 | .cell-container.flipped .cell-cap { 334 | top: auto; 335 | bottom: -8px; 336 | border-radius: 0 0 3px 3px; 337 | } 338 | .cell-gfx-content { 339 | display: flex; 340 | flex-direction: column; 341 | align-items: center; 342 | justify-content: space-between; 343 | height: 100%; 344 | width: 100%; 345 | padding: 5px 0; 346 | z-index: 1; /* Убедимся, что контент под крестом */ 347 | position: relative; 348 | } 349 | .cell-pole { 350 | font-size: 18px; 351 | font-weight: bold; 352 | color: #333; 353 | } 354 | .cell-gfx-vol { 355 | font-size: 14px; 356 | font-weight: 700; 357 | color: #000; 358 | } 359 | .pack-summary { 360 | text-align: center; 361 | margin-top: 2px; /* СЖАТИЕ V2: Уменьшен отступ над текстом */ 362 | font-size: 15px; 363 | font-weight: 600; 364 | } 365 | .pack-summary .soc { 366 | font-size: 20px; 367 | color: var(--success); 368 | } 369 | .soc-bar-container { 370 | width: 100%; 371 | max-width: 300px; 372 | height: 12px; 373 | background-color: #e0e0e0; 374 | border-radius: 6px; 375 | margin: 8px auto 0; 376 | overflow: hidden; 377 | } 378 | .soc-bar-value { 379 | height: 100%; 380 | background-color: var(--success); 381 | border-radius: 6px; 382 | transition: width 0.5s ease; 383 | } 384 | .delta-info { 385 | text-align: center; 386 | margin-top: 8px; 387 | font-size: 14px; 388 | color: var(--muted); 389 | } 390 | .delta-value { 391 | font-weight: bold; 392 | color: var(--warn); 393 | } 394 | /* -- Конец визуализации -- */ 395 | 396 | /* --- КОМПАКТНЫЙ АЛЕРТ --- */ 397 | #limitedSupportAlert { 398 | margin-bottom: 12px; 399 | } 400 | .alert.info{ 401 | background:#e3f2fd; 402 | border:1px solid #bbdefb; 403 | color:#0d47a1; 404 | font-size: 13px; /* СЖАТИЕ V2: Уменьшен шрифт */ 405 | padding: 8px 10px; /* СЖАТИЕ V2: Уменьшен padding */ 406 | line-height: 1.3; 407 | } 408 | .alerts{margin-top:10px; display: flex; flex-direction: column; gap: 8px;} 409 | .alert{padding:10px;border-radius:8px; font-size: 14px; line-height: 1.4;} 410 | .alert.warn{background:#fff8e1;border:1px solid #ffe0b2;color:#6b3a00} 411 | .alert.danger{background:#ffebee;border:1px solid #ffcdd2;color:#a31b1b} 412 | .log-spoiler { padding: 0; } 413 | .log-spoiler summary { 414 | padding: 10px; 415 | cursor: pointer; 416 | font-size: 18px; 417 | font-weight: 600; 418 | } 419 | .logbox{background:#2b2b2b; color:#a9b7c6; font-family:monospace; border-radius: 0 0 var(--radius) var(--radius);padding:12px;overflow:auto;height:200px;font-size:12px; resize: vertical; margin-top: -8px;} 420 | .footer{max-width:980px;margin:0 auto;padding:8px 12px;color:var(--muted);font-size:13px} 421 | #notification { 422 | grid-column: 1 / -1; 423 | padding: 10px; 424 | margin-top: 8px; border-radius: 5px; 425 | text-align: center; font-weight: bold; 426 | } 427 | .success { background-color: #d4edda; color: #155724; } 428 | .danger { background-color: #f8d7da; color: #721c24; } 429 | .info { background-color: #d1ecf1; color: #0e566c; } 430 | 431 | /* Адаптивность для мобильных устройств */ 432 | @media (max-width: 768px) { 433 | .button-pair, .hint-pair { 434 | gap: 8px; 435 | max-width: 100%; 436 | } 437 | 438 | .big { 439 | font-size: 13px; 440 | padding: 6px 6px; 441 | min-height: 36px; 442 | } 443 | 444 | .btn-hint { 445 | font-size: 9px; 446 | min-height: 2.5em; 447 | } 448 | 449 | .battery-pack { 450 | padding: 10px; 451 | gap: 4px; 452 | } 453 | 454 | .battery-cells { 455 | gap: 8px; 456 | } 457 | 458 | .cell-gfx { 459 | width: 55px; 460 | height: 85px; 461 | } 462 | 463 | .cell-container { 464 | width: 55px; 465 | } 466 | 467 | .cell-number { 468 | width: 55px; 469 | font-size: 12px; 470 | } 471 | 472 | .cell-gfx-vol { 473 | font-size: 11px; 474 | } 475 | 476 | .topbar { 477 | gap: 8px; 478 | } 479 | 480 | .header-left { 481 | order: 1; 482 | } 483 | .header-right { 484 | order: 2; 485 | } 486 | .header-status { 487 | order: 3; 488 | } 489 | } 490 | 491 | @media (max-width: 480px) { 492 | .button-pair, .hint-pair { 493 | gap: 6px; 494 | } 495 | 496 | .big { 497 | font-size: 12px; 498 | padding: 5px 4px; 499 | min-height: 35px; 500 | } 501 | 502 | .btn-hint { 503 | font-size: 8px; 504 | line-height: 1.2; 505 | } 506 | 507 | .button-pair, .hint-pair { 508 | grid-template-columns: 1fr 1fr; 509 | } 510 | } -------------------------------------------------------------------------------- /data/app.js: -------------------------------------------------------------------------------- 1 | // data/app.js - ИСПРАВЛЕННАЯ ВЕРСИЯ (ФИКС СЛИЯНИЯ lastData, ФИКС ВИЗУАЛИЗАЦИИ 0V, ФИКС ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ) 2 | 3 | const LANGS = { 4 | ua: { 5 | subtitle: "Діагностика батареї", 6 | sectionTitle: "Параметри батареї", 7 | rawTitle: "Журнал", 8 | footerText: "Версія: ESP-OBI Web UI", 9 | readStatic: "1. Зчитати Інфо", 10 | readDynamic: "2. Оновити дані", 11 | hintReadStatic: "Визначити модель та зчитати статичні дані", 12 | hintReadDynamic: "Зчитати напругу та температуру", 13 | clearErrors: "Очистити помилки", 14 | hintClear: "Скинути помилки BMS", 15 | ledTest: "Тест LED", 16 | hintLed: "Увімкнути/вимкнути LED", 17 | refresh: "Оновити статус", 18 | logPreamble: "Ініціалізація...", 19 | uiReady: "Інтерфейс готовий", 20 | batteryConnected: "Батарея: підключена", 21 | batteryNot: "Батарея: не виявлена", 22 | reading: "Зчитування...", 23 | ledOn: "LED увімкнено", 24 | ledOff: "LED вимкнено", 25 | cell: "Ячейка", 26 | alertImbalanceTitle: "⚠️ Розбаланс!", 27 | alertImbalanceBody: "Різниця між ячейками перевищує 0.1 В. Рекомендується балансування.", 28 | alertCritLowTitle: "❌ Критично низька напруга!", 29 | alertCritLowBody: "Напруга на одній з ячейок нижче 2.5 В. Ймовірно, елемент деградував.", 30 | alertLimitedSupportTitle: "ℹ️ Обмежена підтримка", 31 | alertLimitedSupportBody: "Для цієї моделі батареї сервісні функції не підтримуються, тому блок приховано.", 32 | alertAllGood: "Всі параметри в нормі", 33 | packSummary: "Загальна напруга:", 34 | soc: "Рівень заряду:", 35 | delta: "Розбаланс:", 36 | locked: "Заблоковано", 37 | unlocked: "Розблоковано", 38 | // Перевод параметров 39 | model: "Модель", 40 | cycles: "Цикли заряду", 41 | state: "Стан", 42 | statusCode: "Код статусу", 43 | mfg_date: "Дата виготовлення", 44 | capacity: "Ємність", 45 | connecting: "З'єднання...", 46 | reconnecting: "Втрачено. Перепідключення...", 47 | // --- NEW TEMPERATURE KEYS --- 48 | tempBMS: "Температура BMS", 49 | tempCell1: "Температура 1", 50 | tempCell2: "Температура 2", 51 | // --- NEW CRITICAL ALERTS KEYS --- 52 | alertCritZeroV: "Несправність батареї! Одна або більше ячейок мають напругу 0 В. Подальша діагностика не має сенсу.", 53 | alertAllLowV: "Критично низька напруга! Всі ячейки мають напругу нижче 0.5 В. Елементи, ймовірно, деградували.", 54 | }, 55 | ru: { 56 | subtitle: "Диагностика батареи", 57 | sectionTitle: "Параметры батареи", 58 | rawTitle: "Журнал", 59 | footerText: "Версия: ESP-OBI Web UI", 60 | readStatic: "1. Считать Инфо", 61 | readDynamic: "2. Обновить данные", 62 | hintReadStatic: "Определить модель и считать статические данные", 63 | hintReadDynamic: "Считать напряжение и температуру", 64 | clearErrors: "Очистить ошибки", 65 | hintClear: "Сбросить ошибки БМС", 66 | ledTest: "Тест LED", 67 | hintLed: "Включить/выключить LED", 68 | refresh: "Обновить статус", 69 | logPreamble: "Инициализация...", 70 | uiReady: "Интерфейс готов", 71 | batteryConnected: "Батарея: подключена", 72 | batteryNot: "Батарея: не обнаружена", 73 | reading: "Чтение...", 74 | ledOn: "LED включён", 75 | ledOff: "LED выключен", 76 | cell: "Ячейка", 77 | alertImbalanceTitle: "⚠️ Разбаланс!", 78 | alertImbalanceBody: "Разница между ячейками превышает 0.1 В. Рекомендуется балансировка.", 79 | alertCritLowTitle: "❌ Критически низкое напряжение!", 80 | alertCritLowBody: "Напряжение на одной из ячеек ниже 2.5 В. Вероятно, элемент деградировал.", 81 | alertLimitedSupportTitle: "ℹ️ Ограниченная поддержка", 82 | alertLimitedSupportBody: "Для этой модели батареи сервисные функции не поддерживаются, поэтому блок скрыт.", 83 | alertAllGood: "Все параметры в норме", 84 | packSummary: "Общее напряжение:", 85 | soc: "Уровень заряда:", 86 | delta: "Разбаланс:", 87 | locked: "Заблокирован", 88 | unlocked: "Разблокирован", 89 | // Перевод параметров 90 | model: "Модель", 91 | cycles: "Циклы заряда", 92 | state: "Состояние", 93 | statusCode: "Код статуса", 94 | mfg_date: "Дата производства", 95 | capacity: "Ёмкость", 96 | connecting: "Соединение...", 97 | reconnecting: "Потеряно. Переподключение...", 98 | // --- NEW TEMPERATURE KEYS --- 99 | tempBMS: "Температура BMS", 100 | tempCell1: "Температура 1", 101 | tempCell2: "Температура 2", 102 | // --- NEW CRITICAL ALERTS KEYS (FIXED PHRASE) --- 103 | alertCritZeroV: "Неисправность батареи! Одна или более ячеек имеют напряжение 0 В. Дальнейшая диагностика не имеет смысла.", 104 | alertAllLowV: "Критически низкое напряжение! Все ячейки имеют напряжение ниже 0.5 В. Элементы, вероятно, деградировали.", 105 | }, 106 | en: { 107 | subtitle: "Battery Diagnostics", 108 | sectionTitle: "Battery Parameters", 109 | rawTitle: "Log", 110 | footerText: "Version: ESP-OBI Web UI", 111 | readStatic: "1. Read Info", 112 | readDynamic: "2. Update Data", 113 | hintReadStatic: "Identify model and read static data", 114 | hintReadDynamic: "Read voltages and temperatures", 115 | clearErrors: "Clear Errors", 116 | hintClear: "Reset BMS errors", 117 | ledTest: "Test LED", 118 | hintLed: "Turn on/off battery LEDs", 119 | refresh: "Refresh status", 120 | logPreamble: "Initializing...", 121 | uiReady: "Interface ready", 122 | batteryConnected: "Battery: connected", 123 | batteryNot: "Battery: not detected", 124 | reading: "Reading...", 125 | ledOn: "LED on", 126 | ledOff: "LED off", 127 | cell: "Cell", 128 | alertImbalanceTitle: "⚠️ Imbalance!", 129 | alertImbalanceBody: "Difference between cells exceeds 0.1 V. Balancing is recommended.", 130 | alertCritLowTitle: "❌ Critically low voltage!", 131 | alertCritLowBody: "Voltage on one of the cells is below 2.5 V. The cell has likely degraded.", 132 | alertLimitedSupportTitle: "ℹ️ Limited Support", 133 | alertLimitedSupportBody: "Service functions are not supported for this battery model, so the block is hidden.", 134 | alertAllGood: "All parameters are normal", 135 | packSummary: "Total voltage:", 136 | soc: "State of Charge:", 137 | delta: "Imbalance:", 138 | locked: "Locked", 139 | unlocked: "Unlocked", 140 | // Перевод параметров 141 | model: "Model", 142 | cycles: "Charge cycles", 143 | state: "State", 144 | statusCode: "Status code", 145 | mfg_date: "Manufacture date", 146 | capacity: "Capacity", 147 | connecting: "Connecting...", 148 | reconnecting: "Lost. Reconnecting...", 149 | // --- NEW TEMPERATURE KEYS --- 150 | tempBMS: "BMS Temperature", 151 | tempCell1: "Temperature 1", 152 | tempCell2: "Temperature 2", 153 | // --- NEW CRITICAL ALERTS KEYS --- 154 | alertCritZeroV: "Battery defective! One or more cells have 0 V. Further diagnosis is pointless.", 155 | alertAllLowV: "Critically low voltage! All cells are below 0.5 V. Cells have likely degraded.", 156 | } 157 | }; 158 | 159 | let LANG = 'ua'; 160 | let lastData = {}; // --- Инициализируем как пустой объект для слияния 161 | let lastFeatures = null; 162 | let ledState = false; 163 | let ws = null; 164 | let reconnectInterval = null; 165 | let lastStatus = null; 166 | const RECONNECT_DELAY = 3000; 167 | 168 | function t(key){ return LANGS[LANG][key] || key; } 169 | 170 | const el = id => document.getElementById(id); 171 | const logEl = el('log'); 172 | 173 | const spinnerHtml = ``; 174 | 175 | function log(s) { 176 | if(!logEl) return; 177 | if(logEl.textContent === t('logPreamble')) logEl.textContent = ''; 178 | logEl.textContent += (new Date().toLocaleTimeString()) + ' - ' + s + '\n'; 179 | logEl.scrollTop = logEl.scrollHeight; 180 | } 181 | 182 | function showNotification(message, type, duration = 3000) { 183 | const notification = el('notification'); 184 | if(!notification) return; 185 | 186 | notification.textContent = message; 187 | notification.className = type; 188 | notification.style.display = 'block'; 189 | if (duration > 0) setTimeout(() => { notification.style.display = 'none'; }, duration); 190 | } 191 | 192 | function updateStatusText(statusKey) { 193 | const statusText = el('statusText'); 194 | if (!statusText) return; 195 | 196 | lastStatus = statusKey; 197 | statusText.textContent = t(statusKey); 198 | 199 | if (statusKey === 'connecting' || statusKey === 'reconnecting' || statusKey === 'batteryNot') { 200 | statusText.style.color = '#ff9800'; 201 | } else if (statusKey === 'batteryConnected' || statusKey === 'uiReady') { 202 | statusText.style.color = '#2e7d32'; 203 | } else { 204 | statusText.style.color = '#111'; 205 | } 206 | } 207 | 208 | function setButtonLoading(id, isLoading, textKey) { 209 | const btn = el(id); 210 | if (!btn) return; 211 | 212 | if (isLoading) { 213 | btn.disabled = true; 214 | btn.setAttribute('data-original-text', btn.textContent); 215 | btn.innerHTML = spinnerHtml + t(textKey); 216 | } else { 217 | btn.innerHTML = btn.getAttribute('data-original-text') || t(textKey); 218 | btn.removeAttribute('data-original-text'); 219 | } 220 | } 221 | 222 | function sendCommand(cmd, data = {}) { 223 | if (ws && ws.readyState === WebSocket.OPEN) { 224 | ws.send(JSON.stringify({ command: cmd, ...data })); 225 | } else { 226 | log(t('reconnecting')); 227 | showNotification(t('reconnecting'), 'danger', 0); 228 | } 229 | } 230 | 231 | function connect() { 232 | if (reconnectInterval) { 233 | clearInterval(reconnectInterval); 234 | reconnectInterval = null; 235 | } 236 | 237 | if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) { 238 | return; 239 | } 240 | 241 | log(t('connecting')); 242 | updateStatusText('connecting'); 243 | 244 | ws = new WebSocket(`ws://${window.location.hostname}/ws`); 245 | 246 | ws.onopen = () => { 247 | log(t('uiReady')); 248 | updateStatusText('uiReady'); 249 | if (reconnectInterval) clearInterval(reconnectInterval); 250 | }; 251 | 252 | ws.onclose = () => { 253 | log("WebSocket connection closed."); 254 | updateStatusText('reconnecting'); 255 | showNotification(t('reconnecting'), 'danger', 0); 256 | 257 | if (!reconnectInterval) { 258 | reconnectInterval = setInterval(connect, RECONNECT_DELAY); 259 | } 260 | }; 261 | 262 | ws.onerror = (err) => { 263 | log("WebSocket error."); 264 | ws.close(); 265 | }; 266 | 267 | ws.onmessage = handleWebSocketMessage; 268 | } 269 | 270 | 271 | function handleWebSocketMessage(event) { 272 | try { 273 | const msg = JSON.parse(event.data); 274 | 275 | if (msg.type !== 'presence' && msg.type !== 'debug') { 276 | ['btnReadStatic', 'btnReadDynamic', 'btnClearErrors', 'btnLed'].forEach(id => { 277 | const btn = el(id); 278 | if (btn && btn.getAttribute('data-original-text')) { 279 | btn.innerHTML = btn.getAttribute('data-original-text'); 280 | btn.removeAttribute('data-original-text'); 281 | btn.disabled = false; 282 | } 283 | }); 284 | } 285 | 286 | showNotification('', 'info', 1); 287 | 288 | if (msg.type === 'debug') { 289 | log(msg.message); 290 | return; 291 | } 292 | 293 | if (msg.type === 'error') { 294 | log(`ERROR: ${msg.message}`); 295 | showNotification(msg.message, 'danger'); 296 | } 297 | else if (msg.type === 'success') { 298 | log(`SUCCESS: ${msg.message}`); 299 | showNotification(msg.message, 'success'); 300 | 301 | if (msg.message && (msg.message.includes('LED') || msg.message.includes('Светодиод'))) { 302 | const newLedState = msg.message.toLowerCase().includes('on') || msg.message.toLowerCase().includes('включен'); 303 | ledState = newLedState; 304 | const btnLed = el('btnLed'); 305 | if (btnLed) { 306 | btnLed.innerHTML = t(ledState ? 'ledTest' : 'ledTest'); 307 | } 308 | } 309 | } 310 | else if (msg.type === 'presence') { 311 | const statusKey = msg.present ? 'batteryConnected' : 'batteryNot'; 312 | updateStatusText(statusKey); 313 | } 314 | // --- FIX: Handle Static Data (Merge data, Render table only) --- 315 | else if (msg.type === 'static_data') { 316 | const overviewCard = el('overviewCard'); 317 | if (overviewCard) overviewCard.style.display = 'block'; 318 | 319 | lastData = { ...lastData, ...msg.data }; // Слияние данных 320 | renderData(lastData); // Рендер таблицы с объединенными данными 321 | updateButtonStates(msg.features); 322 | 323 | // Скрытие/очистка динамических элементов 324 | const area = el('cellsArea'); 325 | const numbersArea = el('cellsNumbers'); 326 | const summary = el('packSummary'); 327 | if (area) area.style.display = 'none'; 328 | if (numbersArea) numbersArea.style.display = 'none'; 329 | if (summary) summary.style.display = 'none'; 330 | 331 | const alertsArea = el('alertsArea'); 332 | if(alertsArea) alertsArea.innerHTML = `
${t('alertAllGood')}
`; 333 | 334 | log('Static data received.'); 335 | showNotification(t('readStatic') + " OK", 'success'); 336 | } 337 | // --- FIX: Handle Dynamic Data (Merge data, Render all) --- 338 | else if (msg.type === 'dynamic_data') { 339 | const overviewCard = el('overviewCard'); 340 | if (overviewCard) overviewCard.style.display = 'block'; 341 | 342 | lastData = { ...lastData, ...msg.data }; // Слияние данных 343 | renderData(lastData); // Рендер таблицы (включая температуру) 344 | renderCells(lastData); // Рендер ячеек (напряжения) 345 | renderAlerts(lastData, lastFeatures); // Рендер предупреждений 346 | log("Live data updated"); 347 | showNotification(t('readDynamic') + " OK", 'success'); 348 | } 349 | } catch (e) { 350 | log("Error parsing WebSocket message: " + e.toString()); 351 | ['btnReadStatic', 'btnReadDynamic', 'btnClearErrors', 'btnLed'].forEach(id => { 352 | setButtonLoading(id, false, id === 'btnReadStatic' ? 'readStatic' : (id === 'btnReadDynamic' ? 'readDynamic' : (id === 'btnClearErrors' ? 'clearErrors' : 'ledTest'))); 353 | }); 354 | } 355 | } 356 | 357 | 358 | function setLang(lang){ 359 | if (!LANGS[lang]) lang = 'ua'; 360 | LANG = lang; 361 | document.documentElement.lang = lang; 362 | document.querySelectorAll('.lang').forEach(b=>b.classList.remove('active')); 363 | 364 | const activeBtn = el(`btn${lang.toUpperCase()}`); 365 | if (activeBtn) activeBtn.classList.add('active'); 366 | 367 | const elements = { 368 | 'subtitle': 'subtitle', 'sectionTitle': 'sectionTitle', 'rawTitle': 'rawTitle', 369 | 'footerText': 'footerText', 'btnReadStatic': 'readStatic', 'btnReadDynamic': 'readDynamic', 'hintReadStatic': 'hintReadStatic', 370 | 'hintReadDynamic': 'hintReadDynamic', 'btnClearErrors': 'clearErrors', 'hintClear': 'hintClear', 371 | 'btnLed': 'ledTest', 'hintLed': 'hintLed' 372 | }; 373 | 374 | for(const id in elements) { 375 | const element = el(id); 376 | if(element && !element.querySelector('.spinner')) { 377 | element.textContent = t(elements[id]); 378 | } 379 | } 380 | 381 | // Re-render parameters to apply new language strings 382 | if (lastData) { 383 | renderData(lastData); 384 | 385 | const area = el('cellsArea'); 386 | if (area && area.style.display === 'flex') { 387 | renderCells(lastData); 388 | renderAlerts(lastData, lastFeatures); 389 | } else { 390 | const alertsArea = el('alertsArea'); 391 | if(alertsArea) alertsArea.innerHTML = `
${t('alertAllGood')}
`; 392 | } 393 | } 394 | if (lastFeatures) { 395 | updateButtonStates(lastFeatures); 396 | } 397 | 398 | if (lastStatus) { 399 | updateStatusText(lastStatus); 400 | } 401 | } 402 | 403 | function updateButtonStates(features) { 404 | lastFeatures = features; 405 | const btnDynamic = el('btnReadDynamic'); 406 | const btnClear = el('btnClearErrors'); 407 | const btnLed = el('btnLed'); 408 | const serviceActions = el('serviceActions'); 409 | 410 | if (!btnDynamic || !btnClear || !btnLed || !serviceActions) return; 411 | 412 | // --- ФИКС: Активация кнопки "Обновить данные" независимо от сервисных функций --- 413 | btnDynamic.disabled = !features.read_dynamic; 414 | if (!btnDynamic.getAttribute('data-original-text')) btnDynamic.innerHTML = t('readDynamic'); 415 | btnDynamic.classList.toggle('btn-data', features.read_dynamic); 416 | 417 | const hasServiceFeatures = features.clear_errors || features.led_test; 418 | 419 | // --- ЛОГИКА СКРЫТИЯ/ОТОБРАЖЕНИЯ СЕРВИСНОГО БЛОКА --- 420 | if (!hasServiceFeatures) { 421 | serviceActions.style.display = 'none'; 422 | } else { 423 | serviceActions.style.display = ''; 424 | 425 | // Установка disabled для отдельных сервисных кнопок 426 | btnClear.disabled = !features.clear_errors; 427 | btnLed.disabled = !features.led_test; 428 | 429 | // Восстановление текста и классов для service buttons 430 | if (!btnClear.getAttribute('data-original-text')) btnClear.innerHTML = t('clearErrors'); 431 | if (!btnLed.getAttribute('data-original-text')) btnLed.innerHTML = t('ledTest'); 432 | 433 | btnClear.classList.toggle('btn-service', features.clear_errors); 434 | btnLed.classList.toggle('btn-func', features.led_test); 435 | } 436 | 437 | const limitedSupportAlert = el('limitedSupportAlert'); 438 | if (limitedSupportAlert) { 439 | if (features && features.read_dynamic && !hasServiceFeatures) { 440 | limitedSupportAlert.innerHTML = `${t('alertLimitedSupportTitle')} ${t('alertLimitedSupportBody')}`; 441 | limitedSupportAlert.style.display = 'block'; 442 | } else { 443 | limitedSupportAlert.style.display = 'none'; 444 | } 445 | } 446 | } 447 | 448 | function renderData(data) { 449 | const table = el('data-table'); 450 | if (!table) return; 451 | 452 | table.innerHTML = ''; 453 | const createRow = (k, v) => `
${k}
${v}
`; 454 | 455 | if (data.model) table.innerHTML += createRow(t('model'), data.model); 456 | if (data.charge_cycles !== undefined && data.charge_cycles !== null) table.innerHTML += createRow(t('cycles'), data.charge_cycles); 457 | 458 | const state_key = (data.lock_status || '').toLowerCase(); 459 | if (state_key) { 460 | const state_text = t(state_key); 461 | const state_class = state_key === 'locked' ? 'badge-danger' : 'badge-success'; 462 | table.innerHTML += createRow(t('state'), `${state_text}`); 463 | } 464 | 465 | if (data.mfg_date) table.innerHTML += createRow(t('mfg_date'), data.mfg_date); 466 | if (data.capacity) table.innerHTML += createRow(t('capacity'), data.capacity); 467 | 468 | // --- FIX 4: Improved Temperature Rendering Logic --- 469 | const renderTemp = (key, label) => { 470 | // key may be a single key string or an array of alternative keys. 471 | let val = undefined; 472 | if (Array.isArray(key)) { 473 | for (let k of key) { 474 | if (data[k] !== undefined && data[k] !== null && !isNaN(parseFloat(data[k]))) { 475 | val = parseFloat(data[k]); 476 | break; 477 | } 478 | } 479 | } else { 480 | if (data[key] !== undefined && data[key] !== null && !isNaN(parseFloat(data[key]))) { 481 | val = parseFloat(data[key]); 482 | } 483 | } 484 | if (val !== undefined) { 485 | table.innerHTML += createRow(label, val.toFixed(1) + ' °C'); 486 | } 487 | }; 488 | 489 | renderTemp(['temp_bms','temp1'], t('tempBMS')); 490 | // renderTemp(['temp_cell_1','temp2'], t('tempCell1')); 491 | // renderTemp(['temp_cell_2','temp2'], t('tempCell2')); 492 | // --- END FIX 4 --- 493 | } 494 | 495 | const socTable = [ 496 | {v: 4.20, soc: 100}, {v: 4.15, soc: 95}, {v: 4.11, soc: 90}, {v: 4.08, soc: 85}, 497 | {v: 4.02, soc: 80}, {v: 3.98, soc: 75}, {v: 3.95, soc: 70}, {v: 3.91, soc: 65}, 498 | {v: 3.87, soc: 60}, {v: 3.85, soc: 55}, {v: 3.84, soc: 50}, {v: 3.82, soc: 45}, 499 | {v: 3.80, soc: 40}, {v: 3.79, soc: 35}, {v: 3.77, soc: 30}, {v: 3.75, soc: 25}, 500 | {v: 3.73, soc: 20}, {v: 3.71, soc: 15}, {v: 3.69, soc: 10}, {v: 3.61, soc: 5}, 501 | {v: 3.27, soc: 0} 502 | ]; 503 | 504 | function getSoC(voltage) { 505 | if (voltage >= socTable[0].v) return 100; 506 | if (voltage <= socTable[socTable.length - 1].v) return 0; 507 | 508 | for (let i = 0; i < socTable.length - 1; i++) { 509 | if (voltage <= socTable[i].v && voltage >= socTable[i + 1].v) { 510 | const upper = socTable[i]; 511 | const lower = socTable[i + 1]; 512 | const range = upper.v - lower.v; 513 | const socRange = upper.soc - lower.soc; 514 | const v_delta = voltage - lower.v; 515 | return Math.round(lower.soc + (v_delta / range) * socRange); 516 | } 517 | } 518 | return 0; 519 | } 520 | 521 | function renderCells(data){ 522 | const area = el('cellsArea'); 523 | const numbersArea = el('cellsNumbers'); 524 | const summary = el('packSummary'); 525 | 526 | if (!area || !numbersArea || !summary) return; 527 | 528 | if (data && data.cell_voltages && data.cell_voltages.length > 0) { 529 | area.innerHTML = ''; 530 | numbersArea.innerHTML = ''; 531 | summary.innerHTML = ''; 532 | // Show visualization elements now that dynamic data is loaded 533 | area.style.display = 'flex'; 534 | numbersArea.style.display = 'flex'; 535 | summary.style.display = 'block'; 536 | 537 | const voltages = data.cell_voltages; 538 | // Live voltages (for SoC/Delta calculation) 539 | const live_voltages = voltages.filter(v => v > 0.5); 540 | 541 | if (voltages.length === 0) return; 542 | 543 | let maxV = 0, minV = 0, deltaV = 0, imbalance = false, critLow = false, avgVoltage = 0, socPercent = 0; 544 | 545 | if (live_voltages.length > 0) { 546 | maxV = Math.max(...live_voltages); 547 | minV = Math.min(...live_voltages); 548 | deltaV = maxV - minV; 549 | imbalance = deltaV > 0.1; 550 | critLow = minV < 2.5; 551 | avgVoltage = live_voltages.reduce((a,b) => a+b, 0) / live_voltages.length; 552 | } 553 | 554 | const connectorsContainer = document.createElement('div'); 555 | connectorsContainer.className = 'battery-connectors'; 556 | area.appendChild(connectorsContainer); 557 | 558 | for (let i = 0; i < 5; i++) { 559 | const v = voltages[i] || 0; 560 | // Ячейки 2 и 4 перевернуты для Z-схемы 561 | const isFlipped = (i + 1) % 2 === 0; 562 | 563 | const container = document.createElement('div'); 564 | container.className = 'cell-container'; 565 | if(isFlipped) container.classList.add('flipped'); 566 | 567 | let cellHTML = ` 568 |
569 |
570 |
571 |
+
572 |
${v > 0.001 ? v.toFixed(3) + ' V' : '0.000 V'}
573 |
-
574 |
575 |
576 | `; 577 | container.innerHTML = cellHTML; 578 | const cellDiv = container.querySelector('.cell-gfx'); 579 | 580 | // --- FIX 3: New Dead Cell Visualization --- 581 | if (v > 0.001) { // --- Ячейка ЖИВА --- 582 | const health = Math.max(0, Math.min(1, (v - 2.8) / (4.2 - 2.8))); 583 | const hue = health * 120; 584 | 585 | if (imbalance && v === minV) { 586 | cellDiv.classList.add('imbalanced'); 587 | } 588 | 589 | // Animate if critically low (but not dead) 590 | if (critLow && v === minV) { 591 | cellDiv.classList.add('crit-low-animated'); 592 | } else if (!cellDiv.classList.contains('imbalanced')) { 593 | cellDiv.style.backgroundColor = `hsl(${hue}, 85%, 70%)`; 594 | } 595 | } else { 596 | // --- Ячейка МЕРТВА (0V) --- 597 | cellDiv.classList.add('dead-cell'); // Применяем класс с крестом 598 | } 599 | // --- END FIX 3 --- 600 | 601 | area.appendChild(container); 602 | 603 | const numberElement = document.createElement('div'); 604 | numberElement.className = 'cell-number'; 605 | numberElement.textContent = i + 1; 606 | numbersArea.appendChild(numberElement); 607 | } 608 | 609 | // ПЕРЕРИСОВКА ПЕРЕМЫЧЕК 610 | setTimeout(() => renderConnectors(), 10); 611 | 612 | if(data.pack_voltage && live_voltages.length > 0) { 613 | socPercent = getSoC(avgVoltage); 614 | let summaryHTML = `${t('packSummary')} ${data.pack_voltage.toFixed(3)} V | ${t('soc')} ${socPercent}%`; 615 | 616 | summaryHTML += ` 617 |
618 |
619 |
620 | `; 621 | 622 | if (live_voltages.length > 1) { 623 | summaryHTML += `
${t('delta')} ${deltaV.toFixed(3)} V
`; 624 | } 625 | 626 | summary.innerHTML = summaryHTML; 627 | } else if (data.pack_voltage) { 628 | // Show total voltage even if no live cells 629 | summary.innerHTML = `${t('packSummary')} ${data.pack_voltage.toFixed(3)} V | ${t('soc')} 0%`; 630 | } 631 | } else { 632 | // Hide visualization elements if no dynamic data is present 633 | area.style.display = 'none'; 634 | numbersArea.style.display = 'none'; 635 | summary.style.display = 'none'; 636 | } 637 | } 638 | 639 | function renderConnectors() { 640 | const connectorsContainer = document.querySelector('.battery-connectors'); 641 | if (!connectorsContainer) return; 642 | connectorsContainer.innerHTML = ''; 643 | 644 | const cells = document.querySelectorAll('.cell-container'); 645 | if (cells.length < 2) return; 646 | 647 | const containerRect = connectorsContainer.parentElement.getBoundingClientRect(); 648 | 649 | for (let i = 0; i < cells.length - 1; i++) { 650 | const cell1 = cells[i].getBoundingClientRect(); 651 | const cell2 = cells[i + 1].getBoundingClientRect(); 652 | 653 | // 1. Координаты X центра каждой ячейки (относительно контейнера) 654 | const x1 = cell1.left + cell1.width / 2 - containerRect.left; 655 | const x2 = cell2.left + cell2.width / 2 - containerRect.left; 656 | 657 | // 2. Определяем, должно ли соединение быть СВЕРХУ или СНИЗУ (Z-схема: 1-2 TOP, 2-3 BOTTOM, 3-4 TOP, 4-5 BOTTOM) 658 | const isTopConnection = i % 2 === 0; 659 | 660 | // 3. Рассчитываем общую координату Y для горизонтальной линии 661 | let y_conn; 662 | if (isTopConnection) { 663 | y_conn = cell1.top - containerRect.top; // Верхний край ячейки 664 | } else { 665 | y_conn = cell1.top + cell1.height - containerRect.top; // Нижний край ячейки 666 | } 667 | 668 | // --- Горизонтальный соединитель --- 669 | const connector = document.createElement('div'); 670 | connector.className = 'connector'; 671 | connector.style.width = `${Math.abs(x2 - x1)}px`; 672 | connector.style.left = `${Math.min(x1, x2)}px`; 673 | // Размещаем линию (4px) по центру y_conn 674 | connector.style.top = `${y_conn - 2}px`; 675 | connectorsContainer.appendChild(connector); 676 | 677 | // 4. Вертикальные соединители (должны охватывать всю высоту ячеек, для Z-визуализации) 678 | const y_top_span = cell1.top - containerRect.top; 679 | const v_height = cell1.height + 4; // Высота ячейки + 4px для перекрытия (по 2px сверху и снизу) 680 | 681 | // Вертикальная линия 1 (Ячейка i) 682 | const vConnector1 = document.createElement('div'); 683 | vConnector1.className = 'connector'; 684 | vConnector1.style.width = `4px`; 685 | vConnector1.style.left = `${x1 - 2}px`; 686 | vConnector1.style.top = `${y_top_span - 2}px`; 687 | vConnector1.style.height = `${v_height}px`; 688 | connectorsContainer.appendChild(vConnector1); 689 | 690 | // Вертикальная линия 2 (Ячейка i+1) 691 | const vConnector2 = document.createElement('div'); 692 | vConnector2.className = 'connector'; 693 | vConnector2.style.width = `4px`; 694 | vConnector2.style.left = `${x2 - 2}px`; 695 | // Используем те же координаты Y для span, так как ячейки одной высоты 696 | vConnector2.style.top = `${y_top_span - 2}px`; 697 | vConnector2.style.height = `${v_height}px`; 698 | connectorsContainer.appendChild(vConnector2); 699 | } 700 | } 701 | 702 | function renderAlerts(data, features = null) { 703 | const alertsArea = el('alertsArea'); 704 | if (!alertsArea) return; 705 | alertsArea.innerHTML = ''; 706 | 707 | if (!data || !data.cell_voltages || data.cell_voltages.length === 0) { 708 | alertsArea.innerHTML = `
${t('alertAllGood')}
`; 709 | return; 710 | } 711 | 712 | const all_voltages = data.cell_voltages; 713 | // Live voltages (for imbalance/SoC calculation) 714 | const live_voltages = all_voltages.filter(v => v > 0.5); 715 | 716 | let hasAlert = false; 717 | 718 | // --- Critical Zero V Check (0V) with updated phrase --- 719 | const hasZeroVCell = all_voltages.some(v => v < 0.001); 720 | if (hasZeroVCell) { 721 | alertsArea.innerHTML += `
${t('alertCritZeroV')}
`; 722 | hasAlert = true; 723 | } 724 | 725 | // --- All Cells Critically Low (< 0.5V) --- 726 | if (live_voltages.length === 0 && all_voltages.length > 0 && !hasZeroVCell) { 727 | alertsArea.innerHTML += `
${t('alertAllLowV')}
`; 728 | hasAlert = true; 729 | } 730 | 731 | 732 | if (live_voltages.length > 1) { // Check imbalance and low voltage only on living cells 733 | const maxV = Math.max(...live_voltages); 734 | const minV = Math.min(...live_voltages); 735 | const deltaV = maxV - minV; 736 | 737 | // 1. Критически низкое напряжение (на живых ячейках) 738 | if (minV < 2.5) { 739 | alertsArea.innerHTML += `
${t('alertCritLowTitle')} ${t('alertCritLowBody')}
`; 740 | hasAlert = true; 741 | } 742 | 743 | // 2. Разбаланс (на живых ячейках) 744 | if (deltaV > 0.1) { 745 | alertsArea.innerHTML += `
${t('alertImbalanceTitle')} ${t('alertImbalanceBody')}
`; 746 | hasAlert = true; 747 | } 748 | } 749 | 750 | if (!hasAlert) { 751 | alertsArea.innerHTML += `
${t('alertAllGood')}
`; 752 | } 753 | } 754 | 755 | 756 | // Инициализация при загрузке 757 | window.addEventListener('load', ()=>{ 758 | updateButtonStates({ read_dynamic: false, led_test: false, clear_errors: false }); 759 | 760 | const btnEN = el('btnEN'); 761 | const btnUA = el('btnUA'); 762 | const btnRU = el('btnRU'); 763 | const btnReadStatic = el('btnReadStatic'); 764 | const btnReadDynamic = el('btnReadDynamic'); 765 | const btnClearErrors = el('btnClearErrors'); 766 | const btnLed = el('btnLed'); 767 | 768 | if (btnEN) btnEN.addEventListener('click', ()=>setLang('en')); 769 | if (btnUA) btnUA.addEventListener('click', ()=>setLang('ua')); 770 | if (btnRU) btnRU.addEventListener('click', ()=>setLang('ru')); 771 | 772 | if (btnReadStatic) { 773 | btnReadStatic.addEventListener('click', () => { 774 | log(t('reading')); 775 | setButtonLoading('btnReadStatic', true, 'reading'); 776 | sendCommand('read_static'); 777 | }); 778 | } 779 | 780 | if (btnReadDynamic) { 781 | btnReadDynamic.addEventListener('click', () => { 782 | log(t('reading')); 783 | setButtonLoading('btnReadDynamic', true, 'reading'); 784 | sendCommand('read_dynamic'); 785 | }); 786 | } 787 | 788 | if (btnClearErrors) { 789 | btnClearErrors.addEventListener('click', () => { 790 | setButtonLoading('btnClearErrors', true, 'clearErrors'); 791 | sendCommand('clear_errors'); 792 | }); 793 | } 794 | 795 | if (btnLed) { 796 | btnLed.addEventListener('click', () => { 797 | ledState = !ledState; 798 | setButtonLoading('btnLed', true, ledState ? 'ledOn' : 'ledOff'); 799 | sendCommand(ledState ? 'led_on' : 'led_off'); 800 | }); 801 | } 802 | 803 | const navLang = (navigator.language || '').toLowerCase(); 804 | let defaultLang = 'ua'; 805 | if (navLang.startsWith('ru')) { 806 | defaultLang = 'ru'; 807 | } else if (navLang.startsWith('en')) { 808 | defaultLang = 'en'; 809 | } 810 | setLang(defaultLang); 811 | 812 | if(logEl) logEl.textContent = t('logPreamble'); 813 | 814 | connect(); 815 | }); 816 | 817 | window.addEventListener('resize', () => { 818 | if (lastData) { 819 | // Redraw cells only if the visualization is currently active (dynamic data was loaded) 820 | const area = el('cellsArea'); 821 | if (area && area.style.display === 'flex') { 822 | renderCells(lastData); 823 | } 824 | } 825 | }); -------------------------------------------------------------------------------- /.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | // 2 | // !!! WARNING !!! AUTO-GENERATED FILE! 3 | // PLEASE DO NOT MODIFY IT AND USE "platformio.ini": 4 | // https://docs.platformio.org/page/projectconf/section_env_build.html#build-flags 5 | // 6 | { 7 | "configurations": [ 8 | { 9 | "name": "PlatformIO", 10 | "includePath": [ 11 | "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/src", 12 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src", 13 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src", 14 | "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/lib/OneWireMakita", 15 | "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/.pio/libdeps/esp32-c3-devkitm-1/ESPAsyncWebServer-esphome/src", 16 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src", 17 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/FS/src", 18 | "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/.pio/libdeps/esp32-c3-devkitm-1/AsyncTCP-esphome/src", 19 | "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/.pio/libdeps/esp32-c3-devkitm-1/ArduinoJson/src", 20 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/newlib/platform_include", 21 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include", 22 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/esp_additions/freertos", 23 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/port/riscv/include", 24 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/esp_additions", 25 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include", 26 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include/soc", 27 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include/soc/esp32c3", 28 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/port/esp32c3", 29 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/port/esp32c3/private_include", 30 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/heap/include", 31 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/log/include", 32 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/include/apps", 33 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/include/apps/sntp", 34 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/lwip/src/include", 35 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/port/esp32/include", 36 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/port/esp32/include/arch", 37 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/include", 38 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/esp32c3", 39 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/esp32c3/include", 40 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include", 41 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/include", 42 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/platform_port/include", 43 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/include", 44 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/include/esp32c3", 45 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/esp32c3", 46 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_common/include", 47 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/include", 48 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/soc", 49 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/include/riscv", 50 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/public_compat", 51 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/riscv/include", 52 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/driver/include", 53 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/driver/esp32c3/include", 54 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_pm/include", 55 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_ringbuf/include", 56 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/efuse/include", 57 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/efuse/esp32c3/include", 58 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/vfs/include", 59 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_wifi/include", 60 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_event/include", 61 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_netif/include", 62 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_eth/include", 63 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/tcpip_adapter/include", 64 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_phy/include", 65 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_phy/esp32c3/include", 66 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_ipc/include", 67 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/app_trace/include", 68 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_timer/include", 69 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/port/include", 70 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/mbedtls/include", 71 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/esp_crt_bundle/include", 72 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/app_update/include", 73 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/spi_flash/include", 74 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bootloader_support/include", 75 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nvs_flash/include", 76 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/pthread/include", 77 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/include", 78 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/riscv", 79 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/esp32c3", 80 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espcoredump/include", 81 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espcoredump/include/port/riscv", 82 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/include", 83 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/port/include", 84 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/esp_supplicant/include", 85 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/ieee802154/include", 86 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/console", 87 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/asio/asio/asio/include", 88 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/asio/port/include", 89 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/osi/include", 90 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/include/esp32c3/include", 91 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/api/include/api", 92 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/btc/profile/esp/blufi/include", 93 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/btc/profile/esp/include", 94 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/host/bluedroid/api/include/api", 95 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_common/include", 96 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_common/tinycrypt/include", 97 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core", 98 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core/include", 99 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core/storage", 100 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/btc/include", 101 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/common/include", 102 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/client/include", 103 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/server/include", 104 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api/core/include", 105 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api/models/include", 106 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api", 107 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/cbor/port/include", 108 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/unity/include", 109 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/unity/unity/src", 110 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/cmock/CMock/src", 111 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/coap/port/include", 112 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/coap/libcoap/include", 113 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nghttp/port/include", 114 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nghttp/nghttp2/lib/includes", 115 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-tls", 116 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-tls/esp-tls-crypto", 117 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_adc_cal/include", 118 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hid/include", 119 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/tcp_transport/include", 120 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_http_client/include", 121 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_http_server/include", 122 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_https_ota/include", 123 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_https_server/include", 124 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_lcd/include", 125 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_lcd/interface", 126 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protobuf-c/protobuf-c", 127 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/common", 128 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/security", 129 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/transports", 130 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mdns/include", 131 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_local_ctrl/include", 132 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/sdmmc/include", 133 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_serial_slave_link/include", 134 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_websocket_client/include", 135 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/expat/expat/expat/lib", 136 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/expat/port/include", 137 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wear_levelling/include", 138 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/diskio", 139 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/vfs", 140 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/src", 141 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freemodbus/freemodbus/common/include", 142 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/idf_test/include", 143 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/idf_test/include/esp32c3", 144 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/jsmn/include", 145 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json/cJSON", 146 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/libsodium/libsodium/src/libsodium/include", 147 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/libsodium/port_include", 148 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mqtt/esp-mqtt/include", 149 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/openssl/include", 150 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/spiffs/include", 151 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wifi_provisioning/include", 152 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/rmaker_common/include", 153 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_diagnostics/include", 154 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/rtc_store/include", 155 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_insights/include", 156 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_parser/upstream/include", 157 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_parser/upstream", 158 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_generator/upstream", 159 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_schedule/include", 160 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp_secure_cert_mgr/include", 161 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rainmaker/include", 162 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/gpio_button/button/include", 163 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/qrcode/include", 164 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/ws2812_led", 165 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_littlefs/include", 166 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include", 167 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/tool", 168 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/typedef", 169 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/image", 170 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/math", 171 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/nn", 172 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/layer", 173 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/detect", 174 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/model_zoo", 175 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp32-camera/driver/include", 176 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp32-camera/conversions/include", 177 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/dotprod/include", 178 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/support/include", 179 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/support/mem/include", 180 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/include", 181 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/hann/include", 182 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman/include", 183 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman_harris/include", 184 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman_nuttall/include", 185 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/nuttall/include", 186 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/flat_top/include", 187 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/iir/include", 188 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/fir/include", 189 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/include", 190 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/add/include", 191 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/sub/include", 192 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/mul/include", 193 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/addc/include", 194 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/mulc/include", 195 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/sqrt/include", 196 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mul/include", 197 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/add/include", 198 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/addc/include", 199 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mulc/include", 200 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/sub/include", 201 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/include", 202 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/fft/include", 203 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/dct/include", 204 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/conv/include", 205 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/common/include", 206 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mul/test/include", 207 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/kalman/ekf/include", 208 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/kalman/ekf_imu13states/include", 209 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fb_gfx/include", 210 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/qio_qspi/include", 211 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/cores/esp32", 212 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/variants/esp32c3", 213 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src", 214 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src", 215 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src", 216 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src", 217 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src", 218 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src", 219 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src", 220 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src", 221 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src", 222 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src", 223 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src", 224 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdateServer/src", 225 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/I2S/src", 226 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/Insights/src", 227 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src", 228 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src", 229 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src", 230 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/RainMaker/src", 231 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/SD/src", 232 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src", 233 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src", 234 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src", 235 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src", 236 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/USB/src", 237 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/Update/src", 238 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src", 239 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src", 240 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src", 241 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src", 242 | "" 243 | ], 244 | "browse": { 245 | "limitSymbolsToIncludedHeaders": true, 246 | "path": [ 247 | "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/src", 248 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src", 249 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src", 250 | "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/lib/OneWireMakita", 251 | "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/.pio/libdeps/esp32-c3-devkitm-1/ESPAsyncWebServer-esphome/src", 252 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src", 253 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/FS/src", 254 | "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/.pio/libdeps/esp32-c3-devkitm-1/AsyncTCP-esphome/src", 255 | "C:/Users/Admin/Documents/PlatformIO/Projects/Makita_RMT_AIST/.pio/libdeps/esp32-c3-devkitm-1/ArduinoJson/src", 256 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/newlib/platform_include", 257 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include", 258 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/esp_additions/freertos", 259 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/port/riscv/include", 260 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/esp_additions", 261 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include", 262 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include/soc", 263 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include/soc/esp32c3", 264 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/port/esp32c3", 265 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/port/esp32c3/private_include", 266 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/heap/include", 267 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/log/include", 268 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/include/apps", 269 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/include/apps/sntp", 270 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/lwip/src/include", 271 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/port/esp32/include", 272 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/port/esp32/include/arch", 273 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/include", 274 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/esp32c3", 275 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/esp32c3/include", 276 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include", 277 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/include", 278 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/platform_port/include", 279 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/include", 280 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/include/esp32c3", 281 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/esp32c3", 282 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_common/include", 283 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/include", 284 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/soc", 285 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/include/riscv", 286 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/public_compat", 287 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/riscv/include", 288 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/driver/include", 289 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/driver/esp32c3/include", 290 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_pm/include", 291 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_ringbuf/include", 292 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/efuse/include", 293 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/efuse/esp32c3/include", 294 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/vfs/include", 295 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_wifi/include", 296 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_event/include", 297 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_netif/include", 298 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_eth/include", 299 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/tcpip_adapter/include", 300 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_phy/include", 301 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_phy/esp32c3/include", 302 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_ipc/include", 303 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/app_trace/include", 304 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_timer/include", 305 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/port/include", 306 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/mbedtls/include", 307 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/esp_crt_bundle/include", 308 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/app_update/include", 309 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/spi_flash/include", 310 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bootloader_support/include", 311 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nvs_flash/include", 312 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/pthread/include", 313 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/include", 314 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/riscv", 315 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/esp32c3", 316 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espcoredump/include", 317 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espcoredump/include/port/riscv", 318 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/include", 319 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/port/include", 320 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/esp_supplicant/include", 321 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/ieee802154/include", 322 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/console", 323 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/asio/asio/asio/include", 324 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/asio/port/include", 325 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/osi/include", 326 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/include/esp32c3/include", 327 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/api/include/api", 328 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/btc/profile/esp/blufi/include", 329 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/btc/profile/esp/include", 330 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/host/bluedroid/api/include/api", 331 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_common/include", 332 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_common/tinycrypt/include", 333 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core", 334 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core/include", 335 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core/storage", 336 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/btc/include", 337 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/common/include", 338 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/client/include", 339 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/server/include", 340 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api/core/include", 341 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api/models/include", 342 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api", 343 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/cbor/port/include", 344 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/unity/include", 345 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/unity/unity/src", 346 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/cmock/CMock/src", 347 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/coap/port/include", 348 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/coap/libcoap/include", 349 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nghttp/port/include", 350 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nghttp/nghttp2/lib/includes", 351 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-tls", 352 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-tls/esp-tls-crypto", 353 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_adc_cal/include", 354 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hid/include", 355 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/tcp_transport/include", 356 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_http_client/include", 357 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_http_server/include", 358 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_https_ota/include", 359 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_https_server/include", 360 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_lcd/include", 361 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_lcd/interface", 362 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protobuf-c/protobuf-c", 363 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/common", 364 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/security", 365 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/transports", 366 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mdns/include", 367 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_local_ctrl/include", 368 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/sdmmc/include", 369 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_serial_slave_link/include", 370 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_websocket_client/include", 371 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/expat/expat/expat/lib", 372 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/expat/port/include", 373 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wear_levelling/include", 374 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/diskio", 375 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/vfs", 376 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/src", 377 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freemodbus/freemodbus/common/include", 378 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/idf_test/include", 379 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/idf_test/include/esp32c3", 380 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/jsmn/include", 381 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json/cJSON", 382 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/libsodium/libsodium/src/libsodium/include", 383 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/libsodium/port_include", 384 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mqtt/esp-mqtt/include", 385 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/openssl/include", 386 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/spiffs/include", 387 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wifi_provisioning/include", 388 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/rmaker_common/include", 389 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_diagnostics/include", 390 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/rtc_store/include", 391 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_insights/include", 392 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_parser/upstream/include", 393 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_parser/upstream", 394 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_generator/upstream", 395 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_schedule/include", 396 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp_secure_cert_mgr/include", 397 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rainmaker/include", 398 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/gpio_button/button/include", 399 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/qrcode/include", 400 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/ws2812_led", 401 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_littlefs/include", 402 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include", 403 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/tool", 404 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/typedef", 405 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/image", 406 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/math", 407 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/nn", 408 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/layer", 409 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/detect", 410 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/model_zoo", 411 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp32-camera/driver/include", 412 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp32-camera/conversions/include", 413 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/dotprod/include", 414 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/support/include", 415 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/support/mem/include", 416 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/include", 417 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/hann/include", 418 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman/include", 419 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman_harris/include", 420 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman_nuttall/include", 421 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/nuttall/include", 422 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/flat_top/include", 423 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/iir/include", 424 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/fir/include", 425 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/include", 426 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/add/include", 427 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/sub/include", 428 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/mul/include", 429 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/addc/include", 430 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/mulc/include", 431 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/sqrt/include", 432 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mul/include", 433 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/add/include", 434 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/addc/include", 435 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mulc/include", 436 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/sub/include", 437 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/include", 438 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/fft/include", 439 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/dct/include", 440 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/conv/include", 441 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/common/include", 442 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mul/test/include", 443 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/kalman/ekf/include", 444 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/kalman/ekf_imu13states/include", 445 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fb_gfx/include", 446 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/qio_qspi/include", 447 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/cores/esp32", 448 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/variants/esp32c3", 449 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src", 450 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src", 451 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src", 452 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src", 453 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src", 454 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src", 455 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src", 456 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src", 457 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src", 458 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src", 459 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src", 460 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdateServer/src", 461 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/I2S/src", 462 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/Insights/src", 463 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src", 464 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src", 465 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src", 466 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/RainMaker/src", 467 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/SD/src", 468 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src", 469 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src", 470 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src", 471 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src", 472 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/USB/src", 473 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/Update/src", 474 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src", 475 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src", 476 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src", 477 | "C:/Users/Admin/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src", 478 | "" 479 | ] 480 | }, 481 | "defines": [ 482 | "PLATFORMIO=60118", 483 | "ARDUINO_ESP32C3_DEV", 484 | "ARDUINO_USB_MODE=1", 485 | "ARDUINO_USB_CDC_ON_BOOT=1", 486 | "HAVE_CONFIG_H", 487 | "MBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\"", 488 | "UNITY_INCLUDE_CONFIG_H", 489 | "WITH_POSIX", 490 | "_GNU_SOURCE", 491 | "IDF_VER=\"v4.4.7-dirty\"", 492 | "ESP_PLATFORM", 493 | "_POSIX_READER_WRITER_LOCKS", 494 | "ARDUINO_ARCH_ESP32", 495 | "ESP32", 496 | "F_CPU=160000000L", 497 | "ARDUINO=10812", 498 | "ARDUINO_VARIANT=\"esp32c3\"", 499 | "ARDUINO_BOARD=\"Espressif ESP32-C3-DevKitM-1\"", 500 | "ARDUINO_PARTITION_default", 501 | "" 502 | ], 503 | "cStandard": "gnu99", 504 | "cppStandard": "gnu++11", 505 | "compilerPath": "C:/Users/Admin/.platformio/packages/toolchain-riscv32-esp/bin/riscv32-esp-elf-gcc.exe", 506 | "compilerArgs": [ 507 | "-march=rv32imc", 508 | "" 509 | ] 510 | } 511 | ], 512 | "version": 4 513 | } 514 | --------------------------------------------------------------------------------