Документация Engee

Программное управление SDR-платами РИТМ

На этой странице описаны функции программного управления EngeeDeviceManager.Targets.RITM_API.SDR: тип BoardConfig и методы для управления и чтения параметров. Подготовка среды и схема взаимодействия компонентов приведены в статье Управление SDR-платами РИТМ в Engee.

Чтобы работать с функциями программного управления EngeeDeviceManager.Targets.RITM_API.SDR в Engee, установите пакет поддержки оборудования, как указано в статье. После установки импортируйте модуль и выберите машину РИТМ:

using Main.EngeeDeviceManager.Targets: RITM_API

SDR = RITM_API.SDR
ritm = "RITM 1"
if !RITM_API.isMachineExists(ritm)
    RITM_API.addMachine(ritm, "192.168.56.3")
end

boards = SDR.listBoards(ritm)
isempty(boards) && error("SDR-платы не обнаружены")
board = first(boards)["id"]

Замените имя и IP-адрес в примере значениями своей машины РИТМ либо используйте уже зарегистрированную машину. Примеры отдельных методов предполагают, что ritm, SDR и board уже определены. Примеры изменения параметров требуют инициализированной платы, если в описании метода не указано иное.

Типы и методы SDR

Группа Типы и методы

Конфигурация

BoardConfig

Обнаружение и состояние

listBoards, getStatus, isInitialized

Инициализация

initialize, deinitialize

Частота и FHM

setFrequency, getFrequency, isFhmEnabled, getFhmMinMhz, getFhmMaxMhz

Синхронизация

getSyncTopology, getSlaveFallback

Радиотракт и калибровка

calibrate, setRadioState, radioOn, radioOff

TX и RX

setTxAttenuation, getTxAttenuation, setRxGain, getRxGain

DDS

setDds, getDdsChannel, getDdsFrequency, getDdsScale

JESD

getJesdGood, getJesdRx, getJesdTx, getJesdRxOs

SDR.BoardConfig(;
    id,
    frequency_hz,
    fhm_min_mhz=nothing,
    fhm_max_mhz=nothing,
    topology="internal",
)

Тип конфигурации одной SDR-платы.

Именованные аргументы

  • id::Int: идентификатор SDR-платы.

  • frequency_hz::Int: начальная несущая, Гц.

  • fhm_min_mhz::Union{Nothing,Int}=nothing: нижняя граница FHM, МГц. По умолчанию nothing.

  • fhm_max_mhz::Union{Nothing,Int}=nothing: верхняя граница FHM, МГц. По умолчанию nothing.

    Обе границы nothing задают фиксированную частоту. Для FHM укажите обе границы; начальная несущая должна попадать в выбранный диапазон. Для RFMC9000 задавайте положительные границы с fhm_min_mhz < fhm_max_mhz. Драйвер дополнительно проверяет совместимость диапазона с профилем трансивера.

  • topology::String="internal": топология синхронизации, заданная как "internal" (по умолчанию), "master" или "slave". "internal" задает внутреннюю синхронизацию, "master" — ведущую плату, "slave" — ведомую.

    Для общей синхронизации передавайте конфигурации master/slave одним вызовом initialize.

Возвращаемое значение

Объект BoardConfig для передачи в initialize. Создание объекта не обращается к плате. Проверки топологии и совместного задания границ FHM выполняются при подготовке команды инициализации.

Примеры

config = SDR.BoardConfig(
    id=board,
    frequency_hz=300_000_000,
    fhm_min_mhz=300,
    fhm_max_mhz=5500,
    topology="internal",
)
SDR.calibrate(ritm, board; channel=0)

Выполняет калибровку передающего тракта инициализированной платы.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор платы.

Именованные аргументы

  • channel::Integer: TX-канал, 0 (по умолчанию) или 1.

Возвращаемое значение

Словарь success/msg:

  • "success": true при успехе, false при ошибке операции.

  • "msg": nothing при успехе, описание причины при ошибке.

Особенности

В RFMC9000 калибровка общая для двух передающих трактов независимо от переданного значения channel. При успехе текущий драйвер оставляет RF включенным. Прежнее RF-состояние не восстанавливается. Полный статус автоматически не запрашивается.

Примеры

try
    result = SDR.calibrate(ritm, board; channel=0)
    result["success"] || error(string(result["msg"]))
