Files
E502_ADC_BF_PC_companion/x502api-1.1.34/devs/l502/pas/l502api.pas

806 lines
42 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 l502api;
interface
uses Windows, SysUtils, x502api;
//получение списка серийных номеров
function L502_GetSerialList(out serials: array of string; flags: LongWord; out devcnt: LongWord) : LongInt; overload;
function L502_GetSerialList(out serials: array of string; flags: LongWord) : LongInt; overload;
//установить связь с модулем по серийному номеру
function L502_Open(hnd: t_x502_hnd; serial: string): LongInt; stdcall;
function L502_GetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord; out devcnt: LongWord) : LongInt; overload;
function L502_GetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord) : LongInt; overload;
{ ----------- типы и функции, оставленные для обратной совместимости ----------}
const
// Максимальное количество логических каналов в таблице
L502_LTABLE_MAX_CH_CNT = 256;
// Количество диапазонов для измерения напряжений
L502_ADC_RANGE_CNT = 6;
// Максимальное значение для аппаратного усреднения по логическому каналу
L502_LCH_AVG_SIZE_MAX = 128;
//Максимальное значения делителя частоты АЦП
L502_ADC_FREQ_DIV_MAX = (1024*1024);
// Максимальное значение делителя частоты синхронного цифрового ввода
L502_DIN_FREQ_DIV_MAX = (1024*1024);
// Максимальное значение межкадровой задержки для АЦП
L502_ADC_INTERFRAME_DELAY_MAX = $1FFFFF;
// Таймаут по умолчанию для выполнения команды к BlackFin
L502_BF_CMD_DEFAULT_TOUT = 500;
// Код АЦП, соответствующий максимальному значению шкалы
L502_ADC_SCALE_CODE_MAX = 6000000;
// Код ЦАП, соответствующий максимальному значению шкалы
L502_DAC_SCALE_CODE_MAX = 30000;
// Максимальное количество символов в строке с названием устройства
L502_DEVNAME_SIZE = X502_DEVNAME_SIZE;
// Максимальное количество символов в строке с серийным номером
L502_SERIAL_SIZE = X502_SERIAL_SIZE;
//Размер пользовательской области Flash-памяти
L502_FLASH_USER_SIZE = $100000;
//Стандартный таймаут на выполнение запроса к BlackFin в мс
L502_BF_REQ_TOUT = 500;
// Диапазон ЦАП в вольтах
L502_DAC_RANGE = 5;
// Количество каналов ЦАП
L502_DAC_CH_CNT = 2;
// слово в потоке, означающее, что произошло переполнение
L502_STREAM_IN_MSG_OVERFLOW = $01010000;
// Максимально возможное значение внешней опорной частоты
L502_EXT_REF_FREQ_MAX = 2000000;
{ ----------------- Коды ошибок библиотеки ---------------------------}
// Функция выполнена без ошибок
L502_ERR_OK = 0;
// В функцию передан недействительный описатель модуля
L502_ERR_INVALID_HANDLE = -1;
// Ошибка выделения памяти
L502_ERR_MEMORY_ALLOC = -2;
// Попытка открыть уже открытое устройство
L502_ERR_ALREADY_OPENED = -3;
// Устройство с заданными параметрами не найдено в системе
L502_ERR_DEVICE_NOT_FOUND = -4;
// Доступ к устройству запрещен (Как правило из-за того, что устройство уже открыто в другой программе)
L502_ERR_DEVICE_ACCESS_DENIED = -5;
// Ошибка открытия устройства
L502_ERR_DEVICE_OPEN = -6;
// В функцию передан недействительный указатель
L502_ERR_INVALID_POINTER = -7;
// Функция не может быть выполнена при запущенном потоке сбора данных
L502_ERR_STREAM_IS_RUNNING = -8;
// Ошибка чтения данных синхронного ввода
L502_ERR_RECV = -9;
// Ошибка записи данных для синхронного вывода
L502_ERR_SEND = -10;
// Произошло переполнение внутреннего буфера для потока синхронного ввода
L502_ERR_STREAM_OVERFLOW = -11;
// Неизвестное сообщение в потоке синхронного ввода
L502_ERR_UNSUP_STREAM_MSG = -12;
// Ошибка создания системного мьютекса
L502_ERR_MUTEX_CREATE = -13;
// Неверный описатель мьютекса
L502_ERR_MUTEX_INVALID_HANDLE = -14;
// Истекло время ожидания освобождения мьютекса
L502_ERR_MUTEX_LOCK_TOUT = -15;
// Ошибка освобождения мьютекса
L502_ERR_MUTEX_RELEASE = -16;
// Недостаточно системных ресурсов
L502_ERR_INSUFFICIENT_SYSTEM_RESOURCES= -17;
// Данная возможность еще не реализована
L502_ERR_NOT_IMPLEMENTED = -18;
// Недостаточный размер массива
L502_ERR_INSUFFICIENT_ARRAY_SIZE = -19;
// Ошибка чтения регистра FPGA
L502_ERR_FPGA_REG_READ = -20;
// Ошибка записи регистра FPGA
L502_ERR_FPGA_REG_WRITE = -21;
// Сбор данных уже остановлен
L502_ERR_STREAM_IS_NOT_RUNNING = -22;
// Задан неверный размер логической таблицы
L502_ERR_INVALID_LTABLE_SIZE = -102;
// Задан неверный номер логического канала
L502_ERR_INVALID_LCH_NUMBER = -103;
// Неверно задано значение диапазона АЦП
L502_ERR_INVALID_LCH_RANGE = -104;
// Неверно задан режим измерения для логического канала
L502_ERR_INVALID_LCH_MODE = -105;
// Неверно задан номер физического канала при настройке логического
L502_ERR_INVALID_LCH_PHY_NUMBER = -106;
// Неверно задан размер усреднения для логического канала
L502_ERR_INVALID_LCH_AVG_SIZE = -107;
// Неверно задан делитель частоты сбора данных АЦП
L502_ERR_INVALID_ADC_FREQ_DIV = -108;
// Неверно задан делитель частоты синхронного ввода цифровых линий
L502_ERR_INVALID_DIN_FREQ_DIV = -108;
// Неверно задан режим работы модуля L502
L502_ERR_INVALID_MODE = -109;
// Неверный номер канала ЦАП
L502_ERR_INVALID_DAC_CHANNEL = -110;
// Неверный код выбора опорной частоты синхронизации
L502_ERR_INVALID_REF_FREQ = -111;
// Неверно задано значение межкадровой задержки
L502_ERR_INVALID_INTERFRAME_DELAY = -112;
// Неверно задан режим синхронизации
L502_ERR_INVALID_SYNC_MODE = -113;
// Неверно задан номер канала DMA
L502_ERR_INVALID_DMA_CH = -114;
// Ошибка захвата опорной частоты синхронизации
L502_ERR_REF_FREQ_NOT_LOCKED = -131;
// Управляющий запрос к драйверу завершен с ошибкой
L502_ERR_IOCTL_FAILD = -132;
// Истек таймаут ожидания завершения выполнения управляющего запроса к драйверу
L502_ERR_IOCTL_TIMEOUT = -133;
// Ошибка получения информации о устройстве от драйвера
L502_ERR_GET_INFO = -134;
// За время ожидания не было считано новое слово с цифровых линий
L502_ERR_DIG_IN_NOT_RDY = -135;
// Принято недостаточно слов от модуля
L502_ERR_RECV_INSUFFICIENT_WORDS = -136;
// Попытка выполнить операцию, требующую наличие ЦАП, при его отсутствии
L502_ERR_DAC_NOT_PRESENT = -137;
// Неверный номер канала в обрабатываемом потоке синхронного ввода
L502_ERR_PROC_INVALID_CH_NUM = -140;
// Неверный код диапазона в обрабатываемом потоке синхронного ввода
L502_ERR_PROC_INVALID_CH_RANGE = -141;
// Задан неверный адрес во Flash-памяти
L502_ERR_FLASH_INVALID_ADDR = -142;
// Задан неверный размер блока данных при работе с Flash-памятью
L502_ERR_FLASH_INVALID_SIZE = -143;
// Истек таймаут ожидания завершения записи во Flash-память
L502_ERR_FLASH_WRITE_TOUT = -144;
// Истек таймаут ожидания завершения стирания блока Flash-памяти
L502_ERR_FLASH_ERASE_TOUT = -145;
// Заданная область для стирания Flash-памяти нарушает границу блока в 4 Кбайт
L502_ERR_FLASH_SECTOR_BOUNDARY = -146;
// Не удалось открыть файл прошивки BlackFin
L502_ERR_LDR_FILE_OPEN = -180;
// Ошибка чтения из фала прошивки BlackFin
L502_ERR_LDR_FILE_READ = -181;
// Неверный формат файла прошивки BlackFin
L502_ERR_LDR_FILE_FORMAT = -182;
// Используются возможность LDR-файла, недоступные при записи прошивки BlackFin по HDMA
L502_ERR_LDR_FILE_UNSUP_FEATURE = -183;
// Неверный стартовый адрес программы в прошивке BlackFin
L502_ERR_LDR_FILE_UNSUP_STARTUP_ADDR = -184;
// Истек таймаут выполнения запроса на чтения/запись памяти BlackFin
L502_ERR_BF_REQ_TIMEOUT = -185;
// Команда для BlackFin все еще находится в процессе обработки
L502_ERR_BF_CMD_IN_PROGRESS = -186;
// Истекло время выполнения управляющей команды процессором BlackFin
L502_ERR_BF_CMD_TIMEOUT = -187;
// Возвращено недостаточно данных в ответ на команду к BlackFin
L502_ERR_BF_CMD_RETURN_INSUF_DATA = -188;
// Истек таймаут ожидания готовности процессора BlackFin к записи прошивки
L502_ERR_BF_LOAD_RDY_TOUT = -189;
// Попытка выполнить операцию для которой нужен сигнальный процессор при
// отсутствии сигнального процессора в модуле
L502_ERR_BF_NOT_PRESENT = -190;
// Неверный адрес памяти BlackFin при записи или чтении по HDMA
L502_ERR_BF_INVALID_ADDR = -191;
// Неверный размер данных, передаваемых с управляющей командой в BlackFin
L502_ERR_BF_INVALID_CMD_DATA_SIZE = -192;
{-------- Флаги, управляющие поиском присутствующих модулей ------}
// Признак, что нужно вернуть серийные номера только тех устройств,
// которые еще не открыты
L502_GETDEVS_FLAGS_ONLY_NOT_OPENED = X502_GETDEVS_FLAGS_ONLY_NOT_OPENED;
{-------- Флаги для управления цифровыми выходами. ---------------}
//Запрещение (перевод в третье состояние) старшей половины цифровых выходов
L502_DIGOUT_WORD_DIS_H = $00020000;
//Запрещение младшей половины цифровых выходов
L502_DIGOUT_WORD_DIS_L = $00010000;
{-------- Константы для выбора опорной частоты -------------------}
L502_REF_FREQ_2000KHZ = 2000000; // частота 2МГц
L502_REF_FREQ_1500KHZ = 1500000; // частота 1.5МГц
{-------- Диапазоны измерения для канала АЦП ----------------------}
L502_ADC_RANGE_10 = 0; // диапазон +/-10V
L502_ADC_RANGE_5 = 1; // диапазон +/-5V
L502_ADC_RANGE_2 = 2; // диапазон +/-2V
L502_ADC_RANGE_1 = 3; // диапазон +/-1V
L502_ADC_RANGE_05 = 4; // диапазон +/-0.5V
L502_ADC_RANGE_02 = 5; // диапазон +/-0.2V
{-------- Режим измерения для логического канала ------------------}
L502_LCH_MODE_COMM = 0; // Измерение напряжения относительно общей земли
L502_LCH_MODE_DIFF = 1; // Дифференциальное измерение напряжения
L502_LCH_MODE_ZERO = 2; // Измерение собственного нуля
{-------- Режимы синхронизации ------------------------------------}
L502_SYNC_INTERNAL = 0; // внутренний сигнал
L502_SYNC_EXTERNAL_MASTER = 1; // от внешнего мастера по разъему синхронизации
L502_SYNC_DI_SYN1_RISE = 2; // по фронту сигнала DI_SYN1
L502_SYNC_DI_SYN2_RISE = 3; // по фронту сигнала DI_SYN2
L502_SYNC_DI_SYN1_FALL = 6; // по спаду сигнала DI_SYN1
L502_SYNC_DI_SYN2_FALL = 7; // по спаду сигнала DI_SYN2
{-------- Флаги, управляющие обработкой принятых данных -------------------}
L502_PROC_FLAGS_VOLT = 1; // Признак, что нужно преобразовать значения
// АЦП в вольты
{-------- Флаги для обозначения синхронных потоков данных -----------------}
L502_STREAM_ADC = $01; //Поток данных от АЦП
L502_STREAM_DIN = $02; // Поток данных с цифровых входов
L502_STREAM_DAC1 = $10; // Поток данных первого канала ЦАП
L502_STREAM_DAC2 = $20; // Поток данных второго канала ЦАП
L502_STREAM_DOUT = $40; // Поток данных на цифровые выводы
// объединение всех флагов, обозначающих потоки данных на ввод
L502_STREAM_ALL_IN = L502_STREAM_ADC or L502_STREAM_DIN;
// объединение всех флагов, обозначающих потоки данных на вывод
L502_STREAM_ALL_OUT = L502_STREAM_DAC1 or L502_STREAM_DAC2 or L502_STREAM_DOUT;
{--- Константы, определяющие тип передаваемого отсчета из ПК в модуль -----}
L502_STREAM_OUT_WORD_TYPE_DOUT = $0; // Цифровой вывод
L502_STREAM_OUT_WORD_TYPE_DAC1 = $40000000; // Код для 1-го канала ЦАП
L502_STREAM_OUT_WORD_TYPE_DAC2 = $80000000; // Код для 2-го канала ЦАП
{------------------ Режим работы модуля L502 ------------------------------}
L502_MODE_FPGA = 0; // Все потоки данных передаются через ПЛИС минуя
// сигнальный процессор BlackFin
L502_MODE_DSP = 1; // Все потоки данных передаются через сигнальный
// процессор, который должен быть загружен
// прошивкой для обработки этих потоков
L502_MODE_DEBUG = 2; // Отладочный режим
{------------------- Номера каналов ЦАП -----------------------------------}
L502_DAC_CH1 = 0; //Первый канал ЦАП
L502_DAC_CH2 = 1; //Второй канал ЦАП
{----------- Флаги, используемые при выводе данных на ЦАП -----------------}
// Указывает, что значение задано в Вольтах и при выводе его нужно
// перевести в коды ЦАП. Если флаг не указан, то считается, что значение
// изначально в кодах
L502_DAC_FLAGS_VOLT = $0001;
// Указывает, что нужно применить калибровочные коэффициенты перед
// выводом значения на ЦАП.
L502_DAC_FLAGS_CALIBR = $0002;
{------------------ Номера каналов DMA ------------------------------------}
L502_DMA_CH_IN = 0; // Общий канал DMA на ввод
L502_DMA_CH_OUT = 1; // Общий канал DMA на вывод
{--- Цифровые линии, на которых можно включить подтягивающие резисторы ----}
L502_PULLUPS_DI_H = $01; // Старшая половина цифровых входов
L502_PULLUPS_DI_L = $02; // Младшая половина цифровых входов
L502_PULLUPS_DI_SYN1 = $04; // Линия SYN1
L502_PULLUPS_DI_SYN2 = $08; // Линия SYN2
{--------------- Флаги, определяющие наличие опций в модуле ---------------}
// Признак наличия двухканального канального ЦАП
L502_DEVFLAGS_DAC_PRESENT = X502_DEVFLAGS_DAC_PRESENT;
// Признак наличия сигнального процессора BlackFin
L502_DEVFLAGS_BF_PRESENT = X502_DEVFLAGS_BF_PRESENT;
// Признак наличия гальваноразвязки
L502_DEVFLAGS_GAL_PRESENT = X502_DEVFLAGS_GAL_PRESENT;
// Признак, что во Flash-памяти присутствует информация о модуле
L502_DEVFLAGS_FLASH_DATA_VALID = $00010000;
// Признак, что во Flash-памяти присутствуют действительные калибровочные
// коэффициенты АЦП
L502_DEVFLAGS_FLASH_ADC_CALIBR_VALID = $00020000;
// Признак, что во Flash-памяти присутствуют действительные калибровочные
// коэффициенты ЦАП
L502_DEVFLAGS_FLASH_DAC_CALIBR_VALID = $00040000;
{----------------Флаги для режима циклического вывода----------------------}
// Флаг указывает, что останов или смена сигнала могут произойти без ожидания
// конца цикла предыдущего сигнала.
L502_OUT_CYCLE_FLAGS_FORCE = $01;
type
// описатель модуля - указатель на непрозрачную структуру
t_l502_hnd = t_x502_hnd;
{ калибровочные коэффициенты диапазона }
t_l502_cbr_coef = record
offs: Double; // смещение нуля
k : Double; // коэффициент шкалы
end;
{ Калибровочные коэффициенты модуля. }
t_l502_cbr = record
//Калибровочные коэффициенты АЦП
adc: array[0..L502_ADC_RANGE_CNT-1] of t_l502_cbr_coef;
res1: array[0..63] of LongWord;
// Калибровочные коэффициенты ЦАП
dac: array[0..L502_DAC_CH_CNT-1] of t_l502_cbr_coef;
res2: array[0..19] of LongWord;
end;
{ Информация о модуле L502.}
t_l502_info = record
name: array[0..L502_DEVNAME_SIZE-1] of AnsiChar; // Название устройства ("L502")
serial: array[0..L502_SERIAL_SIZE-1] of AnsiChar; // Серийный номер
devflags: LongWord; // Флаги описывающие наличие в модуле определенных опций
fpga_ver : Word; // Версия ПЛИС (старший байт - мажорная, младший - минорная)
plda_ver : Byte; // Версия ПЛИС, управляющего аналоговой частью
res : array[0..120] of Byte; //резерв
cbr : t_l502_cbr; // Заводские калибровочные коэффициенты (из Flash-памяти)
end;
function L502_Create(): t_l502_hnd; stdcall;
function L502_Free(hnd: t_l502_hnd): LongInt; stdcall;
//разорвать связь с модулем
function L502_Close(hnd: t_l502_hnd): LongInt; stdcall;
//получение информации о модуле
function L502_GetDevInfo(hnd: t_l502_hnd; out info: t_l502_info) : LongInt; stdcall;
// Передача установленных настроек в модуль
function L502_Configure(hnd: t_l502_hnd; flags: LongWord): LongInt; stdcall;
// Установка параметров логического канала
function L502_SetLChannel(hnd: t_l502_hnd; lch, phy_ch, mode, range, avg: LongWord): LongInt; stdcall;
// Установка количества логических каналов
function L502_SetLChannelCount(hnd: t_l502_hnd; lch_cnt : LongWord): LongInt; stdcall;
// Получение количества логических каналов
function L502_GetLChannelCount(hnd: t_l502_hnd; out lch_cnt: LongWord): LongInt; stdcall;
// Установка делителя частоты сбора для АЦП
function L502_SetAdcFreqDivider(hnd: t_l502_hnd; adc_freq_div : LongWord): LongInt; stdcall;
// Установка значения межкадровой задержки для АЦП
function L502_SetAdcInterframeDelay(hnd: t_l502_hnd; delay : LongWord): LongInt; stdcall;
// Установка делителя частоты синхронного ввода с цифровых линий
function L502_SetDinFreqDivider(hnd: t_l502_hnd; din_freq_div: LongWord): LongInt; stdcall;
// Установка частоты сбора АЦП
function L502_SetAdcFreq(hnd: t_l502_hnd; var f_acq, f_frame: Double): LongInt; stdcall;
// Установка частоты синхронного ввода с цифровых входов
function L502_SetDinFreq(hnd: t_l502_hnd; var f_din: Double): LongInt; stdcall;
// Получить текущие значения частот сбора АЦП
function L502_GetAdcFreq(hnd: t_l502_hnd; out f_acq, f_frame: Double): LongInt; stdcall;
// Установка значения опорной частоты синхронизации.
function L502_SetRefFreq(hnd: t_l502_hnd; freq: LongWord): LongInt; stdcall;
// Установка режима генерации частоты синхронизации.
function L502_SetSyncMode(hnd: t_l502_hnd; sync_mode: LongWord): LongInt; stdcall;
// Установка режима запуска частоты синхронизации.
function L502_SetSyncStartMode(hnd: t_l502_hnd; sync_start_mode: LongWord): LongInt; stdcall;
// Установить режим работы модуля
function L502_SetMode(hnd: t_l502_hnd; mode: LongWord): LongInt; stdcall;
// Получение текущего режима работы модуля.
function L502_GetMode(hnd: t_l502_hnd; out mode: LongWord): LongInt; stdcall;
// Установить коэффициенты для калибровки значений АЦП.
function L502_SetAdcCoef(hnd: t_l502_hnd; range: LongWord; k, offs: Double): LongInt; stdcall;
// Получение текущих калибровочных коэффициентов АЦП.
function L502_GetAdcCoef(hnd: t_l502_hnd; range: LongWord; out k, offs: Double): LongInt; stdcall;
{----------------------- Функции асинхронного ввода-вывода ------------------}
// Асинхронный вывод данных на канал ЦАП.
function L502_AsyncOutDac(hnd: t_l502_hnd; ch: LongWord; data: Double; flags: LongWord): LongInt; stdcall;
// Асинхронный вывод данных на цифровые выходы.
function L502_AsyncOutDig(hnd: t_l502_hnd; val, msk: LongWord): LongInt; stdcall;
// Асинхронный ввод значений с цифровых входов.
function L502_AsyncInDig(hnd: t_l502_hnd; out din: LongWord): LongInt; stdcall;
// Асинхронный ввод одного кадра АЦП.
function L502_AsyncGetAdcFrame(hnd: t_l502_hnd; flags: LongWord; tout: LongWord; out data: array of Double): LongInt; stdcall;
{-------------- Функции для работы с синхронным потоковым вводом-выводом ----}
// Разрешение синхронных потоков на ввод/вывод.
function L502_StreamsEnable(hnd: t_l502_hnd; streams: LongWord): LongInt; stdcall;
// Запрещение синхронных потоков на ввод/вывод.
function L502_StreamsDisable(hnd: t_l502_hnd; streams: LongWord): LongInt; stdcall;
// Запуск синхронных потоков ввода/вывода.
function L502_StreamsStart(hnd: t_l502_hnd): LongInt; stdcall;
// Останов синхронных потоков ввода/вывода.
function L502_StreamsStop(hnd: t_l502_hnd): LongInt; stdcall;
// Проверка, запущен ли поток данных
function L502_IsRunning(hnd: t_l502_hnd): LongInt; stdcall;
// Чтение данных АЦП и цивровых входов из модуля.
function L502_Recv(hnd: t_l502_hnd; out buf : array of LongWord; size: LongWord; tout : LongWord): LongInt; stdcall;
// Передача потоковых данных ЦАП и цифровых выходов в модуль.
function L502_Send(hnd: t_l502_hnd; const buf : array of LongWord; size: LongWord; tout: LongWord): LongInt; stdcall;
// Обработка принятых отсчетов АЦП от модуля.
function L502_ProcessAdcData(hnd: t_l502_hnd; const src: array of LongWord;
out dest: array of Double; var size : LongWord;
flags : LongWord): LongInt; stdcall;
// Обработка принятых от модуля данных.
function L502_ProcessData(hnd: t_l502_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 L502_ProcessDataWithUserExt(hnd: t_l502_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 L502_PrepareData(hnd: t_l502_hnd; const dac1, dac2: array of Double;
const digout: array of LongWord; size, flags : LongWord;
out out_buf: array of LongWord):LongInt; stdcall;
// Получить количество отсчетов в буфере потока на ввод.
function L502_GetRecvReadyCount(hnd: t_l502_hnd; out rdy_cnt: LongWord):LongInt; stdcall;
// Получить размер свободного места в буфере потока на вывод.
function L502_GetSendReadyCount(hnd: t_l502_hnd; out rdy_cnt: LongWord):LongInt; stdcall;
// Получить номер следующего ожидаемого логического канала АЦП для обработки.
function L502_GetNextExpectedLchNum(hnd: t_l502_hnd; out lch: LongWord):LongInt; stdcall;
// Начало подготовки вывода синхронных данных
function L502_PreloadStart(hnd: t_l502_hnd): LongInt; stdcall;
//Установка ранее загруженного циклического сигнала на вывод
function L502_OutCycleLoadStart(hnd: t_l502_hnd; size: LongWord):LongInt; stdcall;
//Установка ранее загруженного циклического сигнала на вывод
function L502_OutCycleSetup(hnd: t_l502_hnd; flags: LongWord):LongInt; stdcall;
// Останов вывода циклического сигнала
function L502_OutCycleStop(hnd: t_l502_hnd; flags: LongWord):LongInt; stdcall;
// Установка размера буфера в драйвере для синхронного ввода или вывода.
function L502_SetDmaBufSize(hnd: t_l502_hnd; dma_ch, size: LongWord): LongInt; stdcall;
// Установка шага прерывания при передаче потока по DMA.
function L502_SetDmaIrqStep(hnd: t_l502_hnd; dma_ch, step: LongWord): LongInt; stdcall;
{------------ Функции для работы с сигнальным процессором -------------------}
function L502_BfCheckFirmwareIsLoaded(hnd: t_l502_hnd; out version: LongWord): LongInt; stdcall;
/// Загрузка прошивки сигнального процессора BlackFin.
function L502_BfLoadFirmware(hnd: t_l502_hnd; filename: string): LongInt; stdcall;
/// Чтение блока данных из памяти сигнального процессора.
function L502_BfMemRead(hnd: t_l502_hnd; addr : LongWord; out regs: array of LongWord;
size: LongWord): LongInt; stdcall;
/// Запись блока данных в память сигнального процессора.
function L502_BfMemWrite(hnd: t_l502_hnd; addr : LongWord;
const regs: array of LongWord; size: LongWord): LongInt; stdcall;
/// Передача управляющей команды сигнальному процессору.
function L502_BfExecCmd(hnd: t_l502_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 L502_FlashRead(hnd: t_l502_hnd; addr: LongWord;
out data: array of Byte; size: LongWord): LongInt; stdcall;
///Запись блока данных во Flash-память модуля.
function L502_FlashWrite(hnd: t_l502_hnd; addr: LongWord;
const data: array of Byte; size: LongWord): LongInt; stdcall;
/// Стирание блока во Flash-памяти.
function L502_FlashErase(hnd: t_l502_hnd; addr: LongWord; size: LongWord): LongInt; stdcall;
/// Разрешение записи в пользовательскую область Flash-памяти.
function L502_FlashWriteEnable(hnd: LongWord): LongInt; stdcall;
/// Запрет записи в пользовательскую область Flash-памяти.
function L502_FlashWriteDisable(hnd: t_l502_hnd): LongInt; stdcall;
{----------------- Дополнительные вспомогательные функции ------------------}
//Получить версию библиотеки.
function L502_GetDllVersion() : LongWord; stdcall;
// Получить версию драйвера устройства
function L502_GetDriverVersion(hnd: t_l502_hnd; out ver: LongWord): LongInt; stdcall;
// Получение строки об ошибке
function L502_GetErrorString(err: LongInt) : string; stdcall;
// Моргание светодиодом на передней панели.
function L502_LedBlink(hnd: t_l502_hnd): LongInt; stdcall;
// Установка подтягивающих резисторов на входных линиях.
function L502_SetDigInPullup(hnd: t_l502_hnd; pullups : LongWord): LongInt; stdcall;
implementation
function L502_Create() : t_l502_hnd; stdcall; external 'l502api.dll';
function L502_Free(hnd: t_l502_hnd) : LongInt; stdcall; external 'l502api.dll';
function _get_serials( ser_arr: p_x502_serial_array; size:LongWord;
flags:LongWord; out devcnt: LongWord) : LongInt;
stdcall; external 'l502api.dll' name 'L502_GetSerialList';
function _get_dev_records_list(out list; size:LongWord;
flags : LongWord; out devcnt: LongWord) : LongInt;
stdcall; external 'l502api.dll' name 'L502_GetDevRecordsList';
function _open(hnd: t_l502_hnd; serial: PAnsiChar) : LongInt; stdcall; external 'l502api.dll' name 'L502_Open';
function L502_Close(hnd : t_l502_hnd) : LongInt; stdcall; external 'l502api.dll';
function L502_GetDevInfo(hnd : t_l502_hnd; out info : t_l502_info) : LongInt; stdcall; external 'l502api.dll';
function L502_Configure(hnd: t_l502_hnd; flags: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetLChannel(hnd: t_l502_hnd; lch, phy_ch, mode, range, avg: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetLChannelCount(hnd: t_l502_hnd; lch_cnt : LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_GetLChannelCount(hnd: t_l502_hnd; out lch_cnt: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetAdcFreqDivider(hnd: t_l502_hnd; adc_freq_div : LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetAdcInterframeDelay(hnd: t_l502_hnd; delay : LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetDinFreqDivider(hnd: t_l502_hnd; din_freq_div: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetAdcFreq(hnd: t_l502_hnd; var f_acq, f_frame: Double): LongInt; stdcall; external 'l502api.dll';
function L502_SetDinFreq(hnd: t_l502_hnd; var f_din: Double): LongInt; stdcall; external 'l502api.dll';
function L502_GetAdcFreq(hnd: t_l502_hnd; out f_acq, f_frame: Double): LongInt; stdcall; external 'l502api.dll';
function L502_SetRefFreq(hnd: t_l502_hnd; freq: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetSyncMode(hnd: t_l502_hnd; sync_mode: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetSyncStartMode(hnd: t_l502_hnd; sync_start_mode: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetMode(hnd: t_l502_hnd; mode: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_GetMode(hnd: t_l502_hnd; out mode: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetAdcCoef(hnd: t_l502_hnd; range: LongWord; k, offs: Double): LongInt; stdcall; external 'l502api.dll';
function L502_GetAdcCoef(hnd: t_l502_hnd; range: LongWord; out k, offs: Double): LongInt; stdcall; external 'l502api.dll';
function L502_AsyncOutDac(hnd: t_l502_hnd; ch: LongWord; data: Double; flags: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_AsyncOutDig(hnd: t_l502_hnd; val, msk: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_AsyncInDig(hnd: t_l502_hnd; out din: LongWord): LongInt; stdcall; external 'l502api.dll';
function _get_adc_frame(hnd: t_l502_hnd; flags: LongWord; tout: LongWord; out data): LongInt; stdcall; external 'l502api.dll' name 'L502_AsyncGetAdcFrame';
function L502_StreamsEnable(hnd: t_l502_hnd; streams: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_StreamsDisable(hnd: t_l502_hnd; streams: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_StreamsStart(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
function L502_IsRunning(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
function L502_StreamsStop(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
function _recv(hnd: t_l502_hnd; out buf; size: LongWord; tout : LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_Recv';
function _send(hnd: t_l502_hnd; const buf; size: LongWord; tout : LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_Send';
function _process_adc_data(hnd: t_l502_hnd; const src; out dest; var size : LongWord;
flags : LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_ProcessAdcData';
function _process_data(hnd: t_l502_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 'l502api.dll' name 'L502_ProcessData';
function _process_data_usr(hnd: t_l502_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 'l502api.dll' name 'L502_ProcessDataWithUserExt';
function _prepare_data(hnd: t_l502_hnd; const dac1, dac2; const digout; size, flags : LongWord;
out out_buf):LongInt; stdcall; external 'l502api.dll' name 'L502_PrepareData';
function L502_GetRecvReadyCount(hnd: t_l502_hnd; out rdy_cnt: LongWord):LongInt; stdcall; external 'l502api.dll';
function L502_GetSendReadyCount(hnd: t_l502_hnd; out rdy_cnt: LongWord):LongInt; stdcall; external 'l502api.dll';
function L502_GetNextExpectedLchNum(hnd: t_l502_hnd; out lch: LongWord):LongInt; stdcall; external 'l502api.dll';
function L502_PreloadStart(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
function L502_OutCycleLoadStart(hnd: t_l502_hnd; size: LongWord):LongInt; stdcall; external 'l502api.dll';
function L502_OutCycleSetup(hnd: t_l502_hnd; flags: LongWord):LongInt; stdcall; external 'l502api.dll';
function L502_OutCycleStop(hnd: t_l502_hnd; flags: LongWord):LongInt; stdcall; external 'l502api.dll';
function L502_SetDmaBufSize(hnd: t_l502_hnd; dma_ch, size: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_SetDmaIrqStep(hnd: t_l502_hnd; dma_ch, step: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_BfCheckFirmwareIsLoaded(hnd: t_l502_hnd; out version: LongWord): LongInt; stdcall; external 'l502api.dll';
function _bf_load_firm(hnd: t_l502_hnd; filename: PAnsiChar): LongInt; stdcall; external 'l502api.dll' name 'L502_BfLoadFirmware';
function _bf_mem_read(hnd: t_l502_hnd; addr : LongWord; out regs; size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_BfMemRead';
function _bf_mem_write(hnd: t_l502_hnd; addr : LongWord; const regs; size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_BfMemWrite';
function _bf_exec_cmd(hnd: t_l502_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 'l502api.dll' name 'L502_BfExecCmd';
function _flash_read(hnd: t_l502_hnd; addr: LongWord; out data; size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_FlashRead';
function _flash_write(hnd: t_l502_hnd; addr: LongWord; const data; size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_FlashWrite';
function L502_FlashErase(hnd: t_l502_hnd; addr: LongWord; size: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_FlashWriteEnable(hnd: LongWord): LongInt; stdcall; external 'l502api.dll';
function L502_FlashWriteDisable(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
function L502_GetDllVersion() : LongWord; stdcall; external 'l502api.dll';
function L502_GetDriverVersion(hnd: t_l502_hnd; out ver: LongWord): LongInt; stdcall; external 'l502api.dll';
function _get_err_str(err : LongInt) : PAnsiChar; stdcall; external 'l502api.dll' name 'L502_GetErrorString';
function L502_LedBlink(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
function L502_SetDigInPullup(hnd: t_l502_hnd; pullups : LongWord): LongInt; stdcall; external 'l502api.dll';
{
function L502_GetSerialList(out serials: t_l502_serial_list; flags: LongWord) : LongInt; overload;
var
ser_arr : p_l502_serial_array;
devcnt: LongWord;
res, i : LongInt;
begin
// получаем количество устройтв
res := _get_serials(nil, 0, flags, devcnt);
if (res >= 0) and (devcnt>0) then
begin
// выделяем память под devcnt серийных номеров
ser_arr:=GetMemory(devcnt*L502_SERIAL_SIZE);
//получаем их список
res:= _get_serials(ser_arr, devcnt, flags, PLongWord(nil)^);
if (res > 0) then
begin
//устанавливаем размер динамического массива
SetLength(serials, res);
//сохраняем полученные номера в динамический массив строк
for i:=0 to res-1 do
serials[i] := string(ser_arr[i]);
end;
//освобождаем память, выделенную под временный массив
FreeMemory(ser_arr);
end;
L502_GetSerialList:= res;
end;
}
function L502_GetSerialList(out serials: array of string; flags: LongWord; out devcnt: LongWord) : LongInt; overload;
var
ser_arr : p_x502_serial_array;
res, i : LongInt;
begin
if (Length(serials) > 0) then
begin
ser_arr:=GetMemory(Length(serials)*X502_SERIAL_SIZE);
// получаем количество устройтв
res := _get_serials(ser_arr, Length(serials), flags, devcnt);
if res >= 0 then
begin
//сохраняем полученные номера в динамический массив строк
for i:=0 to res-1 do
serials[i] := string(ser_arr[i]);
end;
//освобождаем память, выделенную под временный массив
FreeMemory(ser_arr);
end
else
begin
res:= _get_serials(nil, 0, flags, devcnt);
end;
L502_GetSerialList:=res;
end;
function L502_GetSerialList(out serials: array of string; flags: LongWord) : LongInt; overload;
begin
L502_GetSerialList:= L502_GetSerialList(serials, flags, PCardinal(nil)^);
end;
function L502_GetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord; out devcnt: LongWord) : LongInt; overload;
begin
if (Length(list) > 0) then
begin
L502_GetDevRecordsList := _get_dev_records_list(list, Length(list), flags, devcnt);
end
else
begin
L502_GetDevRecordsList:= _get_dev_records_list(PCardinal(nil)^, 0, flags, devcnt);
end;
end;
function L502_GetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord) : LongInt; overload;
begin
L502_GetDevRecordsList:= L502_GetDevRecordsList(list, flags, PCardinal(nil)^);
end;
function L502_Open(hnd: t_l502_hnd; serial: string) : LongInt;
begin
L502_Open:=_open(hnd, PAnsiChar(AnsiString(serial)));
end;
function L502_GetErrorString(err: LongInt) : string;
begin
L502_GetErrorString:= string(_get_err_str(err));
end;
function L502_AsyncGetAdcFrame(hnd: t_l502_hnd; flags: LongWord; tout: LongWord; out data: array of Double): LongInt; stdcall;
var err: LongInt;
lch_cnt: LongWord;
begin
err:= L502_GetLChannelCount(hnd, lch_cnt);
if err=L502_ERR_OK then
begin
if LongWord(Length(data)) < lch_cnt then
err:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
err:=_get_adc_frame(hnd,flags,tout,data);
end;
L502_AsyncGetAdcFrame:=err;
end;
function L502_Recv(hnd: t_l502_hnd; out buf : array of LongWord; size: LongWord; tout : LongWord): LongInt; stdcall;
begin
if LongWord(Length(buf)) < size then
L502_Recv:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_Recv:=_recv(hnd, buf, size, tout);
end;
function L502_Send(hnd: t_l502_hnd; const buf : array of LongWord; size: LongWord; tout: LongWord): LongInt; stdcall;
begin
if LongWord(Length(buf)) < size then
L502_Send:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_Send:=_send(hnd,buf,size,tout);
end;
function L502_ProcessAdcData(hnd: t_l502_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
L502_ProcessAdcData:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_ProcessAdcData:=_process_adc_data(hnd, src, dest, size, flags);
end;
function L502_ProcessData(hnd: t_l502_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
L502_ProcessData:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_ProcessData:=_process_data(hnd, src, size, flags, adc_data, adc_data_size, din_data, din_data_size);
end;
function L502_ProcessDataWithUserExt(hnd: t_l502_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
L502_ProcessDataWithUserExt:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_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 L502_PrepareData(hnd: t_l502_hnd; const dac1, dac2: array of Double;
const digout: array of LongWord; size, flags : LongWord;
out out_buf: array of LongWord):LongInt; stdcall;
begin
L502_PrepareData:=_prepare_data(hnd, dac1, dac2, digout, size, flags, out_buf);
end;
function L502_BfLoadFirmware(hnd: t_l502_hnd; filename: string): LongInt; stdcall;
begin
L502_BfLoadFirmware:=_bf_load_firm(hnd, PAnsiChar(AnsiString(filename)));
end;
function L502_BfMemRead(hnd: t_l502_hnd; addr : LongWord; out regs: array of LongWord;
size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(regs)) < size) then
L502_BfMemRead := L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_BfMemRead:=_bf_mem_read(hnd, addr, regs, size);
end;
function L502_BfMemWrite(hnd: t_l502_hnd; addr : LongWord;
const regs: array of LongWord; size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(regs)) < size) then
L502_BfMemWrite := L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_BfMemWrite:=_bf_mem_write(hnd, addr, regs, size);
end;
function L502_BfExecCmd(hnd: t_l502_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
L502_BfExecCmd := L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_BfExecCmd:=_bf_exec_cmd(hnd, cmd_code, par, snd_data, snd_size,
rcv_data, rcv_size, tout, recvd_size);
end;
function L502_FlashRead(hnd: t_l502_hnd; addr: LongWord;
out data: array of Byte; size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(data)) < size) then
L502_FlashRead := L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_FlashRead:=_bf_mem_write(hnd, addr, data, size);
end;
///Запись блока данных во Flash-память модуля.
function L502_FlashWrite(hnd: t_l502_hnd; addr: LongWord;
const data: array of Byte; size: LongWord): LongInt; stdcall;
begin
if (LongWord(Length(data)) < size) then
L502_FlashWrite := L502_ERR_INSUFFICIENT_ARRAY_SIZE
else
L502_FlashWrite:=_bf_mem_write(hnd, addr, data, size);
end;
end.