if it breaks, I’m in the mountains

This commit is contained in:
2026-03-24 04:38:40 +03:00
parent 8574ffadc9
commit 14b4f0595f
64 changed files with 38499 additions and 39958 deletions

146
plan.md Normal file
View File

@@ -0,0 +1,146 @@
---
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 как заглушку**, но не использует старый GBTCAN.
## Архитектура на целевом проекте
- **Базовый проект**: берем за основу прошивку модуля 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/EStop остаётся из GBTпроекта,
- управление главным DCконтактором остаётся как в `[GbTModuleSW30Web](GbTModuleSW30Web/Core/Src/main.c)` и связанных файлах, но команды/состояния будут приходить из CCSлогики.
## План изменения `main.c` и ядра логики
- **Инициализация (startup)**:
- в `[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`).
- **Регрессионные проверки существующей функциональности**:
- веб‑страницы открываются, основные параметры (напряжение, ток, энергии, состояния коннектора) отображаются корректно;
- сохранены привычные логи/формат сообщений (насколько возможно) для удобства отладки.