Программное управление SDR-платами РИТМ
На этой странице описаны функции программного управления EngeeDeviceManager.Targets.RITM_API.SDR: тип BoardConfig и методы для управления и чтения параметров. Подготовка среды и схема взаимодействия компонентов приведены в статье Управление SDR-платами РИТМ в Engee.
|
Чтобы работать с функциями программного управления
Замените имя и IP-адрес в примере значениями своей машины РИТМ либо используйте уже зарегистрированную машину. Примеры отдельных методов предполагают, что |
Типы и методы SDR
| Группа | Типы и методы |
|---|---|
Конфигурация |
|
Обнаружение и состояние |
|
Инициализация |
|
Частота и FHM |
|
Синхронизация |
|
Радиотракт и калибровка |
|
TX и RX |
|
DDS |
|
JESD |
|
-
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getDdsFrequency -
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getSlaveFallback -
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getSyncTopology -
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getTxAttenuation -
Main.EngeeDeviceManager.Targets.RITM_API.SDR.setTxAttenuation
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.BoardConfig — Method
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",
)
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.calibrate — Method
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
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.deinitialize — Method
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])
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getDdsChannel — Method
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)
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getDdsFrequency — Method
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)
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getDdsScale — Method
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)
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getFhmMaxMhz — Method
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, " МГц")
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getFhmMinMhz — Method
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, " МГц")
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getFrequency — Method
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, " МГц")
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getJesdGood — Method
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)
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getJesdRx — Method
SDR.getJesdRx(ritm, board)
Читает состояние приемной цифровой линии JESD и исходную диагностику драйвера.
Аргументы
-
ritm::String: имя зарегистрированной машины (например,"RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую. -
board::Integer: идентификатор инициализированной платы.
Возвращаемое значение
Словарь состояния одной линии:
| Поле | Значение |
|---|---|
|
|
|
|
|
Строка состояния или |
|
Исходный текст диагностики |
Примеры
rx = SDR.getJesdRx(ritm, board)
println("Состояние RX JESD: ", rx["state"])
println(rx["raw"])
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getJesdRxOs — Method
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"])
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getJesdTx — Method
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"])
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getRxGain — Method
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)
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getSlaveFallback — Method
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)
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getStatus — Method
SDR.getStatus(ritm, board)
Читает полный статус одной платы. Это единственный высокоуровневый метод, запрашивающий полный статус; он не включает RF.
Аргументы
-
ritm::String: имя зарегистрированной машины (например,"RITM 1"), ее сохраненный IP-адрес или полный URL. Имя и IP-адрес должны быть добавлены в Engee; полный URL можно передать напрямую. -
board::Integer: идентификатор платы.
Возвращаемое значение
Словарь состояния платы:
| Поле | Содержимое |
|---|---|
|
Идентификатор платы |
|
Тип устройства, текущее значение |
|
Признак инициализации |
|
Значение несущей, предоставленное драйвером, Гц |
|
Словарь с |
|
Словарь с |
|
Сведения о MCS при инициализации или |
|
Словарь с |
|
Массив состояний RX-каналов |
|
Массив состояний TX-каналов |
|
Словарь с |
Для неинициализированной платы 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
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getSyncTopology — Method
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)
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.getTxAttenuation — Method
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, " дБ")
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.initialize — Method
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"]))
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.isFhmEnabled — Method
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))
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.isInitialized — Method
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)
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.listBoards — Method
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
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.radioOff — Method
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"]))
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.radioOn — Method
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"]))
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.setDds — Method
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))
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.setFrequency — Method
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))
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.setRadioState — Method
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"]))
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.setRxGain — Method
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"]))
#
Main.EngeeDeviceManager.Targets.RITM_API.SDR.setTxAttenuation — Method
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} с двумя полями:
| Поле | Значение |
|---|---|
|
|
|
|
Каждый вызов необходимо проверять:
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 при успехе |
|---|---|
|
Инициализирует плату и оставляет RF включенным |
|
Калибрует оба TX-тракта и оставляет RF включенным |
|
Устанавливает затухание, выполняет калибровку и оставляет RF включенным |
|
Включает RF |
|
Выключает RF, сохраняя инициализацию |
|
Завершает работу платы, выключая RF |
Отдельной функции чтения текущего состояния RF (включен/выключен) нет. Если команда требует последующего выключения RF, вызовите radioOff явно. Этот вызов не предотвращает включение радиотракта во время предшествующей инициализации или калибровки.