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.