---
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`).
- **Регрессионные проверки существующей функциональности**:
  - веб‑страницы открываются, основные параметры (напряжение, ток, энергии, состояния коннектора) отображаются корректно;
  - сохранены привычные логи/формат сообщений (насколько возможно) для удобства отладки.

