--- name: gbt-to-ccs-port overview: Перенос прошивки модуля GBT на CCS с сохранением логики силовой части и веб-интерфейса, интеграцией готового CCS-стека из проекта CS60DC_CCS_STM32 и разделением двух независимых UART-протоколов. todos: - id: analyze-gbt-project content: Просмотреть проект `GbTModuleSW30Web` (main, PSU, CONN, LED, веб/диагностика) и зафиксировать все места, где используется GBT-логика (функции GBT_*, структуры, CAN2 и т.п.). status: completed - id: extract-ccs-modules content: Выделить из `CS60DC_CCS_STM32` полный набор CCS-модулей (cp, serial, charger_ccs, структуры CCS_EDCAN_*) и их зависимости (EDCAN, board, adc_filter) для переноса. status: completed - id: wire-cp-and-uart3 content: Спланировать привязку CP (ADC1_IN4 и PWM на PA7) и перенастройку CCS-протокола на USART3 в проекте модуля, учитывая текущую конфигурацию таймеров и UART в `GbTModuleSW30Web`. status: completed - id: rewrite-main-loop content: Спроектировать новое содержимое `main()` и `ED_Delay()` в `GbTModuleSW30Web`, убрав GBT-задачи и интегрировав CCS_SerialLoop, CP_Loop, EDCAN_Loop и существующие PSU/METER/CONN/LED/StopButton задачи. status: completed - id: clean-gbt-and-keep-can1 content: Определить, какие файлы/части кода GBT можно удалить или заглушить, при этом оставив инициализацию CAN1 и минимально необходимый код для корректной работы bootloader и EDCAN. status: completed - id: adapt-web-diagnostics content: "Наметить изменения веб-интерфейса и диагностического протокола: заменить источники данных с GBT на CCS-структуры, сохранив максимально существующую функциональность." status: in_progress - id: define-test-plan content: Уточнить и зафиксировать подробный тест-план для стендовой проверки новой CCS-прошивки (переходы состояний CP/EVSE, обмен по USART3, защитные сценарии и регрессия веб/диагностики). status: pending isProject: false --- ## Цель Сделать новую прошивку для платы модуля, основанную на проекте `GbTModuleSW30Web`, которая: - **полностью избавлена от GBT-логики и GBT-протоколов**, - **использует CCS-алгоритмы и протокол** из проекта `[CS60DC_CCS_STM32](CS60DC_CCS_STM32/Core/Src/main.c)`, - **сохраняет силовую часть и веб/диагностический функционал** существующей GBT-прошивки, - использует **два независимых UART**: существующий (как в GBT) + новый `USART3` под CCS-протокол, - сохраняет **инициализацию CAN1 как заглушку**, но не использует старый GBT‑CAN. ## Архитектура на целевом проекте - **Базовый проект**: берем за основу прошивку модуля GBT — `[GbTModuleSW30Web](GbTModuleSW30Web/Core/Src/main.c)`. - **Источник CCS-логики**: переносим state machine и протокол CCS из `[CS60DC_CCS_STM32](CS60DC_CCS_STM32/Core/Src/main.c)` и связанных файлов: - `[Core/Src/serial.c](CS60DC_CCS_STM32/Core/Src/serial.c)` — протокол MCU↔Everest (через UART, сейчас `huart1`), - `[Core/Src/cp.c](CS60DC_CCS_STM32/Core/Src/cp.c)` — формирование и измерение CP (PWM+ADC), - `[Core/Src/charger_ccs.c](CS60DC_CCS_STM32/Core/Src/charger_ccs.c)` + соответствующие заголовки и типы `CCS_*` и `CCS_EDCAN_*`. - **Распределение UART**: - существующий UART из GBT‑прошивки **оставляем без изменений** (диагностика / веб / что используется сейчас), - **добавляем `USART3` для CCS‑протокола**, берём настройки (baud, parity и т.п.) из `CS60DC_CCS_STM32` (там CCS сейчас сидит на `USART1`, но параметры переносим на `USART3`). - **CAN1**: - оставляем `MX_CAN1_Init()` и базовую инициализацию как заглушку (по требованию), - старые GBT‑обработчики CAN и `GBT_CAN_ReInit()` удаляем или заменяем пустыми/адаптированными вызовами к EDCAN при необходимости. - **Силовая часть, реле, измерения**: - логика `PSU_*`, `METER_*`, `CONN_*`, `LED_*` и Stop/E‑Stop остаётся из GBT‑проекта, - управление главным DC‑контактором остаётся как в `[GbTModuleSW30Web](GbTModuleSW30Web/Core/Src/main.c)` и связанных файлах, но команды/состояния будут приходить из CCS‑логики. ## План изменения `main.c` и ядра логики - **Инициализация (start‑up)**: - в `[GbTModuleSW30Web/Core/Src/main.c](GbTModuleSW30Web/Core/Src/main.c)` сохраняем логику OpenBLT/VectorBase (`VectorBase_Config()` и т.п.); - после стандартной HAL‑инициализации (`HAL_Init`, `HAL_RCC_DeInit`, `SystemClock_Config`, `MX_GPIO_Init` и т.д.) - оставляем инициализацию общих периферий: `GPIO`, `ADC1`, `CAN1`, `RTC`, `TIM4` (если используется для других задач), существующие UART (2/5/1) и `USART3`; - **убираем GBT‑специфичные инициализации**: `GBT_Init()`, `GBT_SetConfig()`, `GBT_CAN_ReInit()`, прямые вызовы `charger_gbt.h`, `j1939.h` и т.п.; - **добавляем CCS‑инициализации** по образцу из `CS60DC_CCS_STM32/Core/Src/main.c`: - `ADC_Init()` (если в проект переносится фильтрация АЦП / `adc_filter.c`), - `CP_Init()` и первоначальное `CP_SetDuty(100);`, - `CCS_Init();`, - инициализацию EDCAN/адреса: `EDCAN_Init(SW_GetAddr());` и возможный `CAN_ReInit();`, если EDCAN используется. - **Главный цикл**: - исходно в GBT‑прошивке основной цикл делает: - `PSU_ReadWrite();`, `PSU_Task();`, `METER_CalculateEnergy();`, `CONN_Loop();`, `LED_Write();`, `StopButtonControl();` и несколько `ED_Delay(...)`, в которых вызываются GBT‑таски (`GBT_ChargerTask()`, `GBT_ManageLockMotor()`, `CONN_CC_ReadStateFiltered()` и т.п.); - **заменяем содержимое `ED_Delay()` и цикла `while(1)` так, чтобы:** - в основном цикле выполнялись: - `CCS_SerialLoop();` (как в `[CS60DC_CCS_STM32/Core/Src/main.c](CS60DC_CCS_STM32/Core/Src/main.c)`), - `EDCAN_Loop();` (если EDCAN используется для обмена с главным контроллером), - `CP_Loop();` (обновление состояния CP и заполнение `CCS_EDCAN_Output.cpState`), - существующие `PSU_*`, `METER_*`, `CONN_Loop()`, `LED_Write()`, `StopButtonControl()`; - `ED_Delay()` больше **не опирается на GBT‑таски**, а, при необходимости, просто крутит `CCS_SerialLoop()` / `CP_Loop()` и необязательные сервисные задачи. ## Интеграция CCS‑протокола в проект модуля - **Перенос файлов CCS**: - добавляем в проект модуля исходники и заголовки из `CS60DC_CCS_STM32`: - `[Core/Src/cp.c](CS60DC_CCS_STM32/Core/Src/cp.c)` + `Core/Inc/cp.h`, - `[Core/Src/serial.c](CS60DC_CCS_STM32/Core/Src/serial.c)` + `Core/Inc/serial.h`, - `[Core/Src/charger_ccs.c](CS60DC_CCS_STM32/Core/Src/charger_ccs.c)` + `Core/Inc/charger_ccs.h`, - необходимые типы `CCS_*` и `CCS_EDCAN_*` (структуры состояний, входов/выходов, команд). - подправляем include‑пути и зависимости под структуру каталогов `GbTModuleSW30Web`. - **Привязка к `USART3`**: - в перенесённом `serial.c` заменяем все использования `huart1` на `huart3`: - глобальный `extern UART_HandleTypeDef huart1;` → `huart3;`, - `HAL_UARTEx_ReceiveToIdle_IT(&huart1, ...)` → `&huart3`, - `HAL_UART_Transmit(&huart1, ...)` → `&huart3`; - обновляем `HAL_UARTEx_RxEventCallback` так, чтобы он реагировал на `huart3`; - убеждаемся, что `MX_USART3_UART_Init()` в `GbTModuleSW30Web/Core/Src/usart.c` настроен на тот же baud/формат, что и `USART1` в `CS60DC_CCS_STM32`. - **CP‑цепь (CP ADC + PWM на PA7)**: - в переносимом `cp.c` уже есть логика расчёта напряжения CP по `ADC_CP_CHANNEL` и управление PWM через `TIM2`; - на целевой плате: - настраиваем канал ADC, соответствующий `ADC1_IN4`, как `ADC_CP_CHANNEL` в конфигурационных файлах/enum‑ах ADC; - убеждаемся, что ножка `PA7` привязана к нужному таймеру (по CubeMX‑конфигу) и совпадает с тем, что ожидает `cp.c` (сейчас TIM2/CH1/CH2) — при необходимости в план добавим правку конфигурации таймера и каналов; - оставляем границы состояний CP (A/B/C/D/E/F) и формулы из текущего `cp.c` без изменений, чтобы поведение соответствовало проверенной CCS‑прошивке. - **Связка CCS ↔ силовая часть/EDCAN**: - `CCS_SerialLoop()` управляет структурами `CCS_EDCAN_Output` и читает `CCS_EDCAN_Input`; - в коде модуля (там, где сейчас GBT‑логика связывает CAN/силовую часть с протоколом) заменяем связь на работу с `CCS_EDCAN_*`: - измеренные ток/напряжение из силовой части кладём в `CCS_EDCAN_Input.measuredVoltage` и `measuredCurrent`, - команды включения/отключения питания (`PSU_ON/OFF/PREPARE`) и ошибки записываем в `CCS_EDCAN_Input.*`, - из `CCS_EDCAN_Output` читаем: - `enablePSU`/`requestedVoltage`/`requestedCurrent` — для управления источником питания, - `connectorState`, `cpState`, `chargingPercentage` — для индикации, логов и веб‑интерфейса. ## Удаление GBT и чистка кода - **Удаление GBT‑зависимостей**: - в `GbTModuleSW30Web` находим и удаляем/отключаем: - `#include "charger_gbt.h"`, `j1939.h`, GBT‑специфические модули блокировки/замка, если они не используются механически; - функции `GBT_Init()`, `GBT_ChargerTask()`, `GBT_ManageLockMotor()`, `GBT_SetConfig()`, `GBT_CAN_ReInit()` и т.п.; - оставляем общий код, не завязанный именно на GBT (питание, измерения, коннектор, индикация, веб‑сервер, логирование). - **CAN**: - инициализация `CAN1` (`MX_CAN1_Init()`) должна остаться, чтобы bootloader/система не сломались; - если от GBT остался `CAN2`, его можно выключить из конфигурации, если он аппаратно не используется в CCS‑варианте; - при необходимости добавляем простую заглушку вместо старых GBT‑обработчиков, чтобы сборка прошла без ошибок. ## Сохранение веб‑/диагностического функционала - **Веб‑интерфейс и диагностика**: - по вашему требованию **сохраняем весь существующий веб‑функционал `GbTModuleSW30Web`**, только: - удаляем/переписываем поля и страницы, завязанные на GBT‑состояния/параметры, - вместо GBT‑переменных и структур подставляем данные из `CCS_EDCAN_Output`, `CCS_State`, `CCS_EvInfo` и т.п.; - протокол диагностики через существующий UART не меняем по формату, только отключаем GBT‑команды/состояния и, при необходимости, добавляем новые поля/команды под CCS (по согласованию). ## Тестирование и критерии приёмки - **Юнит‑/модульные проверки на стенде**: - запуск прошивки без подключенного EV — проверка, что станция в состоянии `Unplugged`/`EV_STATE_A_IDLE`, нет перезагрузок и ошибок; - подключение EV/эмулятора: - проверка переходов CP‑состояний A→B→C, корректных значений напряжения CP, - проверка, что `CCS_ConnectorState` и `CCS_EvseState` меняются ожидаемо (Preparing, Charging, Finished и т.п.); - проверка обмена по `USART3`: - корректный приём/передача пакетов с CRC16, - реакция на команды Everest (ENABLE, START/STOP, PWM_DUTY, SET_OUTPUT_VOLTAGE, EV_INFO, EVSE_STATE, KEEP_ALIVE); - проверка защиты: - ESTOP/StopButton — немедленное отключение выхода и отправка `CCS_SendEmergencyStop()`; - таймаут связи с хостом (`last_host_seen`) — перевод в безопасное состояние (отключение PSU, CP duty = 100%, лог `Everest timeout`). - **Регрессионные проверки существующей функциональности**: - веб‑страницы открываются, основные параметры (напряжение, ток, энергии, состояния коннектора) отображаются корректно; - сохранены привычные логи/формат сообщений (насколько возможно) для удобства отладки.