# Устройство эмуляции CAN-ошибок

Устройство предназначено для генерации CAN-кадров с возможностью намеренного внесения ошибок в различные поля кадра. Это позволяет тестировать устойчивость и обработку ошибок в CAN-сетях, а также проверять поведение принимающих устройств.

---

## Основные возможности

В папке **can_emul_term** находится терминалка для генерации CAN-кадров


В вкладке setup настраивается обмен по Modbus:
- Выбирается COM порт для общения с STM
- Выбирается период опроса Modbus
- Скорость 115200 bps, 1 stop bit, none parity, none flow control

В вкладке CAN EMULATOR настраивается скорость CAN, период посылок и CAN фрейм.

Возможности:
- Передача данных по регистрам океана.
- Генерация рандомного ID в CAN-кадре.
- Генерация **стандартных** (11-бит ID) и **расширенных** (29-бит ID) CAN-кадров.
- Передача данных с заданным **битрейтом** (напр. 125 / 250 / 500 / 1000 Кбит/с).
- Возможность **внесения ошибок**:
  - Инверсия полей **IDE**, **RTR**, **SRR**, **r1**, **r0**.
  - Инверсия одного бита **данных** или **ID**.
  - Ошибка **CRC**.
  - Отключение **бит-стаффинга** (stuff bits).
- Работа в двух режимах: **одиночный кадр** или **периодическая отправка**.

---


# Для разработчика
## Структура управления

Устройство управляется через **Modbus-регистр**, состоящий из:
- **Коилов (флагов)** — включение функций и ошибок.
- **Холдинг-регистров** — задание параметров кадра.

---

### Холдинг-регистры
Настройка параметров CAN:
| Название поля              | Адрес | Описание |
|----------------------------|-------|----------|
| `CAN_BITRATE_KBPS`         | 0     | Битрейт CAN в Кбит/с |
| `CAN_PERIOD`               | 1     | Интервал отправки в мс (если включен `START_POLLING`) |

Настройка CAN-кадра:
| Название поля              | Адрес | Описание |
|----------------------------|-------|----------|
| `CAN_ID_HI`                | 2     | Старшая часть CAN ID |
| `CAN_ID_LO`                | 3     | Младшая часть CAN ID |
| `CAN_DLC`                  | 4     | Длина данных (0–8 байт) |
| `CAN_DATA_0` ... `CAN_DATA_7` | 16–23 | Данные для передачи (до 8 байт) |

На будущее:
| Название поля              | Адрес | Описание |
|----------------------------|-------|----------|
| `DATA_UNIX_HI`             | 64     | Время в системе UNIX (старшое слово) |
| `DATA_UNIX_LO`             | 65     | Время в системе UNIX (младшее слово) |

### Адреса коилов
Для управления CAN:
| Название поля              | Адрес            | Описание |
|----------------------------|------------------|----------|
| `START_POLLING`            | 0                | Запуск периодической отправки |
| `START_SINGLE_FRAME`       | 1                | Однократная отправка кадра |
| `HEADER_IDE`               | 2                | Режим кадра: 0 = стандартный, 1 = расширенный |
| `HEADER_RTR`               | 3                | Remote Transmission Request (1 = запрос) |


Для выставления ошибок:
| Название поля              | Адрес            | Описание |
|----------------------------|------------------|----------|
| `FLIP_SRS`                 | 16               | Инвертировать SRR-бит |
| `FLIP_IDE`                 | 17               | Инвертировать IDE |
| `FLIP_RTR`                 | 18               | Инвертировать RTR |
| `FLIP_R1`                  | 19               | Инвертировать r1 |
| `FLIP_R0`                  | 20               | Инвертировать r0 |
| `FLIP_MSGID_BIT`           | 21               | Инвертировать старший бит ID |
| `FLIP_DATA_BIT`            | 22               | Инвертировать один бит данных |
| `FLIP_CRC_BIT`             | 23               | Инвертировать CRC |
| `DISABLE_STUFF_BITS`       | 24               | Отключить вставку stuff-битов |


---

## Как пользоваться

### Шаг 1. Настройка параметров кадра
Заполните следующие поля:
- `CAN_BITRATE_KBPS` — битрейт шины (например, 500).
- `CAN_ID_HI`, `CAN_ID_LO` — идентификатор кадра.
- `HEADER_IDE` — выбор типа кадра:
  - 0 — стандартный (11 бит).
  - 1 — расширенный (29 бит).
- `HEADER_RTR` — тип кадра:
  - 0 — data frame.
  - 1 — remote request.
- `CAN_DLC` — количество байт данных (0–8).
- `CAN_DATA_0` ... `CAN_DATA_7` — данные кадра.

### Шаг 2. Включение ошибок (опционально)
Установите нужные флаги в коилах:
- Для инверсии полей (например, IDE, CRC и др.).
- Для отключения бит-стаффинга.

### Шаг 3. Отправка кадра
Выберите один из вариантов:
- Установите `START_SINGLE_FRAME` в 1 — для однократной отправки кадра.
- Установите `START_POLLING` в 1 — для периодической отправки.
  - Задайте интервал через `CAN_PERIOD`.

> **Примечание:** Если задан слишком маленький `CAN_PERIOD`, он автоматически будет ограничен минимальным значением (`CAN_MIN_PERIOD` в прошивке).

---

## Примеры

### Пример 1: Стандартный кадр, ID = 0x123, 2 байта данных
```
CAN_BITRATE_KBPS      = 500
CAN_ID_HI             = 0x0000
CAN_ID_LO             = 0x0123
HEADER_IDE            = 0
HEADER_RTR            = 0
CAN_DLC               = 2
CAN_DATA_0            = 0x11
CAN_DATA_1            = 0x22
START_SINGLE_FRAME    = 1
```

### Пример 2: Расширенный кадр с ошибкой CRC и отключенным стаффингом
```
CAN_BITRATE_KBPS      = 500
CAN_ID_HI             = 0x001D
CAN_ID_LO             = 0xABCD
HEADER_IDE            = 1
HEADER_RTR            = 0
CAN_DLC               = 8
CAN_DATA_0...7        = 0xAA, 0xBB, ...
FLIP_CRC_BIT          = 1
DISABLE_STUFF_BITS    = 1
START_SINGLE_FRAME    = 1
```

---
