# Конфигурация приложения (Configuration)

Для запуска **NMOS AGENT** используется JSON-файл конфигурации. Путь к нему передаётся первым аргументом при запуске приложения:

```bash
sudo ./build/nmos_agent config.json
```

Пример конфигурационного файла:

```json
{
    "boardConfigs": [
        {
            "softwareID": 210017,
            "txDupEnabled": true,
            "interface_input_streams": "[1-2]",
            "interface_output_streams": "[1-2]"
        }
    ],
    "extraIp_is_05": [
        "172.22.129.174"
    ],
    "dst_ip": [
        "[232.0.0.1-232.0.0.34]",
        "[232.0.1.1-232.0.1.34]"
    ]
}
```

---

## `boardConfigs`

Поле `boardConfigs` содержит конфигурацию используемых плат FD2110.

Поле представляет собой **массив объектов**, где каждый объект содержит настройки отдельной платы:

```json
"boardConfigs": [
    {
        ...
    }
]
```

Для каждой используемой платы необходимо добавить отдельный объект конфигурации.

Пример конфигурации нескольких плат:

```json
"boardConfigs": [
    {
        "softwareID": 210017,
        "txDupEnabled": true,
        "interface_input_streams": "[1-2]",
        "interface_output_streams": "[1-2]"
    },
    {
        "softwareID": 210018,
        "txDupEnabled": true,
        "interface_input_streams": "[1-4]",
        "interface_output_streams": "[1-4]"
    }
]
```

Значения `softwareID` внутри массива не должны повторяться.

---

## `softwareID`

```json
"softwareID": 210017
```

Уникальный идентификатор платы FD2110, для которой задаётся конфигурация.

Поле является **обязательным**.

Текущая реализация допускает запись `softwareID` как целого числа:

```json
"softwareID": 210017
```

или как строки:

```json
"softwareID": "210017"
```

Рекомендуется использовать числовую запись.

Для каждой платы в `boardConfigs` должен быть указан уникальный `softwareID`.

---

## `txDupEnabled`

```json
"txDupEnabled": true
```

Определяет режим дублирования интерфейсов платы.

Поле является **обязательным** и принимает только логические значения:

```json
true
```

или:

```json
false
```

От значения `txDupEnabled` зависит набор параметров, используемых для настройки виртуальных портов.

### `txDupEnabled = true`

При включённом дублировании используются поля:

```text
interface_input_streams
interface_output_streams
```

Пример:

```json
{
    "softwareID": 210017,
    "txDupEnabled": true,
    "interface_input_streams": "[1-2]",
    "interface_output_streams": "[1-2]"
}
```

### `txDupEnabled = false`

При выключенном дублировании настройки виртуальных портов задаются отдельно для двух интерфейсов платы:

```text
interface1_input_streams
interface1_output_streams
interface2_input_streams
interface2_output_streams
```

Пример:

```json
{
    "softwareID": 210017,
    "txDupEnabled": false,
    "interface1_input_streams": "[1-2]",
    "interface1_output_streams": "[1-2]",
    "interface2_input_streams": "[3-4]",
    "interface2_output_streams": "[3-4]"
}
```

---

## Настройка виртуальных портов

Для выбора активных виртуальных портов используются строковые параметры.

При `txDupEnabled = true`:

```text
interface_input_streams
interface_output_streams
```

При `txDupEnabled = false`:

```text
interface1_input_streams
interface1_output_streams
interface2_input_streams
interface2_output_streams
```

Номера виртуальных портов находятся в диапазоне **от 1 до 16**.

### Формат записи

Один виртуальный порт:

```json
"interface_input_streams": "[1]"
```

Диапазон портов:

```json
"interface_input_streams": "[1-4]"
```

Несколько диапазонов:

```json
"interface_input_streams": "[1-2], [4]"
```

Комбинированная запись:

```json
"interface_input_streams": "[1-2], [3], [5-6]"
```

Таким образом, поддерживаются конструкции:

```text
[N]
[N-M]
[N-M], [N]
[N-M], [N], [N-M]
```

где `N` и `M` — номера виртуальных портов от `1` до `16`.

Диапазоны необходимо указывать в порядке возрастания.

Например:

```json
"interface_input_streams": "[1-2], [4], [6-8]"
```

Пробелы между диапазонами допускаются.

Также допускается пустая строка:

```json
"interface_input_streams": ""
```

