Files
E502_ADC_BF_PC_companion/lib/x502api-1.1.34/pas/x502api.pas

916 lines
51 KiB
ObjectPascal
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

unit x502api;
interface
uses Windows, SysUtils;
const
// Максимальное количество логических каналов в таблице
X502_LTABLE_MAX_CH_CNT = 256;
// Количество диапазонов для измерения напряжений
X502_ADC_RANGE_CNT = 6;
// Количество каналов АЦП в режиме с общей землей
X502_ADC_COMM_CH_CNT = 32;
// Количество каналов АЦП в дифференциальном режиме
X502_ADC_DIFF_CH_CNT = 16;
// Максимальное значение для аппаратного усреднения по логическому каналу
X502_LCH_AVG_SIZE_MAX = 128;
//Максимальное значения делителя частоты АЦП
X502_ADC_FREQ_DIV_MAX = (1024*1024);
// Максимальное значение делителя частоты синхронного цифрового ввода
X502_DIN_FREQ_DIV_MAX = (1024*1024);
// Минимальное значение делителя частоты синхронного вывода
X502_OUT_FREQ_DIV_MIN = 2;
// Максимальное значение делителя частоты синхронного вывода
X502_OUT_FREQ_DIV_MAX = 1024;
// Значение делителя частоты вывода по умолчанию (которое также всегда
// используется в L502 с версией прошивки ПЛИС ниже 0.5)
X502_OUT_FREQ_DIV_DEFAULT = 2;
// Максимальное значение межкадровой задержки для АЦП
X502_ADC_INTERFRAME_DELAY_MAX = $1FFFFF;
// Таймаут по умолчанию для выполнения команды к BlackFin
X502_BF_CMD_DEFAULT_TOUT = 500;
// Код АЦП, соответствующий максимальному значению шкалы
X502_ADC_SCALE_CODE_MAX = 6000000;
// Код ЦАП, соответствующий максимальному значению шкалы
X502_DAC_SCALE_CODE_MAX = 30000;
// Максимальное количество символов в строке с названием устройства
X502_DEVNAME_SIZE = 32;
// Максимальное количество символов в строке с серийным номером
X502_SERIAL_SIZE = 32;
// Максимальное количество символов в строке с описанием подключения
X502_LOCATION_STR_SIZE = 64;
// Размер MAC-адреса для Ethernet интерфейса
X502_MAC_ADDR_SIZE = 6;
// Размер строки с описанием экземпляра устройства
X502_INSTANCE_NAME_SIZE = 64;
// Максимальный размер строки с паролем на настройки
X502_PASSWORD_SIZE = 32;
// Максимально возможное значение внешней опорной частоты
X502_EXT_REF_FREQ_MAX = 1500000;
//Размер пользовательской области Flash-памяти
X502_FLASH_USER_SIZE = $100000;
//Стандартный таймаут на выполнение запроса к BlackFin в мс
X502_BF_REQ_TOUT = 500;
// Диапазон ЦАП в вольтах
X502_DAC_RANGE = 5;
// Количество каналов ЦАП
X502_DAC_CH_CNT = 2;
// Количество цифровых выходов у модуля
X502_DOUT_LINES_CNT = 16;
// слово в потоке, означающее, что произошло переполнение
X502_STREAM_IN_MSG_OVERFLOW = $01010000;
X502_DEVREC_SIGN = $4C524543;
{ ----------------- Коды ошибок библиотеки ---------------------------}
// Функция выполнена без ошибок
X502_ERR_OK = 0;
// В функцию передан недействительный описатель модуля
X502_ERR_INVALID_HANDLE = -1;
// Ошибка выделения памяти
X502_ERR_MEMORY_ALLOC = -2;
// Попытка открыть уже открытое устройство
X502_ERR_ALREADY_OPENED = -3;
// Устройство с заданными параметрами не найдено в системе
X502_ERR_DEVICE_NOT_FOUND = -4;
// Доступ к устройству запрещен (Как правило из-за того, что устройство уже открыто в другой программе)
X502_ERR_DEVICE_ACCESS_DENIED = -5;
// Ошибка открытия устройства
X502_ERR_DEVICE_OPEN = -6;
// В функцию передан недействительный указатель
X502_ERR_INVALID_POINTER = -7;
// Функция не может быть выполнена при запущенном потоке сбора данных
X502_ERR_STREAM_IS_RUNNING = -8;
// Ошибка чтения данных синхронного ввода
X502_ERR_RECV = -9;
// Ошибка записи данных для синхронного вывода
X502_ERR_SEND = -10;
// Произошло переполнение внутреннего буфера для потока синхронного ввода
X502_ERR_STREAM_OVERFLOW = -11;
// Неизвестное сообщение в потоке синхронного ввода
X502_ERR_UNSUP_STREAM_MSG = -12;
// Ошибка создания системного мьютекса
X502_ERR_MUTEX_CREATE = -13;
// Неверный описатель мьютекса
X502_ERR_MUTEX_INVALID_HANDLE = -14;
// Истекло время ожидания освобождения мьютекса
X502_ERR_MUTEX_LOCK_TOUT = -15;
// Ошибка освобождения мьютекса
X502_ERR_MUTEX_RELEASE = -16;
// Недостаточно системных ресурсов
X502_ERR_INSUFFICIENT_SYSTEM_RESOURCES= -17;
// Данная возможность еще не реализована
X502_ERR_NOT_IMPLEMENTED = -18;
// Недостаточный размер массива
X502_ERR_INSUFFICIENT_ARRAY_SIZE = -19;
// Ошибка чтения регистра FPGA
X502_ERR_FPGA_REG_READ = -20;
// Ошибка записи регистра FPGA
X502_ERR_FPGA_REG_WRITE = -21;
// Сбор данных уже остановлен
X502_ERR_STREAM_IS_NOT_RUNNING = -22;
// Ошибка освобождения интерфейса
X502_ERR_INTERFACE_RELEASE = -23;
// Ошибка запуска потока
X502_ERR_THREAD_START = -24;
// Ошибка останова потока
X502_ERR_THREAD_STOP = -25;
// Устройство было отключено
X502_ERR_DEVICE_DISCONNECTED = -26;
// Неверный размер ответа на управляющий запрос
X502_ERR_IOCTL_INVALID_RESP_SIZE = -27;
// Неверный тип устройства
X502_ERR_INVALID_DEVICE = -28;
// Недействительная запись о устройстве
X502_ERR_INVALID_DEVICE_RECORD = -29;
// Неверный хендл конфигурации модуля
X502_ERR_INVALID_CONFIG_HANDLE = -30;
// Связь с устройством закрыта или не была установлена
X502_ERR_DEVICE_NOT_OPENED = -31;
// Данная операция не доступна для текущего интерфейса связи с устройством
X502_ERR_INVALID_OP_FOR_IFACE = -32;
// Не загружен ПЛИС модуля
X502_ERR_FPGA_NOT_LOADED = -33;
// Неверная конфигурация USB-устройства
X502_ERR_INVALID_USB_CONFIGURATION = -34;
// Задан неверный размер логической таблицы
X502_ERR_INVALID_LTABLE_SIZE = -102;
// Задан неверный номер логического канала
X502_ERR_INVALID_LCH_NUMBER = -103;
// Неверно задано значение диапазона АЦП
X502_ERR_INVALID_LCH_RANGE = -104;
// Неверно задан режим измерения для логического канала
X502_ERR_INVALID_LCH_MODE = -105;
// Неверно задан номер физического канала при настройке логического
X502_ERR_INVALID_LCH_PHY_NUMBER = -106;
// Неверно задан размер усреднения для логического канала
X502_ERR_INVALID_LCH_AVG_SIZE = -107;
// Неверно задан делитель частоты сбора данных АЦП
X502_ERR_INVALID_ADC_FREQ_DIV = -108;
// Неверно задан делитель частоты синхронного ввода цифровых линий
X502_ERR_INVALID_DIN_FREQ_DIV = -109;
// Неверно задан режим работы модуля L502
X502_ERR_INVALID_MODE = -110;
// Неверный номер канала ЦАП
X502_ERR_INVALID_DAC_CHANNEL = -111;
// Неверный код выбора опорной частоты синхронизации
X502_ERR_INVALID_REF_FREQ = -112;
// Неверно задано значение межкадровой задержки
X502_ERR_INVALID_INTERFRAME_DELAY = -113;
// Неверно задан режим синхронизации
X502_ERR_INVALID_SYNC_MODE = -114;
// Неверно задан номер потока данных
X502_ERR_INVALID_STREAM_CH = -115;
// Неверно задан делитель частоты синхронного вывода
X502_ERR_INVALID_OUT_FREQ_DIV = -116;
// Ошибка захвата опорной частоты синхронизации
X502_ERR_REF_FREQ_NOT_LOCKED = -131;
// Управляющий запрос к драйверу завершен с ошибкой
X502_ERR_IOCTL_FAILD = -132;
// Истек таймаут ожидания завершения выполнения управляющего запроса к драйверу
X502_ERR_IOCTL_TIMEOUT = -133;
// Ошибка получения информации о устройстве от драйвера
X502_ERR_GET_INFO = -134;
// За время ожидания не было считано новое слово с цифровых линий
X502_ERR_DIG_IN_NOT_RDY = -135;
// Принято недостаточно слов от модуля
X502_ERR_RECV_INSUFFICIENT_WORDS = -136;
// Попытка выполнить операцию, требующую наличие ЦАП, при его отсутствии
X502_ERR_DAC_NOT_PRESENT = -137;
// Неверный номер канала в обрабатываемом потоке синхронного ввода
X502_ERR_PROC_INVALID_CH_NUM = -140;
// Неверный код диапазона в обрабатываемом потоке синхронного ввода
X502_ERR_PROC_INVALID_CH_RANGE = -141;
// Задан неверный адрес во Flash-памяти
X502_ERR_FLASH_INVALID_ADDR = -142;
// Задан неверный размер блока данных при работе с Flash-памятью
X502_ERR_FLASH_INVALID_SIZE = -143;
// Истек таймаут ожидания завершения записи во Flash-память
X502_ERR_FLASH_WRITE_TOUT = -144;
// Истек таймаут ожидания завершения стирания блока Flash-памяти
X502_ERR_FLASH_ERASE_TOUT = -145;
// Заданная область для стирания Flash-памяти нарушает границу блока в 4 Кбайт
X502_ERR_FLASH_SECTOR_BOUNDARY = -146;
// Не удалось открыть сокет для соединения
X502_ERR_SOCKET_OPEN = -147;
// Превышено время подключения
X502_ERR_CONNECTION_TOUT = -148;
// Соединение закрыто другой устройством
X502_ERR_CONNECTION_CLOSED_BY_DEV = -149;
// Не удалось установить заданный размер буфера сокета
X502_ERR_SOCKET_SET_BUF_SIZE = -150;
// Соединение для передачи данных не установлено
X502_ERR_NO_DATA_CONNECTION = -151;
// Не удалось дождаться сообщения о завершении потока
X502_ERR_NO_STREAM_END_MSG = -152;
// Соединение было сброшено другой стороной
X502_ERR_CONNECTION_RESET = -153;
// Не удалось найти хост с указанным адресом
X502_ERR_HOST_UNREACHABLE = -154;
// Ошибка установления TCP-соединения
X502_ERR_TCP_CONNECTION_ERROR = -155;
// Не удалось открыть файл прошивки BlackFin
X502_ERR_LDR_FILE_OPEN = -180;
// Ошибка чтения из фала прошивки BlackFin
X502_ERR_LDR_FILE_READ = -181;
// Неверный формат файла прошивки BlackFin
X502_ERR_LDR_FILE_FORMAT = -182;
// Используются возможность LDR-файла, недоступные при записи прошивки BlackFin по HDMA
X502_ERR_LDR_FILE_UNSUP_FEATURE = -183;
// Неверный стартовый адрес программы в прошивке BlackFin
X502_ERR_LDR_FILE_UNSUP_STARTUP_ADDR = -184;
// Истек таймаут выполнения запроса на чтения/запись памяти BlackFin
X502_ERR_BF_REQ_TIMEOUT = -185;
// Команда для BlackFin все еще находится в процессе обработки
X502_ERR_BF_CMD_IN_PROGRESS = -186;
// Истекло время выполнения управляющей команды процессором BlackFin
X502_ERR_BF_CMD_TIMEOUT = -187;
// Возвращено недостаточно данных в ответ на команду к BlackFin
X502_ERR_BF_CMD_RETURN_INSUF_DATA = -188;
// Истек таймаут ожидания готовности процессора BlackFin к записи прошивки
X502_ERR_BF_LOAD_RDY_TOUT = -189;
// Попытка выполнить операцию для которой нужен сигнальный процессор при
// отсутствии сигнального процессора в модуле
X502_ERR_BF_NOT_PRESENT = -190;
// Неверный адрес памяти BlackFin при записи или чтении по HDMA
X502_ERR_BF_INVALID_ADDR = -191;
// Неверный размер данных, передаваемых с управляющей командой в BlackFin
X502_ERR_BF_INVALID_CMD_DATA_SIZE = -192;
{--------------- Интерфейс соединения с модулем ------------------}
X502_IFACE_UNKNOWN = 0; // Неизвестный интерфейс
X502_IFACE_USB = 1; // Устройство подключено по USB
X502_IFACE_ETH = 2; // Устройство подключено по Ethernet через TCP/IP
X502_IFACE_PCI = 3; // Устройство подключено по PCI/PCIe
{-------- Флаги, управляющие поиском присутствующих модулей ------}
// Признак, что нужно вернуть серийные номера только тех устройств,
// которые еще не открыты
X502_GETDEVS_FLAGS_ONLY_NOT_OPENED = 1;
{-------- Флаги для управления цифровыми выходами. ---------------}
//Запрещение (перевод в третье состояние) старшей половины цифровых выходов
X502_DIGOUT_WORD_DIS_H = $00020000;
//Запрещение младшей половины цифровых выходов
X502_DIGOUT_WORD_DIS_L = $00010000;
{-------- Константы для выбора опорной частоты -------------------}
X502_REF_FREQ_2000KHZ = 2000000; // частота 2МГц
X502_REF_FREQ_1500KHZ = 1500000; // частота 1.5МГц
{-------- Диапазоны измерения для канала АЦП ----------------------}
X502_ADC_RANGE_10 = 0; // диапазон +/-10V
X502_ADC_RANGE_5 = 1; // диапазон +/-5V
X502_ADC_RANGE_2 = 2; // диапазон +/-2V
X502_ADC_RANGE_1 = 3; // диапазон +/-1V
X502_ADC_RANGE_05 = 4; // диапазон +/-0.5V
X502_ADC_RANGE_02 = 5; // диапазон +/-0.2V
{-------- Режим измерения для логического канала ------------------}
X502_LCH_MODE_COMM = 0; // Измерение напряжения относительно общей земли
X502_LCH_MODE_DIFF = 1; // Дифференциальное измерение напряжения
X502_LCH_MODE_ZERO = 2; // Измерение собственного нуля
{-------- Режимы синхронизации ------------------------------------}
X502_SYNC_INTERNAL = 0; // Внутренний сигнал
X502_SYNC_EXTERNAL_MASTER = 1; // От внешнего мастера по разъему межмодульной синхронизации
X502_SYNC_DI_SYN1_RISE = 2; // По фронту сигнала DI_SYN1
X502_SYNC_DI_SYN1_FALL = 3; // По спаду сигнала DI_SYN1
X502_SYNC_DI_SYN2_RISE = 6; // По фронту сигнала DI_SYN2
X502_SYNC_DI_SYN2_FALL = 7; // По спаду сигнала DI_SYN2
{-------- Флаги, управляющие обработкой принятых данных -------------------}
X502_PROC_FLAGS_VOLT = $00000001; // Признак, что нужно преобразовать значения
// АЦП в вольты
X502_PROC_FLAGS_DONT_CHECK_CH = $00010000; // Признак, что не нужно проверять совпадение номеров каналов
{-------- Флаги для обозначения синхронных потоков данных -----------------}
X502_STREAM_ADC = $01; //Поток данных от АЦП
X502_STREAM_DIN = $02; // Поток данных с цифровых входов
X502_STREAM_DAC1 = $10; // Поток данных первого канала ЦАП
X502_STREAM_DAC2 = $20; // Поток данных второго канала ЦАП
X502_STREAM_DOUT = $40; // Поток данных на цифровые выводы
// объединение всех флагов, обозначающих потоки данных на ввод
X502_STREAM_ALL_IN = X502_STREAM_ADC or X502_STREAM_DIN;
// объединение всех флагов, обозначающих потоки данных на вывод
X502_STREAM_ALL_OUT = X502_STREAM_DAC1 or X502_STREAM_DAC2 or X502_STREAM_DOUT;
{--- Константы, определяющие тип передаваемого отсчета из ПК в модуль -----}
X502_STREAM_OUT_WORD_TYPE_DOUT = $0; // Цифровой вывод
X502_STREAM_OUT_WORD_TYPE_DAC1 = $40000000; // Код для 1-го канала ЦАП
X502_STREAM_OUT_WORD_TYPE_DAC2 = $80000000; // Код для 2-го канала ЦАП
{------------------ Режим работы модуля L502 ------------------------------}
X502_MODE_FPGA = 0; // Все потоки данных передаются через ПЛИС минуя
// сигнальный процессор BlackFin
X502_MODE_DSP = 1; // Все потоки данных передаются через сигнальный
// процессор, который должен быть загружен
// прошивкой для обработки этих потоков
X502_MODE_DEBUG = 2; // Отладочный режим
{------------------- Номера каналов ЦАП -----------------------------------}
X502_DAC_CH1 = 0; //Первый канал ЦАП
X502_DAC_CH2 = 1; //Второй канал ЦАП
{----------- Флаги, используемые при выводе данных на ЦАП -----------------}
// Указывает, что значение задано в Вольтах и при выводе его нужно
// перевести в коды ЦАП. Если флаг не указан, то считается, что значение
// изначально в кодах
X502_DAC_FLAGS_VOLT = $0001;
// Указывает, что нужно применить калибровочные коэффициенты перед
// выводом значения на ЦАП.
X502_DAC_FLAGS_CALIBR = $0002;
{---------- Номера каналов для передачи потоков данных --------------------}
X502_STREAM_CH_IN = 0; // Общий канал на ввод
X502_STREAM_CH_OUT = 1; // Общий канал на вывод
{--- Цифровые линии, на которых можно включить подтягивающие резисторы ----}
X502_PULLUPS_DI_H = $01; // Старшая половина цифровых входов (только для L502)
X502_PULLUPS_DI_L = $02; // Младшая половина цифровых входов (только для L502)
X502_PULLUPS_DI_SYN1 = $04; // Линия SYN1
X502_PULLUPS_DI_SYN2 = $08; // Линия SYN2
X502_PULLDOWN_CONV_IN = $10; // Подтяжка к 0 линии межмодульной
// синхронизации CONV_IN (только для E502)
X502_PULLDOWN_START_IN = $20; // Подтяжка к 0 линии межмодульной
// синхронизации START_IN (только для E502)
{--------------- Флаги, определяющие наличие опций в модуле ---------------}
// Признак наличия двухканального канального ЦАП
X502_DEVFLAGS_DAC_PRESENT = $00000001;
// Признак наличия гальваноразвязки
X502_DEVFLAGS_GAL_PRESENT = $00000002;
// Признак наличия сигнального процессора BlackFin
X502_DEVFLAGS_BF_PRESENT = $00000004;
// Признак, что устройство поддерживает интерфейс USB
X502_DEVFLAGS_IFACE_SUPPORT_USB = $00000100;
// Признак, что устройство поддерживает Ethernet
X502_DEVFLAGS_IFACE_SUPPORT_ETH = $00000200;
// Признак, что устройство поддерживает интерфейс PCI/PCI-Express
X502_DEVFLAGS_IFACE_SUPPORT_PCI = $00000400;
// Признак, что устройство выполнено в индустриалном исполнении
X502_DEVFLAGS_INDUSTRIAL = $00008000;
// Признак, что во Flash-памяти присутствует информация о модуле
X502_DEVFLAGS_FLASH_DATA_VALID = $00010000;
// Признак, что во Flash-памяти присутствуют действительные калибровочные коэффициенты АЦП
X502_DEVFLAGS_FLASH_ADC_CALIBR_VALID = $00020000;
// Признак, что во Flash-памяти присутствуют действительные калибровочные коэффициенты ЦАП
X502_DEVFLAGS_FLASH_DAC_CALIBR_VALID = $00040000;
// Признак, что присутствует прошивка ПЛИС и она успешно была загружена
X502_DEVFLAGS_FPGA_LOADED = $00800000;
// Признак, что устройство уже открыто (действителен только внутри t_x502_devrec)
X502_DEVFLAGS_DEVREC_OPENED = $01000000;
{ Тип содержимого строки с расположением устройства }
// В поле расположения устройства не содержится информации
X502_LOCATION_TYPE_NONE = 0;
// В поле расположения устройства содержится строка с адресом устройства
X502_LOCATION_TYPE_ADDR = 1;
// В поле ресположения устройства содержится строка с именем экземпляра
X502_LOCATION_TYPE_INSTANCE_NAME = 2;
{----------------Флаги для режима циклического вывода----------------------}
// Флаг указывает, что останов или смена сигнала могут произойти без ожидания
// конца цикла предыдущего сигнала.
X502_OUT_CYCLE_FLAGS_FORCE = $01;
// Флаг указывает, что функция должна дождаться полной загрузки сигнала
// и установки сигнала на вывод (для X502_OutCycleSetup()) или завершения
// генерации циклического сигнала (для X502_OutCycleStop())
X502_OUT_CYCLE_FLAGS_WAIT_DONE = $02;
{ ----- Коды возможностей модуля, которые могут поддерживаться или нет
в зависимости от типа модуля, версий прошивок и т.п. -------------}
// Поддержка установки делителя частоты вывода, отличного от #X502_OUT_FREQ_DIV_DEFAULT
X502_FEATURE_OUT_FREQ_DIV = 1;
// Возможность чтения флагов состояния вывода с помощью X502_OutGetStatusFlags()
X502_FEATURE_OUT_STATUS_FLAGS = 2;
{ --------------- Флаги состояния для синхронного вывода ------------------}
// Флаг указывает, что в настоящее время буфер в модуле на передачу пуст
X502_OUT_STATUS_FLAG_BUF_IS_EMPTY = $01;
// Флаг указывает, что было опустошение буфера на вывод с начала старта синхронного
// ввода-вывода или с момента последнего чтения статуса с помощью
// X502_OutGetStatusFlags() (в зависимости от того, что было последним)
X502_OUT_STATUS_FLAG_BUF_WAS_EMPTY = $02;
type
st_x502_devrec_inptr = record
end;
t_x502_devrec_inptr_hnd = ^st_x502_devrec_inptr;
// Структура, описывающая устройство, по которой с ним можно установить соединение
t_x502_devrec = record
sign : LongWord; { Признак действительной структуры.
Если запись действительна (соответствует какому-либо устройству),
то должен быть равен #X502_DEVREC_SIGN) }
devname : array [0..X502_DEVNAME_SIZE-1] of AnsiChar; // Название устройства
serial : array [0..X502_SERIAL_SIZE-1] of AnsiChar; // Серийный номер
location: array [0..X502_LOCATION_STR_SIZE-1] of AnsiChar; // Описание подключения (если есть)
flags : LongWord; // Флаги из #t_x502_dev_flags, описывающие устройство
iface : Byte; // Интерфейс, по которому подключено устройство
location_type : Byte; // Определяет, что именно сохранено в поле location
res : array [0..122-1] of Byte; // Резерв
internal : t_x502_devrec_inptr_hnd; { Непрозрачный указатель на структуру с
информацией об устройстве для возможности
его открытия. }
end;
// описатель модуля - указатель на непрозрачную структуру
t_x502_hnd = ^st_x502;
st_x502 = record
end;
{ калибровочные коэффициенты диапазона }
t_x502_cbr_coef = record
offs: Double; // смещение нуля
k : Double; // коэффициент шкалы
end;
{ Калибровочные коэффициенты модуля. }
t_x502_cbr = record
//Калибровочные коэффициенты АЦП
adc: array[0..X502_ADC_RANGE_CNT-1] of t_x502_cbr_coef;
res1: array[0..63] of LongWord;
// Калибровочные коэффициенты ЦАП
dac: array[0..X502_DAC_CH_CNT-1] of t_x502_cbr_coef;
res2: array[0..19] of LongWord;
end;
{ Информация о модуле}
t_x502_info = record
name: array[0..X502_DEVNAME_SIZE-1] of AnsiChar; // Название устройства ("L502")
serial: array[0..X502_SERIAL_SIZE-1] of AnsiChar; // Серийный номер
devflags: LongWord; // Флаги описывающие наличие в модуле определенных опций
fpga_ver : Word; // Версия ПЛИС (старший байт - мажорная, младший - минорная)
plda_ver : Byte; // Версия ПЛИС, управляющего аналоговой частью
board_rev: Byte; // Ревизия платы
mcu_firmware_ver : LongWord; // Версия прошивки контроллера Cortex-M4. Действительна только для E502
factory_mac : array[0..X502_MAC_ADDR_SIZE-1] of byte; { Заводской MAC-адрес --- действителен только для
устройств с Ethernet-интерфейсом }
res : array[0..110-1] of Byte; //резерв
cbr : t_x502_cbr; // Заводские калибровочные коэффициенты (из Flash-памяти)
end;
type t_x502_serial_array = array[0..0] of array[0..X502_SERIAL_SIZE-1] of AnsiChar;
type p_x502_serial_array = ^t_x502_serial_array;
type t_x502_devrec_array = array[0..0] of t_x502_devrec;
type p_x502_devrec_array = ^t_x502_devrec_array;
function X502_Create(): t_x502_hnd; stdcall;
function X502_Free(hnd: t_x502_hnd): LongInt; stdcall;
function X502_OpenByDevRecord(hnd: t_x502_hnd; var devrec : t_x502_devrec) : LongInt; stdcall;
function X502_FreeDevRecordList(list : array of t_x502_devrec; size : LongWord) : LongInt; stdcall; overload;
function X502_FreeDevRecordList(var rec : t_x502_devrec) : LongInt; stdcall; overload;
function X502_IsOpened(hnd: t_x502_hnd): LongInt; stdcall;
//разорвать связь с модулем
function X502_Close(hnd: t_x502_hnd): LongInt; stdcall;
//получение информации о модуле
function X502_GetDevInfo(hnd: t_x502_hnd; out info: t_x502_info) : LongInt; stdcall;
// Передача установленных настроек в модуль
function X502_Configure(hnd: t_x502_hnd; flags: LongWord): LongInt; stdcall;
// Установка параметров логического канала
function X502_SetLChannel(hnd: t_x502_hnd; lch, phy_ch, mode, range, avg: LongWord): LongInt; stdcall;
// Установка количества логических каналов
function X502_SetLChannelCount(hnd: t_x502_hnd; lch_cnt : LongWord): LongInt; stdcall;
// Получение количества логических каналов
function X502_GetLChannelCount(hnd: t_x502_hnd; out lch_cnt: LongWord): LongInt; stdcall;
// Установка делителя частоты сбора для АЦП
function X502_SetAdcFreqDivider(hnd: t_x502_hnd; adc_freq_div : LongWord): LongInt; stdcall;
// Установка значения межкадровой задержки для АЦП
function X502_SetAdcInterframeDelay(hnd: t_x502_hnd; delay : LongWord): LongInt; stdcall;
// Установка делителя частоты синхронного ввода с цифровых линий
function X502_SetDinFreqDivider(hnd: t_x502_hnd; din_freq_div: LongWord): LongInt; stdcall;
// Установка делителя частоты синхронного вывода
function X502_SetOutFreqDivider(hnd: t_x502_hnd; out_freq_div : LongWord): LongInt; stdcall;
// Установка частоты сбора АЦП
function X502_SetAdcFreq(hnd: t_x502_hnd; var f_acq, f_frame: Double): LongInt; stdcall;
// Установка частоты синхронного ввода с цифровых входов
function X502_SetDinFreq(hnd: t_x502_hnd; var f_din: Double): LongInt; stdcall;
// Установка частоты синхронного вывода.
function X502_SetOutFreq(hnd: t_x502_hnd; var f_dout: Double): LongInt; stdcall;
// Получить текущие значения частот сбора АЦП
function X502_GetAdcFreq(hnd: t_x502_hnd; out f_acq, f_frame: Double): LongInt; stdcall;
// Установка значения опорной частоты синхронизации
function X502_SetRefFreq(hnd: t_x502_hnd; freq: LongWord): LongInt; stdcall;
// Установка значения внешней опорной частоты синхронизации
function X502_SetExtRefFreqValue(hnd: t_x502_hnd; freq : Double): LongInt; stdcall;
//Получение значения опорной частоты синхронизации
function X502_GetRefFreqValue(hnd: t_x502_hnd; out freq : Double): LongInt; stdcall;
// Установка режима генерации частоты синхронизации.
function X502_SetSyncMode(hnd: t_x502_hnd; sync_mode: LongWord): LongInt; stdcall;
// Установка режима запуска частоты синхронизации.
function X502_SetSyncStartMode(hnd: t_x502_hnd; sync_start_mode: LongWord): LongInt; stdcall;
// Установить режим работы модуля
function X502_SetMode(hnd: t_x502_hnd; mode: LongWord): LongInt; stdcall;
// Получение текущего режима работы модуля.
function X502_GetMode(hnd: t_x502_hnd; out mode: LongWord): LongInt; stdcall;
// Установить коэффициенты для калибровки значений АЦП.
function X502_SetAdcCoef(hnd: t_x502_hnd; range: LongWord; k, offs: Double): LongInt; stdcall;
// Получение текущих калибровочных коэффициентов АЦП.
function X502_GetAdcCoef(hnd: t_x502_hnd; range: LongWord; out k, offs: Double): LongInt; stdcall;
// Установить коэффициенты для калибровки значений ЦАП.
function X502_SetDacCoef(hnd: t_x502_hnd; ch : LongWord; k, double: Double): LongInt; stdcall;
// Получение текущих калибровочных коэффициентов ЦАП.
function X502_GetDacCoef(hnd: t_x502_hnd; ch : LongWord; out k, double: Double): LongInt; stdcall;
// Рассчет частоты сбора АЦП
function X502_CalcAdcFreq(ref_freq: Double; lch_cnt: LongWord; var f_acq, f_frame: Double; out result_freq_div : LongWord; out result_frame_delay: LongWord): LongInt; stdcall;
// Рассчет частоты синхронного ввода с цифровых входов.
function X502_CalcDinFreq(ref_freq: Double; var f_din : Double; out result_freq_div : LongWord): LongInt; stdcall;
// Рассчет частоты синхронного вывода
function X502_CalcOutFreq(ref_freq: Double; var f_dout : Double; out result_freq_div : LongWord): LongInt; stdcall;
{----------------------- Функции асинхронного ввода-вывода ------------------}
// Асинхронный вывод данных на канал ЦАП.
function X502_AsyncOutDac(hnd: t_x502_hnd; ch: LongWord; data: Double; flags: LongWord): LongInt; stdcall;
// Асинхронный вывод данных на цифровые выходы.
function X502_AsyncOutDig(hnd: t_x502_hnd; val, msk: LongWord): LongInt; stdcall;
// Асинхронный ввод значений с цифровых входов.
function X502_AsyncInDig(hnd: t_x502_hnd; out din: LongWord): LongInt; stdcall;
// Асинхронный ввод одного кадра АЦП.
function X502_AsyncGetAdcFrame(hnd: t_x502_hnd; flags: LongWord; tout: LongWord; out data: array of Double): LongInt; stdcall;
{-------------- Функции для работы с синхронным потоковым вводом-выводом ----}
// Разрешение синхронных потоков на ввод/вывод.
function X502_StreamsEnable(hnd: t_x502_hnd; streams: LongWord): LongInt; stdcall;
// Запрещение синхронных потоков на ввод/вывод.
function X502_StreamsDisable(hnd: t_x502_hnd; streams: LongWord): LongInt; stdcall;
// Получить значение, какие синхронные потоки разрешены.
function X502_GetEnabledStreams(hnd: t_x502_hnd; out streams: LongWord): LongInt; stdcall;
// Запуск синхронных потоков ввода/вывода.
function X502_StreamsStart(hnd: t_x502_hnd): LongInt; stdcall;
// Останов синхронных потоков ввода/вывода.
function X502_StreamsStop(hnd: t_x502_hnd): LongInt; stdcall;
// Проверка, запущен ли поток данных
function X502_IsRunning(hnd: t_x502_hnd): LongInt; stdcall;
// Чтение данных АЦП и цивровых входов из модуля.
function X502_Recv(hnd: t_x502_hnd; out buf : array of LongWord; size: LongWord; tout : LongWord): LongInt; stdcall;
// Передача потоковых данных ЦАП и цифровых выходов в модуль.
function X502_Send(hnd: t_x502_hnd; const buf : array of LongWord; size: LongWord; tout: LongWord): LongInt; stdcall;
// Обработка принятых отсчетов АЦП от модуля.
function X502_ProcessAdcData(hnd: t_x502_hnd; const src: array of LongWord;
out dest: array of Double; var size : LongWord;
flags : LongWord): LongInt; stdcall;
// Обработка принятых от модуля данных.
function X502_ProcessData(hnd: t_x502_hnd; const src: array of LongWord; size: LongWord;
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
out din_data: array of LongWord; var din_data_size: LongWord):LongInt; stdcall;
// Обработка принятых от модуля данных ьзовательскими данными.
function X502_ProcessDataWithUserExt(hnd: t_x502_hnd; const src: array of LongWord; size: LongWord;
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
out din_data: array of LongWord; var din_data_size: LongWord;
out usr_data: array of LongWord; var usr_data_size: LongWord):LongInt; stdcall;
// Подготовка данных для вывода в модуль.
function X502_PrepareData(hnd: t_x502_hnd; const dac1, dac2: array of Double;
const digout: array of LongWord; size, flags : LongWord;
out out_buf: array of LongWord):LongInt; stdcall;
// Получить количество отсчетов в буфере потока на ввод.
function X502_GetRecvReadyCount(hnd: t_x502_hnd; out rdy_cnt: LongWord):LongInt; stdcall;
// Получить размер свободного места в буфере потока на вывод.
function X502_GetSendReadyCount(hnd: t_x502_hnd; out rdy_cnt: LongWord):LongInt; stdcall;
// Получить номер следующего ожидаемого логического канала АЦП для обработки.
function X502_GetNextExpectedLchNum(hnd: t_x502_hnd; out lch: LongWord):LongInt; stdcall;
// Начало подготовки вывода синхронных данных
function X502_PreloadStart(hnd: t_x502_hnd): LongInt; stdcall;
//Установка ранее загруженного циклического сигнала на вывод
function X502_OutCycleLoadStart(hnd: t_x502_hnd; size: LongWord):LongInt; stdcall;
//Установка ранее загруженного циклического сигнала на вывод
function X502_OutCycleSetup(hnd: t_x502_hnd; flags: LongWord):LongInt; stdcall;
// Останов вывода циклического сигнала
function X502_OutCycleStop(hnd: t_x502_hnd; flags: LongWord):LongInt; stdcall;
// Проверка, завершена ли установка или останов циклического сигнала
function X502_OutCycleCheckSetupDone(hnd: t_x502_hnd; out done : LongBool):LongInt; stdcall;
// Чтение флагов статуса вывода
function X502_OutGetStatusFlags(hnd: t_x502_hnd; out status : LongWord): LongInt; stdcall;
// Установка размера буфера для синхронного ввода или вывода.
function X502_SetStreamBufSize(hnd: t_x502_hnd; dma_ch, size: LongWord): LongInt; stdcall;
// Установка шага при передаче потока на ввод или вывод.
function X502_SetStreamStep(hnd: t_x502_hnd; dma_ch, step: LongWord): LongInt; stdcall;
{------------ Функции для работы с сигнальным процессором -------------------}
// Загрузка прошивки сигнального процессора BlackFin.
function X502_BfLoadFirmware(hnd: t_x502_hnd; filename: string): LongInt; stdcall;
// Проверка, загружена ли прошивка BlackFIn
function X502_BfCheckFirmwareIsLoaded(hnd: t_x502_hnd; out version: LongWord): LongInt; stdcall;
/// Чтение блока данных из памяти сигнального процессора.
function X502_BfMemRead(hnd: t_x502_hnd; addr : LongWord; out regs: array of LongWord;
size: LongWord): LongInt; stdcall;
/// Запись блока данных в память сигнального процессора.
function X502_BfMemWrite(hnd: t_x502_hnd; addr : LongWord;
const regs: array of LongWord; size: LongWord): LongInt; stdcall;
/// Передача управляющей команды сигнальному процессору.
function X502_BfExecCmd(hnd: t_x502_hnd; cmd_code : Word; par : LongWord;
const snd_data : array of LongWord; snd_size : LongWord;
out rcv_data : array of LongWord; rcv_size : LongWord;
tout: LongWord; out recvd_size: LongWord): LongInt; stdcall;
{------------------- Функции для работы с Flash-памятью модуля -------------}
/// Чтение блока данных из Flash-памяти модуля.
function X502_FlashRead(hnd: t_x502_hnd; addr: LongWord;
out data: array of Byte; size: LongWord): LongInt; stdcall;
///Запись блока данных во Flash-память модуля.
function X502_FlashWrite(hnd: t_x502_hnd; addr: LongWord;
const data: array of Byte; size: LongWord): LongInt; stdcall;
/// Стирание блока во Flash-памяти.
function X502_FlashErase(hnd: t_x502_hnd; addr: LongWord; size: LongWord): LongInt; stdcall;
/// Разрешение записи в пользовательскую область Flash-памяти.
function X502_FlashWriteEnable(hnd: t_x502_hnd): LongInt; stdcall;
/// Запрет записи в пользовательскую область Flash-памяти.
function X502_FlashWriteDisable(hnd: t_x502_hnd): LongInt; stdcall;
{----------------- Дополнительные вспомогательные функции ------------------}
//Получить версию библиотеки.
function X502_GetLibraryVersion() : LongWord; stdcall;
// Получение строки об ошибке
function X502_GetErrorString(err: LongInt) : string; stdcall;
// Моргание светодиодом на передней панели.
function X502_LedBlink(hnd: t_x502_hnd): LongInt; stdcall;
// Установка подтягивающих резисторов на входных линиях.
function X502_SetDigInPullup(hnd: t_x502_hnd; pullups : LongWord): LongInt; stdcall;
// Проверка поддержки модулем заданной возможности
function X502_CheckFeature(hnd: t_x502_hnd; feature : LongWord) : LongInt; stdcall;
implementation
function X502_Create() : t_x502_hnd; stdcall; external 'x502api.dll';
function X502_Free(hnd: t_x502_hnd) : LongInt; stdcall; external 'x502api.dll';
function X502_OpenByDevRecord(hnd: t_x502_hnd; var devrec : t_x502_devrec) : LongInt; stdcall; external 'x502api.dll';
function _free_dev_record_list(var list ; size : LongWord) : LongInt; stdcall; external 'x502api.dll' name 'X502_FreeDevRecordList';
function X502_IsOpened(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_Close(hnd : t_x502_hnd) : LongInt; stdcall; external 'x502api.dll';
function X502_GetDevInfo(hnd : t_x502_hnd; out info : t_x502_info) : LongInt; stdcall; external 'x502api.dll';
function X502_Configure(hnd: t_x502_hnd; flags: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetLChannel(hnd: t_x502_hnd; lch, phy_ch, mode, range, avg: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetLChannelCount(hnd: t_x502_hnd; lch_cnt : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_GetLChannelCount(hnd: t_x502_hnd; out lch_cnt: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetAdcFreqDivider(hnd: t_x502_hnd; adc_freq_div : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetAdcInterframeDelay(hnd: t_x502_hnd; delay : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetDinFreqDivider(hnd: t_x502_hnd; din_freq_div: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetOutFreqDivider(hnd: t_x502_hnd; out_freq_div : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetAdcFreq(hnd: t_x502_hnd; var f_acq, f_frame: Double): LongInt; stdcall; external 'x502api.dll';
function X502_SetDinFreq(hnd: t_x502_hnd; var f_din: Double): LongInt; stdcall; external 'x502api.dll';
function X502_SetOutFreq(hnd: t_x502_hnd; var f_dout: Double): LongInt; stdcall; external 'x502api.dll';
function X502_GetAdcFreq(hnd: t_x502_hnd; out f_acq, f_frame: Double): LongInt; stdcall; external 'x502api.dll';
function X502_SetRefFreq(hnd: t_x502_hnd; freq: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetExtRefFreqValue(hnd: t_x502_hnd; freq : Double): LongInt; stdcall; external 'x502api.dll';
function X502_GetRefFreqValue(hnd: t_x502_hnd; out freq : Double): LongInt; stdcall; external 'x502api.dll';
function X502_SetSyncMode(hnd: t_x502_hnd; sync_mode: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetSyncStartMode(hnd: t_x502_hnd; sync_start_mode: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetMode(hnd: t_x502_hnd; mode: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_GetMode(hnd: t_x502_hnd; out mode: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetAdcCoef(hnd: t_x502_hnd; range: LongWord; k, offs: Double): LongInt; stdcall; external 'x502api.dll';
function X502_GetAdcCoef(hnd: t_x502_hnd; range: LongWord; out k, offs: Double): LongInt; stdcall; external 'x502api.dll';
function X502_SetDacCoef(hnd: t_x502_hnd; ch : LongWord; k, double: Double): LongInt; stdcall; external 'x502api.dll';
function X502_GetDacCoef(hnd: t_x502_hnd; ch : LongWord; out k, double: Double): LongInt; stdcall; external 'x502api.dll';
function X502_CalcAdcFreq(ref_freq: Double; lch_cnt: LongWord; var f_acq, f_frame: Double; out result_freq_div : LongWord; out result_frame_delay: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_CalcDinFreq(ref_freq: Double; var f_din : Double; out result_freq_div : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_CalcOutFreq(ref_freq: Double; var f_dout : Double; out result_freq_div : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_AsyncOutDac(hnd: t_x502_hnd; ch: LongWord; data: Double; flags: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_AsyncOutDig(hnd: t_x502_hnd; val, msk: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_AsyncInDig(hnd: t_x502_hnd; out din: LongWord): LongInt; stdcall; external 'x502api.dll';
function _get_adc_frame(hnd: t_x502_hnd; flags: LongWord; tout: LongWord; out data): LongInt; stdcall; external 'x502api.dll' name 'X502_AsyncGetAdcFrame';
function X502_StreamsEnable(hnd: t_x502_hnd; streams: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_StreamsDisable(hnd: t_x502_hnd; streams: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_GetEnabledStreams(hnd: t_x502_hnd; out streams: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_StreamsStart(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_IsRunning(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_StreamsStop(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function _recv(hnd: t_x502_hnd; out buf; size: LongWord; tout : LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_Recv';
function _send(hnd: t_x502_hnd; const buf; size: LongWord; tout : LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_Send';
function _process_adc_data(hnd: t_x502_hnd; const src; out dest; var size : LongWord;
flags : LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_ProcessAdcData';
function _process_data(hnd: t_x502_hnd; const src; size: LongWord;
flags : LongWord; out adc_data; var adc_data_size : LongWord;
out din_data; var din_data_size: LongWord):LongInt; stdcall; external 'x502api.dll' name 'X502_ProcessData';
function _process_data_usr(hnd: t_x502_hnd; const src; size: LongWord;
flags : LongWord; out adc_data; var adc_data_size : LongWord;
out din_data; var din_data_size: LongWord;
out usr_data; var usr_data_size: LongWord):LongInt; stdcall; external 'x502api.dll' name 'X502_ProcessDataWithUserExt';
function _prepare_data(hnd: t_x502_hnd; const dac1, dac2; const digout; size, flags : LongWord;
out out_buf):LongInt; stdcall; external 'x502api.dll' name 'X502_PrepareData';
function X502_GetRecvReadyCount(hnd: t_x502_hnd; out rdy_cnt: LongWord):LongInt; stdcall; external 'x502api.dll';
function X502_GetSendReadyCount(hnd: t_x502_hnd; out rdy_cnt: LongWord):LongInt; stdcall; external 'x502api.dll';
function X502_GetNextExpectedLchNum(hnd: t_x502_hnd; out lch: LongWord):LongInt; stdcall; external 'x502api.dll';
function X502_PreloadStart(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_OutCycleLoadStart(hnd: t_x502_hnd; size: LongWord):LongInt; stdcall; external 'x502api.dll';
function X502_OutCycleSetup(hnd: t_x502_hnd; flags: LongWord):LongInt; stdcall; external 'x502api.dll';
function X502_OutCycleStop(hnd: t_x502_hnd; flags: LongWord):LongInt; stdcall; external 'x502api.dll';
function X502_OutCycleCheckSetupDone(hnd: t_x502_hnd; out done : LongBool):LongInt; stdcall; external 'x502api.dll';
function X502_OutGetStatusFlags(hnd: t_x502_hnd; out status : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetStreamBufSize(hnd: t_x502_hnd; dma_ch, size: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_SetStreamStep(hnd: t_x502_hnd; dma_ch, step: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_BfCheckFirmwareIsLoaded(hnd: t_x502_hnd; out version: LongWord): LongInt; stdcall; external 'x502api.dll';
function _bf_load_firm(hnd: t_x502_hnd; filename: PAnsiChar): LongInt; stdcall; external 'x502api.dll' name 'X502_BfLoadFirmware';
function _bf_mem_read(hnd: t_x502_hnd; addr : LongWord; out regs; size: LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_BfMemRead';
function _bf_mem_write(hnd: t_x502_hnd; addr : LongWord; const regs; size: LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_BfMemWrite';
function _bf_exec_cmd(hnd: t_x502_hnd; cmd_code : Word; par : LongWord;
const snd_data; snd_size : LongWord; out rcv_data; rcv_size : LongWord;
tout: LongWord; out recved_size: LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_BfExecCmd';
function _flash_read(hnd: t_x502_hnd; addr: LongWord; out data; size: LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_FlashRead';
function _flash_write(hnd: t_x502_hnd; addr: LongWord; const data; size: LongWord): LongInt; stdcall; external 'x502api.dll' name 'X502_FlashWrite';
function X502_FlashErase(hnd: t_x502_hnd; addr: LongWord; size: LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_FlashWriteEnable(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_FlashWriteDisable(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_GetLibraryVersion() : LongWord; stdcall; external 'x502api.dll';
function _get_err_str(err : LongInt) : PAnsiChar; stdcall; external 'x502api.dll' name 'X502_GetErrorString';
function X502_LedBlink(hnd: t_x502_hnd): LongInt; stdcall; external 'x502api.dll';
function X502_SetDigInPullup(hnd: t_x502_hnd; pullups : LongWord): LongInt; stdcall; external 'x502api.dll';
function X502_CheckFeature(hnd: t_x502_hnd; feature : LongWord) : LongInt; stdcall; external 'x502api.dll';
function X502_FreeDevRecordList(list : array of t_x502_devrec; size : LongWord) : LongInt; stdcall; overload;
begin
X502_FreeDevRecordList:=_free_dev_record_list(list, size);
end;
function X502_FreeDevRecordList(var rec : t_x502_devrec) : LongInt; stdcall; overload;
begin
X502_FreeDevRecordList:=_free_dev_record_list(rec, 1);
end;
function X502_GetErrorString(err: LongInt) : string;
begin
X502_GetErrorString:= string(_get_err_str(err));
end;
function X502_AsyncGetAdcFrame(hnd: t_x502_hnd; flags: LongWord; tout: LongWord; out data: array of Double): LongInt; stdcall;
var err: LongInt;
lch_cnt: LongWord;
begin
err := X502_GetLChannelCount(hnd, lch_cnt);
if err = X502_ERR_OK then
begin
if LongWord(Length(data)) < lch_cnt then
err := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
err := _get_adc_frame(hnd,flags,tout,data);
end;
X502_AsyncGetAdcFrame := err;
end;
function X502_Recv(hnd: t_x502_hnd; out buf : array of LongWord; size: LongWord; tout : LongWord): LongInt; stdcall;
begin
if LongWord(Length(buf)) < size then
X502_Recv := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_Recv := _recv(hnd, buf, size, tout);
end;
function X502_Send(hnd: t_x502_hnd; const buf : array of LongWord; size: LongWord; tout: LongWord): LongInt; stdcall;
begin
if LongWord(Length(buf)) < size then
X502_Send:=X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_Send:=_send(hnd,buf,size,tout);
end;
function X502_ProcessAdcData(hnd: t_x502_hnd; const src: array of LongWord;
out dest: array of Double; var size : LongWord;
flags : LongWord): LongInt; stdcall;
begin
if (LongWord(Length(src)) < size) or (LongWord(Length(dest)) < size) then
X502_ProcessAdcData:=X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_ProcessAdcData:=_process_adc_data(hnd, src, dest, size, flags);
end;
function X502_ProcessData(hnd: t_x502_hnd; const src: array of LongWord; size: LongWord;
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
out din_data: array of LongWord; var din_data_size: LongWord):LongInt; stdcall;
begin
if (LongWord(Length(adc_data)) < adc_data_size) or (LongWord(Length(din_data)) < din_data_size)
or (LongWord(Length(src)) < size) then
X502_ProcessData:=X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_ProcessData:=_process_data(hnd, src, size, flags, adc_data, adc_data_size, din_data, din_data_size);
end;
function X502_ProcessDataWithUserExt(hnd: t_x502_hnd; const src: array of LongWord; size: LongWord;
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
out din_data: array of LongWord; var din_data_size: LongWord;
out usr_data: array of LongWord; var usr_data_size: LongWord):LongInt; stdcall;
begin
if (LongWord(Length(adc_data)) < adc_data_size) or (LongWord(Length(din_data)) < din_data_size)
or (LongWord(Length(src)) < size) or (LongWord(Length(usr_data)) < usr_data_size) then
X502_ProcessDataWithUserExt:=X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_ProcessDataWithUserExt:=_process_data_usr(hnd, src,size,flags,adc_data,
adc_data_size, din_data, din_data_size, usr_data, usr_data_size);
end;
function X502_PrepareData(hnd: t_x502_hnd; const dac1, dac2: array of Double;
const digout: array of LongWord; size, flags : LongWord;
out out_buf: array of LongWord):LongInt; stdcall;
begin
X502_PrepareData:=_prepare_data(hnd, dac1, dac2, digout, size, flags, out_buf);
end;
function X502_BfLoadFirmware(hnd: t_x502_hnd; filename: string): LongInt; stdcall;
begin
X502_BfLoadFirmware:=_bf_load_firm(hnd, PAnsiChar(AnsiString(filename)));
end;
function X502_BfMemRead(hnd: t_x502_hnd; addr : LongWord; out regs: array of LongWord;
size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(regs)) < size) then
X502_BfMemRead := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_BfMemRead:=_bf_mem_read(hnd, addr, regs, size);
end;
function X502_BfMemWrite(hnd: t_x502_hnd; addr : LongWord;
const regs: array of LongWord; size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(regs)) < size) then
X502_BfMemWrite := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_BfMemWrite:=_bf_mem_write(hnd, addr, regs, size);
end;
function X502_BfExecCmd(hnd: t_x502_hnd; cmd_code : Word; par : LongWord;
const snd_data : array of LongWord; snd_size : LongWord;
out rcv_data : array of LongWord; rcv_size : LongWord;
tout: LongWord; out recvd_size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(snd_data)) < snd_size) or
(LongWord(Length(rcv_data)) < rcv_size) then
X502_BfExecCmd := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_BfExecCmd:=_bf_exec_cmd(hnd, cmd_code, par, snd_data, snd_size,
rcv_data, rcv_size, tout, recvd_size);
end;
function X502_FlashRead(hnd: t_x502_hnd; addr: LongWord;
out data: array of Byte; size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(data)) < size) then
X502_FlashRead := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_FlashRead:=_bf_mem_write(hnd, addr, data, size);
end;
///Запись блока данных во Flash-память модуля.
function X502_FlashWrite(hnd: t_x502_hnd; addr: LongWord;
const data: array of Byte; size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(data)) < size) then
X502_FlashWrite := X502_ERR_INSUFFICIENT_ARRAY_SIZE
else
X502_FlashWrite:=_bf_mem_write(hnd, addr, data, size);
end;
end.