finally
    result = SDR.radioOff(ritm, board)
    result["success"] || error(string(result["msg"]))
end
SDR.deinitialize(ritm, board)
SDR.deinitialize(ritm, boards)

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

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор одной платы.

  • boards::AbstractVector{<:Integer}: непустой массив идентификаторов.

Возвращаемое значение

Словарь success/msg:

  • "success": true при успехе, false при ошибке операции.

  • "msg": nothing при успехе, описание причины при ошибке.

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

Примеры

result = SDR.deinitialize(ritm, board)
result["success"] || error(string(result["msg"]))

# Альтернативный групповой вызов:
# result = SDR.deinitialize(ritm, [0, 1])
SDR.getDdsChannel(ritm, board)

Читает последний примененный индекс DDS из кеша драйвера.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

Возвращаемое значение

Целое число — индекс DDS. Метод не переключает генератор и не возвращает список всех настроенных генераторов.

Примеры

dds_channel = SDR.getDdsChannel(ritm, board)
println(dds_channel)
SDR.getDdsFrequency(ritm, board)

Читает частоту последней примененной настройки DDS из кеша драйвера.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

Возвращаемое значение

Целое число — частота DDS в Гц. Это сохраненный параметр, а не чтение регистров всех компонент и не измерение выходной частоты.

Примеры

dds_frequency_hz = SDR.getDdsFrequency(ritm, board)
println(dds_frequency_hz)
SDR.getDdsScale(ritm, board)

Читает масштаб последней примененной настройки DDS из кеша драйвера.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

Возвращаемое значение

Целое число — масштаб в миллионных долях. Значение 1_000_000 соответствует амплитуде 1.0 в цифровом представлении; мощность RF-сигнала из него напрямую не определяется.

Примеры

dds_scale = SDR.getDdsScale(ritm, board)
println("Относительный масштаб: ", dds_scale / 1_000_000)
SDR.getFhmMaxMhz(ritm, board)

Читает верхнюю границу диапазона FHM.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор платы.

Возвращаемое значение

Целое число — верхняя граница в МГц. Активность FHM проверяется отдельно через isFhmEnabled.

Примеры

max_mhz = SDR.getFhmMaxMhz(ritm, board)
println("Верхняя граница: ", max_mhz, " МГц")
SDR.getFhmMinMhz(ritm, board)

Читает нижнюю границу диапазона FHM.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор платы.

Возвращаемое значение

Целое число — нижняя граница в МГц. Используйте вместе с isFhmEnabled: само сохраненное значение границы не подтверждает активность FHM.

Примеры

min_mhz = SDR.getFhmMinMhz(ritm, board)
println("Нижняя граница: ", min_mhz, " МГц")
SDR.getFrequency(ritm, board)

Читает значение несущей, предоставленное драйвером.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор платы.

Возвращаемое значение

Целое число — частота в Гц. Значение не является измерением частоты выходного RF-сигнала.

Примеры

frequency_hz = SDR.getFrequency(ritm, board)
println("Несущая: ", frequency_hz / 1_000_000, " МГц")
SDR.getJesdGood(ritm, board)

Читает сводный признак исправности цифровых линий JESD.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

Возвращаемое значение

Bool. В текущем драйвере true требует состояния DATA у трех линий: RX, TX и observation RX (наблюдательного приемника). Значение характеризует цифровые линии между FPGA и трансивером. Оно не подтверждает наличие полезного RF-сигнала или фазовую когерентность сигналов нескольких плат.

Примеры

jesd_good = SDR.getJesdGood(ritm, board)
println("JESD: ", jesd_good)
SDR.getJesdRx(ritm, board)

Читает состояние приемной цифровой линии JESD и исходную диагностику драйвера.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

Возвращаемое значение

Словарь состояния одной линии:

Поле Значение

"enabled"

Bool, признак включения линии по диагностике драйвера

"good"

Bool, линия включена и находится в состоянии DATA

"state"

Строка состояния или nothing, если состояние не извлечено

"raw"

Исходный текст диагностики

Примеры

rx = SDR.getJesdRx(ritm, board)
println("Состояние RX JESD: ", rx["state"])
println(rx["raw"])
SDR.getJesdRxOs(ritm, board)

