🎮 Crossfire Protocol Decoder

Декодирование кадров протокола CRSF (TBS Crossfire / ExpressLRS)

📊 Результат декодирования

❌ Ошибка: {{ error }}
🔹 Sync Byte (Адрес): {{ decoded.syncByte }} {{ decoded.addressName }} ({{ decoded.addressDescription }})
📏 Frame Length: {{ decoded.frameLength }} байт (Type + Payload + CRC)
📦 Type: {{ decoded.type }} {{ decoded.typeName }}
🎯 Destination Address: {{ decoded.destAddr }} {{ decoded.destName }} ({{ decoded.destDescription }})
📡 Origin Address: {{ decoded.originAddr }} {{ decoded.originName }} ({{ decoded.originDescription }})
💾 Payload: {{ decoded.payload }}
✅ CRC8: {{ decoded.crc }} ✓ CRC valid ✗ CRC invalid
📡 ELRS Link Status (DATA_ID_VAR_SEND):
📋 Детали:
Подтип кадра: 0x{{ decoded.elrsLinkStatus.subType.toString(16).toUpperCase() }}
Статическое значение: {{ decoded.elrsLinkStatus.staticValue }} ({{ decoded.elrsLinkStatus.staticValueDec }})
Динамические данные (сырые): LQ=0x{{ decoded.elrsLinkStatus.lqRawHex }}, RSSI=0x{{ decoded.elrsLinkStatus.rssiRawHex }}
📻 Radio ID Data:
Serial Number: {{ decoded.radioIdData.serialNumber }}
Hardware Version: {{ decoded.radioIdData.hwVersion }}
Software Version: {{ decoded.radioIdData.swVersion }}
Reserved: {{ decoded.radioIdData.reserved }}
🖥️ Device Info (DEVICE_INFO):
Модель передатчика: {{ decoded.deviceInfo.deviceName }}
Серийный номер / ID: {{ decoded.deviceInfo.serialNumber }}
Количество параметров: {{ decoded.deviceInfo.parameterCount + 1 }} (0x{{ decoded.deviceInfo.parameterCount.toString(16).toUpperCase() }} + 1)
⚙️ Parameter Access ({{ decoded.parameterAccess.operation === 'чтение' ? 'PARAMETER_READ' : 'PARAMETER_WRITE' }}):
Параметр: {{ decoded.parameterAccess.paramIndex }} ({{ decoded.parameterAccess.paramDisplay }})
Чанк: {{ decoded.parameterAccess.chunkIndex }} ({{ decoded.parameterAccess.chunkDisplay }})
Сырые данные payload: {{ decoded.parameterAccess.raw }}
🎮 RC Channels (16 каналов, 11 бит):
CH{{ (idx + 1).toString().padStart(2, '0') }}: {{ ch }} ({{ (ch / 2047 * 100).toFixed(1) }}%)
⚠️ Предупреждение: {{ decoded.crcWarning }}
📄 Сырые данные:
Байты (DEC): {{ decoded.rawBytes.join(' ') }}
Байты (HEX): {{ decoded.rawBytes.map(b => '0x' + b.toString(16).toUpperCase().padStart(2, '0')).join(' ') }}
Длина пакета: {{ decoded.rawBytes.length }} байт
Длина полезной нагрузки: {{ decoded.payload.split(' ').length }} байт

📖 Справка по протоколу CRSF

📡 ELRS Link Status (кадр 0x3A / RADIO_ID с подтипом 0x10):

EA 0D 3A EA EE 10 00 00 9C 40 FF FF LQ RSSI CRC
00 00 9C 40 = 40000 → Packet Rate = 250 Hz (закодированный режим)
LQ (1 байт) = сырое значение качества линка (0-255) → LQ% = (Raw / 255) * 100%
RSSI (1 байт) = сырое значение уровня сигнала → RSSI (дБм) = (Raw / 255) * 120 - 130
SNR = соотношение сигнал/шум (вычисляется из RSSI и шума)

🏷️ Адреса устройств (Sync Byte):

0x{{ item.addr.toString(16).toUpperCase().padStart(2, '0') }} ({{ item.addr }}) {{ item.name }}

📋 Типы кадров (Frame Type):

0x{{ item.type.toString(16).toUpperCase().padStart(2, '0') }} ({{ item.type }}) {{ item.name }}

🔧 Структура кадра CRSF:

Broadcast Frame:
[Sync] [Length] [Type] [Payload] [CRC]
Extended Header Frame (для типов: DEVICE_PING, DEVICE_INFO, PARAMETER_*, COMMAND, RADIO_ID):
[Sync] [Length] [Type] [Dest] [Origin] [Payload] [CRC]
CRC алгоритм: CRC8 с полиномом 0xD5
x⁷ + x⁶ + x⁴ + x² + x⁰
Порядок байт: Big Endian (MSB first)
Макс. длина кадра: 64 байта (включая Sync и CRC)