Этап 1. Промежуточные результаты

This commit is contained in:
Maxim
2026-07-16 08:58:35 +03:00
parent 49e6c8f940
commit fff17a60b0
4 changed files with 154 additions and 18 deletions

View File

@@ -15,6 +15,7 @@
#define DEFAULT_PAUSE 2000 // Пауза между кадрами: 2000 мкс
#define BUF_SAMPLES 16384 // Размер буфера в отсчётах
#define MAX_PAYLOAD GF_CHUNK // 1024: размер чанка данных (== GF_CHUNK)
#define FB_RX_GAIN 50.0 // Усиление RX обратного канала (ручное), §10 п.7
// Внешняя переменная флага завершения (определена в common.c)
extern volatile sig_atomic_t stop;
@@ -30,10 +31,11 @@ int main(int argc, char *argv[]) {
float amp = DEFAULT_AMP;
const char *uri = TX_URI_DEFAULT;
int pause_us = DEFAULT_PAUSE, use_fec = 1, group_fec = 0;
long long fb_freq = 0; // 0 = симплекс; иначе FDD, LO обратного RX
// Обработка аргументов командной строки
int opt;
while ((opt = getopt(argc, argv, "f:r:b:g:a:p:u:c:Gh")) != -1) {
while ((opt = getopt(argc, argv, "f:r:b:g:a:p:u:c:F:Gh")) != -1) {
switch (opt) {
case 'f': freq = atoll(optarg); break;
case 'r': rate = atoll(optarg); break;
@@ -43,6 +45,7 @@ int main(int argc, char *argv[]) {
case 'p': pause_us = atoi(optarg); break;
case 'u': uri = optarg; break;
case 'c': use_fec = strcmp(optarg, "none") ? 1 : 0; break;
case 'F': fb_freq = atoll(optarg); break;
case 'G': group_fec = 1; break;
case 'h':
print_usage(argv[0], "ПЕРЕДАТЧИК");
@@ -51,6 +54,7 @@ int main(int argc, char *argv[]) {
fprintf(stderr, " -a АМПЛИТ. Амплитуда сигнала (по умолчанию: %.2f)\n", DEFAULT_AMP);
fprintf(stderr, " -p ПАУЗА Пауза между кадрами в мкс (по умолчанию: %d)\n", DEFAULT_PAUSE);
fprintf(stderr, " -G Групповой стирающий FEC 16+2 (§10 п.6)\n");
fprintf(stderr, " -F ЧАСТОТА FDD: частота обратного RX в Гц (§10 п.7). Без -F — симплекс\n");
fprintf(stderr, "\nОПТИМАЛЬНЫЙ ЗАПУСК:\n");
fprintf(stderr, " cat test.bin | %s -f %lld -r %lld -b %lld -c rs8 > /dev/null\n",
argv[0], DEFAULT_FREQ, DEFAULT_RATE, DEFAULT_BW);
@@ -69,19 +73,30 @@ int main(int argc, char *argv[]) {
fprintf(stderr, "Амплитуда: %.2f\n", amp);
fprintf(stderr, "Пауза: %d мкс\n", pause_us);
fprintf(stderr, "Group-FEC: %s\n", group_fec ? "16+2 (§10 п.6)" : "выкл");
fprintf(stderr, "Дуплекс: %s\n", fb_freq
? "FDD (обратный RX настроен, трафик — этап 2)" : "симплекс");
if (fb_freq) fprintf(stderr, "Обр. RX LO: %.1f МГц\n", fb_freq / 1e6);
fprintf(stderr, "URI: %s\n", uri);
fprintf(stderr, "═══════════════════════════════════════════════════\n");
// Инициализация PlutoSDR
// Инициализация PlutoSDR. С -F открываем оба cf-девайса и настраиваем оба
// LO (обратный RX пока только сконфигурирован; приём по нему — этап 2).
struct iio_context *ctx = NULL;
struct iio_device *phy = NULL, *tx = NULL;
if (pluto_init(uri, &ctx, &phy, &tx, 1) != 0) return 1;
// Настройка радиотракта
if (pluto_configure(phy, freq, rate, bw, gain, 1) != 0) {
LOG_ERROR("Настройка радиотракта не удалась");
iio_context_destroy(ctx);
return 1;
struct iio_device *phy = NULL, *tx = NULL, *rxfb = NULL;
if (fb_freq) {
if (pluto_init_fdd(uri, &ctx, &phy, &tx, &rxfb) != 0) return 1;
if (pluto_configure_fdd(phy, freq, fb_freq, rate, bw, gain, FB_RX_GAIN) != 0) {
LOG_ERROR("Настройка FDD-радиотракта не удалась");
iio_context_destroy(ctx);
return 1;
}
} else {
if (pluto_init(uri, &ctx, &phy, &tx, 1) != 0) return 1;
if (pluto_configure(phy, freq, rate, bw, gain, 1) != 0) {
LOG_ERROR("Настройка радиотракта не удалась");
iio_context_destroy(ctx);
return 1;
}
}
// Включение каналов передатчика