Читает состояние JESD-линии наблюдательного приемника (observation RX) и диагностику драйвера.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

Возвращаемое значение

Словарь с "enabled", "good", "state", "raw" в формате getJesdRx.

Примеры

rx_os = SDR.getJesdRxOs(ritm, board)
println("Observation RX JESD: ", rx_os["state"])
println(rx_os["raw"])
SDR.getJesdTx(ritm, board)

Читает состояние передающей цифровой линии JESD и диагностику драйвера.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

Возвращаемое значение

Словарь с "enabled", "good", "state", "raw" в формате getJesdRx.

Примеры

tx = SDR.getJesdTx(ritm, board)
println("Состояние TX JESD: ", tx["state"])
println(tx["raw"])
SDR.getRxGain(ritm, board, channel)

Читает индекс таблицы усиления одного приемного канала.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

  • channel::Integer: RX-канал, 0 или 1.

Возвращаемое значение

Целое число — индекс таблицы усиления. Значение не выражено в дБ. Если драйвер не может прочитать параметр, в том числе при выключенном RF, метод выбрасывает исключение. Для получения полного статуса с полем readback_error используйте getStatus.

Примеры

gain_index = SDR.getRxGain(ritm, board, 0)
println("Индекс усиления RX0: ", gain_index)
SDR.getSlaveFallback(ritm, board)

Читает разрешение ведомой плате переходить на локальный опорный источник.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор платы.

Возвращаемое значение

Bool: true, если fallback разрешен. Метод сообщает настройку, а не факт срабатывания перехода. Отдельного метода чтения фактического источника синхронизации в данном API нет.

Примеры

fallback_allowed = SDR.getSlaveFallback(ritm, board)
println("Локальная опора разрешена: ", fallback_allowed)
SDR.getStatus(ritm, board)

Читает полный статус одной платы. Это единственный высокоуровневый метод, запрашивающий полный статус; он не включает RF.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор платы.

Возвращаемое значение

Словарь состояния платы:

Поле Содержимое

"id"

Идентификатор платы

"device"

Тип устройства, текущее значение "rfmc9000"

"initialized"

Признак инициализации

"frequency_hz"

Значение несущей, предоставленное драйвером, Гц

"fhm"

Словарь с "enabled", "min_mhz", "max_mhz"

"sync"

Словарь с "topology" и "slave_fallback"

"mcs"

Сведения о MCS при инициализации или nothing

"jesd"

Словарь с "good", "rx", "tx", "rx_os" или nothing

"rx"

Массив состояний RX-каналов

"tx"

Массив состояний TX-каналов

"dds"

Словарь с "channel", "frequency_hz", "scale" или nothing

Для неинициализированной платы mcs, jesd, dds равны nothing, а rx и tx — пустые массивы. Наличие сохраненной частоты или параметров синхронизации не означает готовность аппаратуры: проверяйте initialized.

Элемент rx содержит "channel", "gain_index", "readback_error". Элемент tx содержит "channel", "attenuation_mdb", "readback_error". Если показание недоступно, значение равно nothing, а readback_error содержит диагностическую строку. Ошибки чтения других обязательных полей могут завершить весь запрос исключением.

Для инициализированной платы mcs содержит "source" => "driver_initialization" и "status_available" => false. Это описание места выполнения MCS, а не результат проверки фазовой синхронизации.

Внутренние настройки синхронизации ibert_prbs_window_ms, resync_sysref, jesd_lmfc_offset и lmk_sysref_delay из результата удаляются Julia-оберткой. Структура состояния одной JESD-линии приведена в getJesdRx. DDS содержит кеш последней примененной настройки.

Примеры

state = SDR.getStatus(ritm, board)
println("Инициализирована: ", state["initialized"])
println("Топология: ", state["sync"]["topology"])

for rx in state["rx"]
    if isnothing(rx["gain_index"])
        println("RX", rx["channel"], ": ", rx["readback_error"])
    else
        println("RX", rx["channel"], ": индекс ", rx["gain_index"])
    end
end
SDR.getSyncTopology(ritm, board)

Читает настроенную топологию синхронизации.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор платы.

Возвращаемое значение

Строка "internal", "master" или "slave", предоставленная драйвером. Она отражает настройку топологии. У ведомой платы значение "slave" не подтверждает фактическую работу от внешней опоры после возможного fallback.

