# Serial protocol (GbTModuleEV)

Актуальная версия протокола для `USART2` (binary packet + CRC32).

## 1. Транспорт и формат пакета

- Интерфейс: `USART2`
- Скорость/параметры UART: задаются в CubeMX (`usart.c`)
- Направление (RS485 DIR): управляется прошивкой через `USART2_DIR`

Формат **команды от хоста**:

1. `command` (1 byte)
2. `argument` (`N` bytes, может быть 0)
3. `crc32` (4 bytes, little-endian) по данным `command + argument`

Формат **ответа от устройства**:

1. `response_code` (1 byte) — обычно код ответа или код команды для data-response
2. `payload` (`N` bytes, может быть 0)
3. `crc32` (4 bytes, little-endian) по данным `response_code + payload`

### CRC

- CRC-32 (software), полином: `0xEDB88320`
- Init: `0xFFFFFFFF`
- Final XOR: `0xFFFFFFFF`
- Порядок CRC-байтов в пакете: little-endian

### Коды ответа

- `0x12` = `RESP_SUCCESS`
- `0x13` = `RESP_FAILED`
- `0x14` = `RESP_INVALID` (ошибка формата/CRC)

---

## 2. Команды (host -> device)

## 2.1 Read-only

- `0x01` `CMD_GET_INFO`
  - Arg: none
  - Response: `response_code = 0x01`, payload = `InfoPacket_t`

- `0x02` `CMD_GET_GBT_STATUS`
  - Arg: none
  - Response: `response_code = 0x02`, payload = `GBT_MonitorPacket_t`

- `0x03` `CMD_GET_CCS_STATUS`
  - Arg: none
  - Response: `response_code = 0x03`, payload = `CCS_MonitorPacket_t`

## 2.2 GBT control

- `0x10` `CMD_GBT_CC_ENABLE`
  - Arg: `uint8_t enable` (`0/1`)
  - Action: `RELAY_CC` write
  - Ack: `RESP_SUCCESS/RESP_FAILED`

- `0x11` `CMD_GBT_STOP`
  - Arg: none
  - Action: `CONN[0].connControl = CMD_STOP`
  - Ack: `RESP_SUCCESS/RESP_FAILED`

- `0x12` `CMD_GBT_SET_SOC`
  - Arg: `uint8_t soc`
  - Action: `CONN[0].SOC = soc`
  - Ack: `RESP_SUCCESS/RESP_FAILED`

- `0x13` `CMD_GBT_SET_REQUEST`
  - Arg: `EvSetLimits_t`
    - `uint16_t requestedVoltage`
    - `uint16_t requestedCurrent`
  - Action: запись в `CONN[0].RequestedVoltage/RequestedCurrent`
  - Ack: `RESP_SUCCESS/RESP_FAILED`

- `0x14` `CMD_GBT_ENABLE_LOAD`
  - Arg: `uint8_t enable` (`0/1`)
  - Action:
    - `CONN[0].enableLoad`
    - `CONN[0].ContactorEnabled`
  - Ack: `RESP_SUCCESS/RESP_FAILED`

- `0x18` `CMD_GBT_SET_VIN`
  - Arg: `uint8_t vin[17]`
  - Action: копирование в `GBT_EVInfo.EVIN`
  - Ack: `RESP_SUCCESS/RESP_FAILED`

## 2.3 CCS control

- `0x20` `CMD_CCS_SET_STATE`
  - Arg: `uint8_t cp_state_enum`
  - Action: `cp_state = (CP_State_t)arg`
  - Ack: `RESP_SUCCESS/RESP_FAILED`

- `0x24` `CMD_CCS_ENABLE_LOAD`
  - Arg: `uint8_t enable` (`0/1`)
  - Action:
    - `CONN[1].enableLoad`
    - `CONN[1].ContactorEnabled`
  - Ack: `RESP_SUCCESS/RESP_FAILED`

---

## 3. Payload structures (packed)

Все структуры передаются как `__attribute__((packed))`, little-endian для multi-byte полей.

### 3.1 `InfoPacket_t` (GET_INFO)

- `uint16_t serialNumber`
- `uint8_t boardVersion`
- `uint8_t stationType`
- `uint16_t fw_version_major`
- `uint16_t fw_version_minor`
- `uint16_t fw_version_patch`

### 3.2 `GBT_MonitorPacket_t` (GET_GBT_STATUS)

- `uint8_t connector_type` (`0x01`)
- `uint16_t requestedVoltage`
- `uint16_t requestedCurrent`
- `uint16_t measuredVoltageSE`
- `uint16_t measuredCurrentSE`
- `uint16_t measuredVoltage`
- `uint16_t measuredCurrent`
- `uint8_t cc_enabled`
- `uint8_t contactorEnabled`
- `CONN_Error_t chargingError` (`uint8_t`)
- `uint8_t EvseConnected`
- `uint8_t soc`
- `uint8_t vin[17]`
- `uint8_t cc_state`
- `CONN_State_t connState` (`uint8_t`)

### 3.3 `CCS_MonitorPacket_t` (GET_CCS_STATUS)

- `uint8_t connector_type` (`0x02`)
- `uint16_t measuredVoltage`
- `uint16_t measuredCurrent`
- `uint8_t cp_enabled`
- `uint8_t contactorEnabled`
- `CONN_Error_t chargingError` (`uint8_t`)
- `uint8_t EvseConnected`
- `uint8_t soc`
- `uint8_t cp_state`
- `uint8_t cp_pwm_duty`
- `CONN_State_t connState` (`uint8_t`)

---

## 4. Валидация команд

- Для каждой команды проверяется `argument_length` (по фактическому размеру аргумента).
- Если длина неверная: ответ `RESP_FAILED`.
- Если пакет не проходит parse/CRC: ответ `RESP_INVALID`.

---

## 5. Пример (логический)

`CMD_GBT_SET_SOC = 0x12`, `soc = 80`:

- TX body: `[0x12, 0x50]`
- TX full: `[0x12, 0x50, crc0, crc1, crc2, crc3]`
- RX (ack): `[0x12, crc0, crc1, crc2, crc3]`

