Files
viktor b5a8e92e45 DMR-данные (SMS) на TYT MD-UV380 под OpenGD77
Восстановлено из транскрипта сессии после потери рабочего дерева на сервере сборки.

Что внутри:
- четыре новых модуля прошивки (приём, сборка исходящего, меню Messages);
- правки существующих файлов в виде скриптов, с порядком применения;
- инструменты стенда: снятие экрана рации по USB, дамп кадров, эталонная сборка пакета;
- NOTES.md: что проверено в эфире, что не доделано, где грабли.

Работало в эфире в августе 2026: данные ходят в обе стороны в режиме хотспота,
рация принимает SMS и показывает на экране. Отправка собрана и сверена с эталоном
сервера побайтово, но в эфире не проверялась.

Claude-Session: https://claude.ai/code/session_01GJtvG5WwqYNe1b7s9LLtgy
2026-09-11 02:39:24 +09:00

63 строки
2.4 KiB
Python

#!/usr/bin/env python3
"""Patch 1 of RX support: new RX event type + Slot Type encoder."""
W = "/home/viktor/ogd77rel/uv_src/OpenGD77_MDUV380_DM1701_20260130/MDUV380_firmware/application"
# --- 1. new RX event type -------------------------------------------------
p = W + "/include/functions/hotspot.h"
s = open(p).read()
if "HOTSPOT_RX_DATA_FRAME" not in s:
a = "\tHOTSPOT_RX_STOP,\n"
assert a in s, "RX enum anchor missing"
s = s.replace(a, a + "\tHOTSPOT_RX_DATA_FRAME,// a packet data burst (SMS etc) was received off air\n", 1)
open(p, "w").write(s)
print("hotspot.h: RX event added")
else:
print("hotspot.h: already has RX event")
# --- 2. bring the Slot Type encoder over from the older MK22 branch -------
src = open("/home/viktor/OpenGD77/firmware/source/hotspot/DMRSlotType.c").read()
start = src.index("static const uint16_t ENCODING_TABLE_2087[] =")
table = src[start:src.index("};", start) + 2]
p = W + "/source/functions/hotspot.c"
s = open(p).read()
if "ENCODING_TABLE_2087" in s:
print("hotspot.c: encoder already present")
raise SystemExit(0)
anchor = "static void BPTCencode(const uint8_t *inputData, uint8_t *outputData)\n{"
assert anchor in s, "BPTCencode definition not found"
header = (
"// Slot Type encoder, needed to build received data bursts for the host.\n"
"// Golay(20,8) table and logic come from the project's own DMRSlotType implementation\n"
"// (present in the MK22 branch, absent here because stock firmware never sent data).\n"
)
func = """
// Writes colour code + data type (FEC protected) into the Slot Type half-bursts of a frame.
static void DMRSlotTypeEncode(uint32_t colorCode, uint32_t dataType, uint8_t *frame)
{
\tuint8_t slotType[3];
\tslotType[0] = (colorCode << 4) & 0xF0U;
\tslotType[0] |= (dataType << 0) & 0x0FU;
\tuint16_t cksum = ENCODING_TABLE_2087[slotType[0]];
\tslotType[1] = (cksum >> 0) & 0xFFU;
\tslotType[2] = (cksum >> 8) & 0xFFU;
\tframe[12] = (frame[12] & 0xC0U) | ((slotType[0] >> 2) & 0x3FU);
\tframe[13] = (frame[13] & 0x0FU) | ((slotType[0] << 6) & 0xC0U) | ((slotType[1] >> 2) & 0x30U);
\tframe[19] = (frame[19] & 0xF0U) | ((slotType[1] >> 2) & 0x0FU);
\tframe[20] = (frame[20] & 0x03U) | ((slotType[1] << 6) & 0xC0U) | ((slotType[2] >> 2) & 0x3CU);
}
"""
s = s.replace(anchor, header + table + func + anchor, 1)
open(p, "w").write(s)
print("hotspot.c: slot type encoder added (table %d bytes)" % len(table))