Примеры

topology = SDR.getSyncTopology(ritm, board)
println(topology)
SDR.getTxAttenuation(ritm, board, channel)

Читает затухание одного передающего канала.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

  • channel::Integer: TX-канал, 0 или 1.

Возвращаемое значение

Целое число — затухание в миллидецибелах. При недоступности аппаратного чтения метод выбрасывает исключение; RF для чтения автоматически не включается.

Примеры

attenuation_mdb = SDR.getTxAttenuation(ritm, board, 1)
println("Затухание TX1: ", attenuation_mdb / 1000, " дБ")
SDR.initialize(ritm, config; slave_fallback=true)
SDR.initialize(ritm, configs; slave_fallback=true)

Инициализирует одну плату или группу плат за один вызов функции.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • config::BoardConfig: конфигурация одной платы.

  • configs::AbstractVector{BoardConfig}: непустой массив конфигураций.

Именованные аргументы

  • slave_fallback::Bool: разрешить ведомым платам переход на локальный опорный источник при отсутствии захвата внешней опоры. При false такой переход не разрешается. По умолчанию true. Параметр общий для всего вызова.

Возвращаемое значение

Словарь success/msg:

  • "success": true при успехе, false при ошибке операции.

  • "msg": nothing при успехе, описание причины при ошибке.

Особенности

Режим FHM задается отдельно для каждой платы наличием границ в ее BoardConfig. Синхронизация MCS выполняется автоматически в ходе инициализации.

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

Успешная инициализация RFMC9000 оставляет RF включенным.

Примеры

config = SDR.BoardConfig(id=board, frequency_hz=300_000_000)
result = SDR.initialize(ritm, config)
result["success"] || error(string(result["msg"]))

result = SDR.radioOff(ritm, board)
result["success"] || error(string(result["msg"]))

Групповой вариант; идентификаторы замените значениями из listBoards:

configs = [
    SDR.BoardConfig(id=0, frequency_hz=300_000_000, topology="master"),
    SDR.BoardConfig(id=1, frequency_hz=300_000_000, topology="slave"),
]
result = SDR.initialize(ritm, configs; slave_fallback=false)
result["success"] || error(string(result["msg"]))
SDR.isFhmEnabled(ritm, board)

Читает признак инициализации режима FHM.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор платы.

Возвращаемое значение

Bool: включен ли режим FHM. Для неинициализированной платы возвращается false. Значение true не означает, что частота меняется автоматически; программная перестройка выполняется методом setFrequency.

Примеры

println("FHM: ", SDR.isFhmEnabled(ritm, board))
SDR.isInitialized(ritm, board)

Читает признак инициализации платы.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор платы.

Возвращаемое значение

Bool: true, если плата инициализирована, иначе false. Признак не сообщает, включен ли RF в настоящий момент.

Примеры

initialized = SDR.isInitialized(ritm, board)
println(initialized)
SDR.listBoards(ritm)

Возвращает список обнаруженных SDR-плат. Инициализация оборудования не требуется.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

Возвращаемое значение

Массив словарей с полями "id" и "device". Для поддерживаемых плат значение "device" равно "rfmc9000". Если поддерживаемые платы отсутствуют, массив пуст.

Примеры

boards = SDR.listBoards(ritm)
for descriptor in boards
    println("Плата ", descriptor["id"], ": ", descriptor["device"])
end
SDR.radioOff(ritm, board)

Выключает радиотракт. Эквивалентен setRadioState(ritm, board, false).

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

Возвращаемое значение

Словарь success/msg:

  • "success": true при успехе, false при ошибке операции.

  • "msg": nothing при успехе, описание причины при ошибке.

Примеры

result = SDR.radioOff(ritm, board)
result["success"] || error(string(result["msg"]))
SDR.radioOn(ritm, board)

Включает радиотракт. Эквивалентен setRadioState(ritm, board, true).

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

Возвращаемое значение

Словарь success/msg:

  • "success": true при успехе, false при ошибке операции.

  • "msg": nothing при успехе, описание причины при ошибке.

Примеры

# RF-подключения и параметры платы подготовлены заранее.
result = SDR.radioOn(ritm, board)
result["success"] || error(string(result["msg"]))
SDR.setDds(ritm, board, channel, frequency_hz, scale)