В этом случае соответствующие виртуальные порты останутся выключенными.

Если необходимое поле настройки виртуальных портов отсутствует, соответствующие порты также остаются выключенными.

---

## Пример с включённым дублированием

При `txDupEnabled = true` используется общий набор входных и выходных виртуальных портов:

```json
{
    "softwareID": 210017,
    "txDupEnabled": true,
    "interface_input_streams": "[1-2], [5-6]",
    "interface_output_streams": "[1-4]"
}
```

---

## Пример с выключенным дублированием

При `txDupEnabled = false` виртуальные порты двух интерфейсов задаются независимо:

```json
{
    "softwareID": 210017,
    "txDupEnabled": false,

    "interface1_input_streams": "[1-2]",
    "interface1_output_streams": "[1-4]",

    "interface2_input_streams": "[5-6]",
    "interface2_output_streams": "[5-8]"
}
```

---

## `extraIp_is_05`

```json
"extraIp_is_05": [
    "172.22.129.174"
]
```

Поле содержит дополнительные IP-адреса сетевых интерфейсов, используемые для работы **NMOS IS-05 Connection API**.

Дополнительные адреса позволяют передать приложению информацию о сетевых интерфейсах даже в случае, если соответствующие порты непосредственно на плате не включены.

Поле имеет тип **массив строк**:

```json
"extraIp_is_05": [
    "172.22.129.174",
    "172.22.129.175"
]
```

Каждый элемент массива должен содержать корректный IP-адрес в строковом формате.

Поле `extraIp_is_05` является **необязательным**.

---

## `dst_ip`

Поле `dst_ip` содержит набор IP-адресов, которые приложение использует для автоматического назначения destination IP для Sender и Receiver.

Поле является **обязательным** и представляет собой массив строк.

Пример:

```json
"dst_ip": [
    "[232.0.0.1-232.0.0.34]",
    "[232.0.1.1-232.0.1.34]"
]
```

Каждый элемент массива может содержать один IP-адрес:

```json
"dst_ip": [
    "[232.0.0.1]"
]
```

или диапазон IP-адресов:

```json
"dst_ip": [
    "[232.0.0.1-232.0.0.34]"
]
```

Для нескольких диапазонов используются отдельные элементы массива:

```json
"dst_ip": [
    "[232.0.0.1-232.0.0.34]",
    "[232.0.1.1-232.0.1.34]"
]
```

Диапазоны должны быть указаны в порядке возрастания IP-адресов.

В текущей реализации для `dst_ip` используются **IPv4-адреса**.

---

## Требуемое количество `dst_ip`

Количество доступных адресов в `dst_ip` должно быть не меньше:

```text
количество включённых виртуальных портов × 2
```

Для каждого активного виртуального порта требуется два IP-адреса:

```text
1 IP — Video
1 IP — Audio
```

При подсчёте учитываются включённые входные и выходные виртуальные порты.

Например:

```json
"interface_input_streams": "[1-2]",
"interface_output_streams": "[1-2]"
```

В данной конфигурации включено:

```text
2 входных порта
+
2 выходных порта
=
4 виртуальных порта
```

Следовательно, в `dst_ip` должно быть доступно минимум:

```text
4 × 2 = 8 IP-адресов
```

Если количество доступных IP-адресов меньше требуемого, конфигурация считается некорректной.

---

## Полный пример с включённым дублированием

```json
{
    "boardConfigs": [
        {
            "softwareID": 210017,
            "txDupEnabled": true,
            "interface_input_streams": "[1-2]",
            "interface_output_streams": "[1-2]"
        }
    ],
    "extraIp_is_05": [
        "172.22.129.174"
    ],
    "dst_ip": [
        "[232.0.0.1-232.0.0.34]",
        "[232.0.1.1-232.0.1.34]"
    ]
}
```

---

## Полный пример с выключенным дублированием

```json
{
    "boardConfigs": [
        {
            "softwareID": 210017,
            "txDupEnabled": false,
            "interface1_input_streams": "[1-2]",
            "interface1_output_streams": "[1-2]",
            "interface2_input_streams": "[3-4]",
            "interface2_output_streams": "[3-4]"
        }
    ],
    "extraIp_is_05": [
        "172.22.129.174"
    ],
    "dst_ip": [
        "[232.0.0.1-232.0.0.34]",
        "[232.0.1.1-232.0.1.34]"
    ]
}
```
