151 lines
6.4 KiB
C
151 lines
6.4 KiB
C
/**
|
||
* common.h — Общие определения и конфигурация для приёмника и передатчика
|
||
* OFDM + RS(255,223) FEC + PlutoSDR
|
||
*
|
||
* Включает:
|
||
* - Параметры OFDM-модуляции/демодуляции
|
||
* - Параметры помехоустойчивого кодирования Рида-Соломона
|
||
* - Настройки радиотракта по умолчанию
|
||
* - Общие макросы и прототипы функций
|
||
*/
|
||
|
||
#ifndef COMMON_H
|
||
#define COMMON_H
|
||
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <stdint.h>
|
||
#include <string.h>
|
||
#include <math.h>
|
||
#include <signal.h>
|
||
#include <getopt.h>
|
||
#include <time.h>
|
||
#include <unistd.h>
|
||
#include <iio.h>
|
||
#include <liquid/liquid.h>
|
||
|
||
// ============================================================
|
||
// ПАРАМЕТРЫ OFDM-МОДУЛЯЦИИ (ОБЩИЕ ДЛЯ ПРИЁМНИКА И ПЕРЕДАТЧИКА)
|
||
// ============================================================
|
||
#define OFDM_M 64 // Количество поднесущих
|
||
#define OFDM_CP 16 // Длина циклического префикса
|
||
#define OFDM_TAPER 4 // Длина сглаживающего окна
|
||
|
||
// ============================================================
|
||
// ПАРАМЕТРЫ ПОМЕХОУСТОЙЧИВОГО КОДИРОВАНИЯ РИДА-СОЛОМОНА
|
||
// ============================================================
|
||
#define RS_DATA 223 // Размер блока данных (байт)
|
||
#define RS_ENC 255 // Размер кодированного блока (байт)
|
||
|
||
// ============================================================
|
||
// ПАРАМЕТРЫ РАДИОТРАКТА ПО УМОЛЧАНИЮ
|
||
// ============================================================
|
||
#define DEFAULT_FREQ 1265000000 // Частота несущей: 1265 МГц
|
||
#define DEFAULT_RATE 3840000 // Частота дискретизации: 3.84 МГц
|
||
#define DEFAULT_BW 3000000 // Полоса пропускания: 3 МГц
|
||
|
||
// ============================================================
|
||
// АДРЕСА PLUTOSDR ПО УМОЛЧАНИЮ
|
||
// ============================================================
|
||
#define TX_URI_DEFAULT "ip:192.168.3.1" // Адрес передатчика
|
||
#define RX_URI_DEFAULT "ip:192.168.2.1" // Адрес приёмника
|
||
|
||
// ============================================================
|
||
// ОБЩИЕ ВСПОМОГАТЕЛЬНЫЕ МАКРОСЫ
|
||
// ============================================================
|
||
|
||
/**
|
||
* Безопасное освобождение памяти с проверкой указателя
|
||
*/
|
||
#define SAFE_FREE(ptr) do { \
|
||
if ((ptr) != NULL) { \
|
||
free(ptr); \
|
||
(ptr) = NULL; \
|
||
} \
|
||
} while(0)
|
||
|
||
/**
|
||
* Вывод отладочного сообщения с меткой времени
|
||
*/
|
||
#define LOG_INFO(fmt, ...) \
|
||
fprintf(stderr, "[INFO] " fmt "\n", ##__VA_ARGS__)
|
||
|
||
#define LOG_ERROR(fmt, ...) \
|
||
fprintf(stderr, "[ОШИБКА] " fmt "\n", ##__VA_ARGS__)
|
||
|
||
#define LOG_WARN(fmt, ...) \
|
||
fprintf(stderr, "[ВНИМ.] " fmt "\n", ##__VA_ARGS__)
|
||
|
||
// ============================================================
|
||
// СТРУКТУРА ЗАГОЛОВКА КАДРА (12 байт)
|
||
// ============================================================
|
||
/**
|
||
* Формат заголовка кадра:
|
||
* Байты 0-1: Сигнатура начала кадра (0xF0, 0xAA)
|
||
* Байты 2-5: Порядковый номер кадра (32 бита)
|
||
* Байты 6-7: Размер исходных данных (16 бит)
|
||
* Байты 8-9: Количество блоков FEC (16 бит)
|
||
* Байт 10: Размер последнего блока RS
|
||
* Байт 11: Зарезервирован
|
||
*/
|
||
#define HDR_SIGNATURE_0 0xF0 // Первый байт сигнатуры
|
||
#define HDR_SIGNATURE_1 0xAA // Второй байт сигнатуры
|
||
#define HDR_SIZE 12 // Размер заголовка в байтах
|
||
|
||
// ============================================================
|
||
// ПРОТОТИПЫ ОБЩИХ ФУНКЦИЙ
|
||
// ============================================================
|
||
|
||
/**
|
||
* Инициализация общего обработчика сигналов завершения
|
||
* Устанавливает обработчики для SIGINT и SIGTERM
|
||
*/
|
||
void setup_signal_handlers(void);
|
||
|
||
/**
|
||
* Вывод справки по использованию
|
||
*
|
||
* @param prog_name Имя исполняемого файла
|
||
* @param mode Режим работы: "TX" или "RX"
|
||
*/
|
||
void print_usage(const char *prog_name, const char *mode);
|
||
|
||
/**
|
||
* Форматированный вывод конфигурации радиотракта
|
||
*
|
||
* @param mode Режим: "ПЕРЕДАТЧИК" или "ПРИЁМНИК"
|
||
* @param freq Частота несущей
|
||
* @param rate Частота дискретизации
|
||
* @param bw Полоса пропускания
|
||
* @param fec_on Флаг активации FEC
|
||
*/
|
||
void print_config(const char *mode, long long freq, long long rate,
|
||
long long bw, int fec_on);
|
||
|
||
/**
|
||
* Инициализация контекста PlutoSDR и базовых устройств
|
||
*
|
||
* @param uri URI подключения
|
||
* @param ctx Указатель на контекст (выход)
|
||
* @param phy Указатель на физическое устройство (выход)
|
||
* @param dev Указатель на устройство TX/RX (выход)
|
||
* @param is_tx Флаг направления (1=TX, 0=RX)
|
||
* @return 0 при успехе, -1 при ошибке
|
||
*/
|
||
int pluto_init(const char *uri, struct iio_context **ctx,
|
||
struct iio_device **phy, struct iio_device **dev, int is_tx);
|
||
|
||
/**
|
||
* Настройка параметров радиотракта
|
||
*
|
||
* @param phy Физическое устройство
|
||
* @param freq Частота несущей
|
||
* @param rate Частота дискретизации
|
||
* @param bw Полоса пропускания
|
||
* @param gain Усиление (только для TX и manual RX)
|
||
* @param is_tx Флаг направления
|
||
*/
|
||
void pluto_configure(struct iio_device *phy, long long freq, long long rate,
|
||
long long bw, double gain, int is_tx);
|
||
|
||
#endif // COMMON_H
|