Настраивает один цифровой генератор DDS по низкоуровневому индексу.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

  • channel::Integer: индекс DDS от 0 до 3.

  • frequency_hz::Integer: частота DDS в Гц, целое число от 0 до 4_294_967_295 включительно. Рабочую частоту выбирайте с учетом частоты дискретизации и профиля оборудования.

  • scale::Integer: масштаб в миллионных долях, от 0 до 1_999_000; 50_000 соответствует 0.05, 1_000_000 — 1.0.

Возвращаемое значение

Словарь success/msg:

  • "success": true при успехе, false при ошибке операции.

  • "msg": nothing при успехе, описание причины при ошибке.

Особенности

RFMC9000 имеет два передающих RF-канала. Индекс DDS не является номером RF-передатчика. Текущий интерфейс не предоставляет однозначного соответствия 0…3 компонентам TX1 I, TX1 Q, TX2 I, TX2 Q; для настройки конкретного I/Q-тракта требуется учитывать реализацию DDS в драйвере и прошивке FPGA. Несущую задают через BoardConfig или setFrequency, отдельно от частоты DDS.

Метод применяет частоту и масштаб к выбранному генератору. Последующие getDdsChannel, getDdsFrequency, getDdsScale читают кеш этой последней настройки; они не проверяют регистры всех компонент или форму сигнала.

Примеры

result = SDR.setDds(ritm, board, 0, 20_000_000, 50_000)
result["success"] || error(string(result["msg"]))

println("Индекс DDS: ", SDR.getDdsChannel(ritm, board))
println("Частота, Гц: ", SDR.getDdsFrequency(ritm, board))
println("Масштаб: ", SDR.getDdsScale(ritm, board))
SDR.setFrequency(ritm, board, frequency_hz)

Изменяет несущую платы, инициализированной с включенным FHM.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор платы.

  • frequency_hz::Integer: новая положительная частота в Гц, внутри настроенного диапазона FHM.

Возвращаемое значение

Словарь success/msg:

  • "success": true при успехе, false при ошибке операции.

  • "msg": nothing при успехе, описание причины при ошибке.

Особенности

Для платы с фиксированной частотой метод неприменим. Изменение такой частоты выполняется через initialize с новым BoardConfig. Метод не возвращает фактически установленную частоту; используйте getFrequency.

Примеры

# Плата уже инициализирована с FHM, включающим 400 МГц.
result = SDR.setFrequency(ritm, board, 400_000_000)
result["success"] || error(string(result["msg"]))
println(SDR.getFrequency(ritm, board))
SDR.setRadioState(ritm, board, enabled)

Включает или выключает радиотракт инициализированной платы.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор платы.

  • enabled::Bool: true для включения, false для выключения.

    Значение false сохраняет инициализацию платы. Для завершения работы используйте deinitialize. Параметр enabled требует Bool: передавайте true или false, а не 1 или 0. Отдельной функции чтения RF-состояния в драйвере нет.

Возвращаемое значение

Словарь success/msg:

  • "success": true при успехе, false при ошибке операции.

  • "msg": nothing при успехе, описание причины при ошибке.

Примеры

result = SDR.setRadioState(ritm, board, false)
result["success"] || error(string(result["msg"]))
SDR.setRxGain(ritm, board, channel, index)

Задает индекс таблицы усиления приемного канала.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

  • channel::Integer: RX-канал, 0 или 1.

  • index::Integer: индекс таблицы усиления, целое число от 0 до 255, допустимое для применяемой таблицы и режима драйвера.

Возвращаемое значение

Словарь success/msg:

  • "success": true при успехе, false при ошибке операции.

  • "msg": nothing при успехе, описание причины при ошибке.

Особенности

Аргумент index не задает усиление в дБ. Соответствие индексов усилению определяется таблицей трансивера; успешность применения зависит от драйвера. Для чтения используйте getRxGain.

Примеры

result = SDR.setRxGain(ritm, board, 0, 255)
result["success"] || error(string(result["msg"]))
SDR.setTxAttenuation(ritm, board, channel, attenuation_mdb)

Устанавливает затухание передающего канала.

Аргументы

  • ritm::String: имя зарегистрированной машины (например, "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer: идентификатор инициализированной платы.

  • channel::Integer: TX-канал, 0 или 1.

  • attenuation_mdb::Integer: затухание в миллидецибелах, от 0 до 41_950 включительно.

Возвращаемое значение

Словарь success/msg:

  • "success": true при успехе, false при ошибке операции.

  • "msg": nothing при успехе, описание причины при ошибке.

Особенности

Драйвер RFMC9000 после установки запускает общую TX-калибровку; при успехе RF остается включенным. Затухание может быть квантовано шагом, заданным профилем трансивера. Фактическое значение читайте через getTxAttenuation.

Примеры

try
    result = SDR.setTxAttenuation(ritm, board, 1, 32_000) # 32 дБ
    result["success"] || error(string(result["msg"]))
    println(SDR.getTxAttenuation(ritm, board, 1))
finally
    result = SDR.radioOff(ritm, board)
    result["success"] || error(string(result["msg"]))
end

Общие правила вызова

  • ritm::String — имя зарегистрированной машины (например "RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую.

  • board::Integer — идентификатор из listBoards, а не индекс Julia-массива.

  • TX- и RX-каналы нумеруются с нуля: 0 и 1.

  • Индексы DDS-генераторов: от 0 до 3.

  • Несущая и частота DDS передаются в Гц; границы FHM — в МГц.

  • Затухание TX передается в миллидецибелах: 1000 соответствует 1 дБ.

  • Усиление RX задается индексом таблицы, а не значением в дБ.

  • Масштаб DDS задается в миллионных долях: 1_000_000 соответствует 1.0.

Приведенные числовые ограничения относятся к DA-AX-FMC-RF9. Попадание значения в допустимый диапазон не гарантирует применимость настройки при конкретном профиле трансивера и частоте дискретизации.

В аргументах методов типа Integer нельзя использовать Bool вместо числа: такое значение отклоняется программным управлением. При выполнении операции дополнительно проверяется допустимость настройки для оборудования.

Результаты операций изменения

Методы initialize, deinitialize, setFrequency, calibrate, setRadioState, radioOn, radioOff, setTxAttenuation, setRxGain и setDds возвращают Dict{String,Any} с двумя полями:

Поле Значение

"success"

true при успехе, false при ошибке операции

"msg"

nothing при успехе, описание причины при ошибке

Каждый вызов необходимо проверять:

result = SDR.radioOff(ritm, board)
result["success"] || error(string(result["msg"]))

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

Ошибки типов и аргументов Julia, сбои RPC/HTTP и некорректная структура ответа могут приводить к исключениям. Операция также может частично изменить состояние оборудования до ошибки или таймаута. Перед повторением прочитайте статус затронутых плат; автоматического повтора в программном управлении нет.

Результаты операций чтения

Методы чтения возвращают запрошенное значение напрямую, словарь или массив словарей. При ошибке запроса они выбрасывают исключение. Функции чтения не включают радиотракт — параметры можно считывать в любой момент.

Метод getStatus возвращает nothing для недоступных аппаратных показаний и сохраняет диагностику ошибки чтения. Отдельные функции чтения таких параметров завершаются исключением, если значение прочитать нельзя.

До инициализации доступны isInitialized, getFrequency, isFhmEnabled, getFhmMinMhz, getFhmMaxMhz, getSyncTopology и getSlaveFallback. Они читают признаки и сохраненные настройки. Отдельные функции чтения JESD, DDS, усиления RX и затухания TX требуют инициализированной платы.

Дополнительные диагностические сообщения методы выводят через @warn.

Влияние на RF-состояние

Метод Поведение текущего драйвера DA-AX-FMC-RF9 при успехе

initialize

Инициализирует плату и оставляет RF включенным

calibrate

Калибрует оба TX-тракта и оставляет RF включенным

setTxAttenuation

Устанавливает затухание, выполняет калибровку и оставляет RF включенным

radioOn / setRadioState(…​, true)

Включает RF

radioOff / setRadioState(…​, false)

Выключает RF, сохраняя инициализацию

deinitialize

Завершает работу платы, выключая RF

Отдельной функции чтения текущего состояния RF (включен/выключен) нет. Если команда требует последующего выключения RF, вызовите radioOff явно. Этот вызов не предотвращает включение радиотракта во время предшествующей инициализации или калибровки.