Attribute VB_Name = "l502api"
' модуль для объявления констант, структур и функций  для управления модулем L502 от Л Кард

'Максимальное количество логических каналов в таблице
Const L502_LTABLE_MAX_CH_CNT = 256
'Количество диапазонов для измерения напряжений
Const L502_ADC_RANGE_CNT = 6
'Максимальное значение для аппаратного усреднения по логическому каналу
Const L502_LCH_AVG_SIZE_MAX = 128
'Максимальное значения делителя частоты АЦП
Const L502_ADC_FREQ_DIV_MAX = 1024& * 1024&
'Максимальное значение делителя частоты синхронного цифрового ввода
Const L502_DIN_FREQ_DIV_MAX = 1024& * 1024&

'Максимальное значение межкадровой задержки для АЦП
Const L502_ADC_INTERFRAME_DELAY_MAX = &H1FFFFF

'Таймаут по умолчанию для выполнения команды к BlackFin
Const L502_BF_CMD_DEFAULT_TOUT = 500
 
'Код АЦП, соответствующий максимальному значению шкалы
Const L502_ADC_SCALE_CODE_MAX = 6000000
'Код ЦАП, соответствующий максимальному значению шкалы
Const L502_DAC_SCALE_CODE_MAX = 30000

'Максимальное количество символов в строке с названием устройства
Const L502_DEVNAME_SIZE = 32
'Максимальное количество символов в строке с серийным номером
Const L502_SERIAL_SIZE = 32

'Максимально возможное значение внешней опорной частоты
Const L502_EXT_REF_FREQ_MAX = 2000000
'Размер пользовательской области Flash-памяти
Const L502_FLASH_USER_SIZE = &H100000

'Cтандартный таймаут на выполнение запроса к BlackFin в мс
Const L502_BF_REQ_TOUT = 500

'Диапазон ЦАП в вольтах
Const L502_DAC_RANGE = 5#

'Количество каналов ЦАП
Const L502_DAC_CH_CNT = 2
 
'слово в потоке, означающее, что произошло переполнение
Const L502_STREAM_IN_MSG_OVERFLOW = &H1010000




Public Enum t_lpcie_errs
    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
End Enum


'Флаги, управляющие поиском присутствующих модулей
Public Enum t_l502_getdevs_flags
   ' Признак, что нужно вернуть серийные номера только тех устройств,  которые еще не открыты
    L502_GETDEVS_FLAGS_ONLY_NOT_OPENED = &H1&
End Enum


'Флаги для управления цифровыми выходами.
Public Enum t_l502_digout_word_flags
    L502_DIGOUT_WORD_DIS_H = &H20000      'Запрещение (перевод в третье состояние)  старшей половины цифровых выходов
    L502_DIGOUT_WORD_DIS_L = &H10000  'Запрещение младшей половины цифровых выходов
End Enum

'Константы для выбора опорной частоты
Public Enum t_l502_ref_freq
    L502_REF_FREQ_2000KHZ = 2000000   'Частота 2МГц
    L502_REF_FREQ_1500KHZ = 1500000  'Частота 1.5МГц
End Enum

'Диапазоны измерения для канала АЦП
Public Enum t_l502_adc_range
    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
End Enum

'Режим измерения для логического канала
Public Enum t_l502_lch_mode
    L502_LCH_MODE_COMM = 0  'Измерение напряжения относительно общей земли
    L502_LCH_MODE_DIFF = 1 'Дифференциальное измерение напряжения
    L502_LCH_MODE_ZERO = 2  'Измерение собственного нуля
End Enum

'Режимы синхронизации.
Public Enum t_l502_sync_mode
    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
End Enum

'Флаги, управляющие обработкой принятых данных
Public Enum t_l502_proc_flags
    'Признак, что нужно преобразовать значения АЦП в вольты
    L502_PROC_FLAGS_VOLT = &H1&
    ' Признак, что не нужно проверять совпадение номеров каналов
    '   в принятых данных с каналами из логической таблицы.
    '   Может использоваться при нестандартной прошивке BlackFin
    '    при передаче в ПК не всех данных.
    L502_PROC_FLAGS_DONT_CHECK_CH = &H10000
End Enum

'Флаги для обозначения синхронных потоков данных
Public Enum t_l502_streams
    L502_STREAM_ADC = &H1&  'Поток данных от АЦП
    L502_STREAM_DIN = &H2&   'Поток данных с цифровых входов
    L502_STREAM_DAC1 = &H10& 'Поток данных первого канала ЦАП
    L502_STREAM_DAC2 = &H20& 'Поток данных второго канала ЦАП
    L502_STREAM_DOUT = &H40& 'Поток данных на цифровые выводы
    'Объединение всех флагов, обозначающих потоки данных на ввод
    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
End Enum

'Константы, определяющие тип передаваемого отсчета из ПК в модуль
Public Enum t_stream_out_wrd_type
    L502_STREAM_OUT_WORD_TYPE_DOUT = &H0&   'Цифровой вывод
    L502_STREAM_OUT_WORD_TYPE_DAC1 = &H40000000    'Код для 1-го канала ЦАП
    L502_STREAM_OUT_WORD_TYPE_DAC2 = &H80000000    'Код для 2-го канала ЦАП
End Enum

'Режим работы модуля L502
Public Enum t_l502_mode
    L502_MODE_FPGA = 0  'Все потоки данных передаются через ПЛИС минуя
                                                    'сигнальный процессор BlackFin
    L502_MODE_DSP = 1    'Все потоки данных передаются через сигнальный
                                                    'процессор, который должен быть загружен
                                                    'прошивкой для обработки этих потоков
    L502_MODE_DEBUG = 2  'Отладочный режим
End Enum

'Номера каналов ЦАП.
Public Enum t_l502_dac_ch
   L502_DAC_CH1 = 0 'Первый канал ЦАП
   L502_DAC_CH2 = 1  'Второй канал ЦАП
End Enum

'Флаги, используемые при выводе данных на ЦАП.
 Public Enum t_l502_dacout_flags
    'Указывает, что значение задано в Вольтах и при выводе его нужно
    '    перевести его в коды ЦАП. Если флаг не указан, то считается, что значение
    '    изначально в кодах
    L502_DAC_FLAGS_VOLT = &H1&
    'Указывает, что нужно применить калибровочные коэффициенты перед
    '    выводом значения на ЦАП.
    L502_DAC_FLAGS_CALIBR = &H2&
End Enum

'Номера каналов DMA
Public Enum t_l502_dma_ch
    L502_DMA_CH_IN = 0  'Общий канал DMA на ввод
    L502_DMA_CH_OUT = 1 'Общий канал DMA на вывод
End Enum

'Цифровые линии, на которых можно включить подтягивающие резисторы
Public Enum t_l502_pullups
    L502_PULLUPS_DI_H = &H1&     'Старшая половина цифровых входов
    L502_PULLUPS_DI_L = &H2&     'Младшая половина цифровых входов
    L502_PULLUPS_DI_SYN1 = &H4&  'Линия SYN1
    L502_PULLUPS_DI_SYN2 = &H8&  'Линия SYN2
End Enum

'Флаги, определяющие наличие опций в модуле
Public Enum t_l502_dev_flags
    'Признак наличия двухканального канального ЦАП
    L502_DEVFLAGS_DAC_PRESENT = &H1&
    'Признак наличия гальваноразвязки
    L502_DEVFLAGS_GAL_PRESENT = &H2&
    'Признак наличия сигнального процессора BlackFin
    L502_DEVFLAGS_BF_PRESENT = &H4&
    'Признак, что во Flash-памяти присутствует информация о модуле
    L502_DEVFLAGS_FLASH_DATA_VALID = &H10000
    'Признак, что во Flash-памяти присутствуют действительные калибровочные
    '   коэффициенты АЦП
    L502_DEVFLAGS_FLASH_ADC_CALIBR_VALID = &H20000
    'Признак, что во Flash-памяти присутствуют действительные калибровочные
    '  коэффициенты ЦАП
    L502_DEVFLAGS_FLASH_DAC_CALIBR_VALID = &H40000
End Enum

'Флаги для режима циклического вывода
Public Enum t_l502_out_cycle_flags
    L502_OUT_CYCLE_FLAGS_FORCE = &H1&
End Enum




' Калибровочные коэффициенты диапазона
Public Type t_l502_cbr_coef
    offs As Double 'смещение нуля
    k As Double 'коэффициент шкалы
End Type


'Калибровочные коэффициенты модуля
Public Type t_l502_cbr
    adc(0 To L502_ADC_RANGE_CNT - 1) As t_l502_cbr_coef 'Калибровочные коэффициенты АЦП
    res1(0 To 64 - 1) As Long 'Резерв
    dac(0 To L502_DAC_CH_CNT - 1) As t_l502_cbr_coef 'Калибровочные коэффициенты ЦАП
    res2(0 To 20 - 1) As Long
End Type


Public Type t_l502_info
    DevName(0 To L502_DEVNAME_SIZE - 1) As Byte
    Serial(0 To L502_SERIAL_SIZE - 1) As Byte 'Серийный номер
    devflags As Long 'Флаги из #t_l502_dev_flags, описывающие наличие в модуле определенных опций
    fpga_ver As Integer 'Версия ПЛИС (старший байт - мажорная, младший - минорная)
    plda_ver As Byte 'Версия ПЛИС, управляющего аналоговой частью
    board_rev As Byte 'Ревизия платы
    res(0 To 120 - 1) As Byte 'Резерв
    cbr As t_l502_cbr      'Заводские калибровочные коэффициенты (из Flash-памяти)
End Type



Private Declare Function tmp_L502_GetSerialList Lib "l502api" Alias "L502_GetSerialList" (ByVal serials As Long, ByVal size As Long, ByVal flags As Long, ByRef devcnt As Long) As Long


Public Declare Function L502_Create Lib "l502api" () As Long
Public Declare Function L502_Free Lib "l502api" (ByVal hnd As Long) As Long
Public Declare Function L502_Open Lib "l502api" (ByVal hnd As Long, ByVal Serial As String) As Long
Public Declare Function L502_Close Lib "l502api" (ByVal hnd As Long) As Long
Public Declare Function L502_GetDevInfo Lib "l502api" (ByVal hnd As Long, ByRef info As t_l502_info) As Long


Public Declare Function L502_Configure Lib "l502api" (ByVal hnd As Long, ByVal flags As Long) As Long
Public Declare Function L502_SetLChannel Lib "l502api" (ByVal hnd As Long, ByVal lch As Long, ByVal phy_ch As Long, ByVal mode As Long, ByVal range As Long, ByVal avg As Long) As Long
'Установка количества логических каналов.
Public Declare Function L502_SetLChannelCount Lib "l502api" (ByVal hnd As Long, ByVal lch_cnt As Long) As Long
'Получение количества логических каналов.
Public Declare Function L502_GetLChannelCount Lib "l502api" (ByVal hnd As Long, ByRef lch_cnt As Long) As Long
'Установка делителя частоты сбора для АЦП
Public Declare Function L502_SetAdcFreqDivider Lib "l502api" (ByVal hnd As Long, ByVal adc_freq_div As Long) As Long
'Установка значения межкадровой задержки для АЦП.
Public Declare Function L502_SetAdcInterframeDelay Lib "l502api" (ByVal hnd As Long, ByVal delay As Long) As Long
'Установка делителя частоты синхронного ввода с цифровых линий.
Public Declare Function L502_SetDinFreqDivider Lib "l502api" (ByVal hnd As Long, ByVal din_freq_div As Long) As Long
'Установка частоты сбора АЦП.
Public Declare Function L502_SetAdcFreq Lib "l502api" (ByVal hnd As Long, ByRef f_acq As Double, ByRef f_frame As Double) As Long
'Установка частоты синхронного ввода с цифровых входов.
Public Declare Function L502_SetDinFreq Lib "l502api" (ByVal hnd As Long, ByRef f_din As Double) As Long
'Получить текущие значения частот сбора АЦП
Public Declare Function L502_GetAdcFreq Lib "l502api" (ByVal hnd As Long, ByRef f_acq As Double, ByRef f_frame As Double) As Long
'Установка значения опорной частоты синхронизации.
Public Declare Function L502_SetRefFreq Lib "l502api" (ByVal hnd As Long, ByVal freq As Long) As Long
'Установка режима генерации частоты синхронизации.
Public Declare Function L502_SetSyncMode Lib "l502api" (ByVal hnd As Long, ByVal sync_mode As Long) As Long
'Установка режима запуска частоты синхронизации
Public Declare Function L502_SetSyncStartMode Lib "l502api" (ByVal hnd As Long, ByVal sync_start_mode As Long) As Long
'Установить режим работы модуля.
Public Declare Function L502_SetMode Lib "l502api" (ByVal hnd As Long, ByVal mode As Long) As Long
'Получение текущего режима работы модуля.
Public Declare Function L502_GetMode Lib "l502api" (ByVal hnd As Long, ByRef mode As Long) As Long
'Установить коэффициенты для калибровки значений АЦП
Public Declare Function L502_SetAdcCoef Lib "l502api" (ByVal hnd As Long, ByVal range As Long, ByVal k As Double, ByVal offs As Double) As Long
'Получение текущих калибровочных коэффициентов АЦП.
Public Declare Function L502_GetAdcCoef Lib "l502api" (ByVal hnd As Long, ByVal range As Long, ByRef k As Double, ByRef offs As Double) As Long
'Установить коэффициенты для калибровки значений ЦАП.
Public Declare Function L502_SetDacCoef Lib "l502api" (ByVal hnd As Long, ByVal ch As Long, ByVal k As Double, ByVal offs As Double) As Long
'Получение текущих калибровочных коэффициентов ЦАП
Public Declare Function L502_GetDacCoef Lib "l502api" (ByVal hnd As Long, ByVal ch As Long, ByRef k As Double, ByRef offs As Double) As Long

'Асинхронный вывод данных на канал ЦАП.
Public Declare Function L502_AsyncOutDac Lib "l502api" (ByVal hnd As Long, ByVal ch As Long, ByVal data As Double, ByVal flags As Long) As Long
'Асинхронный вывод данных на цифровые выходы.
Public Declare Function L502_AsyncOutDig Lib "l502api" (ByVal hnd As Long, ByVal val As Long, ByVal msk As Long) As Long
'Асинхронный ввод значений с цифровых входов.
Public Declare Function L502_AsyncInDig Lib "l502api" (ByVal hnd As Long, ByRef din As Long) As Long

Private Declare Function tmp_L502_AsyncGetAdcFrame Lib "l502api" Alias "L502_AsyncGetAdcFrame" (ByVal hnd As Long, ByVal flags As Long, ByVal tout As Long, ByRef data As Double) As Long

'Разрешение синхронных потоков на ввод/вывод.
Public Declare Function L502_StreamsEnable Lib "l502api" (ByVal hnd As Long, ByVal streams As Long) As Long
'Запрещение синхронных потоков на ввод/вывод.
Public Declare Function L502_StreamsDisable Lib "l502api" (ByVal hnd As Long, ByVal streams As Long) As Long
'Запуск синхронных потоков ввода/вывода.
Public Declare Function L502_StreamsStart Lib "l502api" (ByVal hnd As Long) As Long
'Останов синхронных потоков ввода/вывода.
Public Declare Function L502_StreamsStop Lib "l502api" (ByVal hnd As Long) As Long
'Проверка, запущен ли синхронный ввод/вывод
Public Declare Function L502_IsRunning Lib "l502api" (ByVal hnd As Long) As Long
'Чтение данных АЦП и цивровых входов из модуля.
Private Declare Function tmp_L502_Recv Lib "l502api" Alias "L502_Recv" (ByVal hnd As Long, ByRef buf As Long, ByVal size As Long, ByVal tout As Long) As Long
'Передача потоковых данных ЦАП и цифровых выходов в модуль.
Private Declare Function tmp_L502_Send Lib "l502api" Alias "L502_Send" (ByVal hnd As Long, ByRef buf As Long, ByVal size As Long, ByVal tout As Long) As Long
'Обработка принятых отсчетов АЦП от модуля.
Private Declare Function tmp_L502_ProcessAdcData Lib "l502api" Alias "L502_ProcessAdcData" (ByVal hnd As Long, ByRef src As Long, ByRef dest As Double, ByRef size As Long, ByVal flags As Long) As Long
'Обработка принятых от модуля данных.
Private Declare Function tmp_L502_ProcessData Lib "l502api" Alias "L502_ProcessData" (ByVal hnd As Long, ByRef src As Long, ByVal flags As Long, ByRef adc_data As Double, ByRef adc_data_size As Long, ByRef din_data As Long, ByRef din_data_size As Long) As Long
'Обработка принятых от модуля данных с пользовательскими данными.
Private Declare Function tmp_L502_ProcessDataWithUserExt Lib "l502api" Alias "L502_ProcessDataWithUserExt" (ByVal hnd As Long, ByRef src As Long, ByVal size As Long, ByVal flags As Long, ByRef adc_data As Double, ByRef adc_data_size As Long, ByRef din_data As Long, ByRef din_data_size As Long, ByRef usr_data As Long, ByRef usr_data_size As Long) As Long
'Подготовка данных для вывода в модуль.
Private Declare Function tmp_L502_PrepareData Lib "l502api" Alias "L502_PrepareData" (ByVal hnd As Long, ByRef dac1 As Double, ByRef dac2 As Double, ByRef digout As Long, ByVal size As Long, ByVal flags As Long, ByRef out_buf As Long) As Long

'Получить количество отсчетов в буфере потока на ввод.
Public Declare Function L502_GetRecvReadyCountLib Lib "l502api" (ByVal hnd As Long, ByRef rdy_cnt As Long) As Long
'Получить размер свободного места в буфере потока на вывод.
Public Declare Function L502_GetSendReadyCount Lib "l502api" (ByVal hnd As Long, ByRef rdy_cnt As Long) As Long
'Получить номер следующего ожидаемого логического канала АЦП для  обработки.
Public Declare Function L502_GetNextExpectedLchNum Lib "l502api" (ByVal hnd As Long, ByRef lch As Long) As Long
'Начало подготовки вывода синхронных данных
Public Declare Function L502_PreloadStart Lib "l502api" (ByVal hnd As Long) As Long
'Начало загрузки циклического сигнала на вывод
Public Declare Function L502_OutCycleLoadStart Lib "l502api" (ByVal hnd As Long, ByVal size As Long) As Long
'Установка ранее загруженного циклического сигнала на вывод
Public Declare Function L502_OutCycleSetup Lib "l502api" (ByVal hnd As Long, ByVal flags As Long) As Long
'Останов вывода циклического сигнала
Public Declare Function L502_OutCycleStop Lib "l502api" (ByVal hnd As Long, ByVal flags As Long) As Long
'Установка размера буфера в драйвере для синхронного ввода или вывода.
Public Declare Function L502_SetDmaBufSize Lib "l502api" (ByVal hnd As Long, ByVal dma_ch As Long, ByVal size As Long) As Long
'Установка шага прерывания при передаче потока по DMA.
Public Declare Function L502_SetDmaIrqStep Lib "l502api" (ByVal hnd As Long, ByVal dma_ch As Long, ByVal step As Long) As Long

'Загрузка прошивки сигнального процессора BlackFin.
Public Declare Function L502_BfLoadFirmware Lib "l502api" (ByVal hnd As Long, ByVal filename As String) As Long
'Проверка, загружена ли прошивка BlackFIn.
Public Declare Function L502_BfCheckFirmwareIsLoaded Lib "l502api" (ByVal hnd As Long, ByRef version As Long) As Long
'Чтение блока данных из памяти сигнального процессора.
Private Declare Function tmp_L502_BfMemRead Lib "l502api" Alias "L502_BfMemRead" (ByVal hnd As Long, ByVal addr As Long, ByRef regs As Long, ByVal size As Long) As Long
'Запись блока данных в память сигнального процессора.
Private Declare Function tmp_L502_BfMemWrite Lib "l502api" Alias "L502_BfMemWrite" (ByVal hnd As Long, ByVal addr As Long, ByRef regs As Long, ByVal size As Long) As Long
'Передача управляющей команды сигнальному процессору.
Private Declare Function tmp_L502_BfExecCmd Lib "l502api" Alias "L502_BfExecCmd" (ByVal hnd As Long, ByVal cmd_code As Integer, ByVal par As Long, ByRef snd_data As Long, ByVal snd_size As Long, ByRef rcv_data As Long, ByVal rcv_size As Long, ByVal tout As Long, ByRef recvd_size As Long) As Long

'Чтение блока данных из Flash-памяти.
 Private Declare Function tmp_L502_FlashRead Lib "l502api" Alias "L502_FlashRead" (ByVal hnd As Long, ByVal addr As Long, ByRef data As Byte, ByVal size As Long) As Long
 'Запись блока данных во Flash-память модуля.
 Private Declare Function tmp_L502_FlashWrite Lib "l502api" Alias "L502_FlashWrite" (ByVal hnd As Long, ByVal addr As Long, ByRef data As Byte, ByVal size As Long) As Long
'Стирание блока во Flash-памяти.
 Public Declare Function L502_FlashErase Lib "l502api" (ByVal hnd As Long, ByVal addr As Long, ByVal size As Long) As Long
 'Разрешение записи в пользовательскую область Flash-памяти.
 Public Declare Function L502_FlashWriteEnable Lib "l502api" (ByVal hnd As Long) As Long
 'Запрет записи в пользовательскую область Flash-памяти.
 Public Declare Function L502_FlashWriteDisable Lib "l502api" (ByVal hnd As Long) As Long
 
 'Получить версию библиотеки.
Public Declare Function L502_GetDllVersion Lib "l502api" () As Long
'Получить версию драйвера устройства.
Public Declare Function L502_GetDriverVersion Lib "l502api" (ByVal hnd As Long, ByRef ver As Long) As Long
'Моргание светодиодом на передней панели.
Public Declare Function L502_LedBlink Lib "l502api" (ByVal hnd As Long) As Long
'Установка подтягивающих резисторов на входных линиях.
Public Declare Function L502_SetDigInPullup Lib "l502api" (ByVal hnd As Long, ByVal pullups As Long) As Long


Private Declare Function tmp_L502_GetErrorString Lib "l502api" Alias "L502_GetErrorString" (ByVal Error_Code As Long) As Long


Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long


Public Function L502_AsyncGetAdcFrame(ByVal hnd As Long, ByVal flags As Long, ByVal tout As Long, ByRef data() As Double) As Long
    L502_AsyncGetAdcFrame = tmp_L502_AsyncGetAdcFrame(hnd, flags, tout, data(0))
End Function

Public Function L502_Recv(ByVal hnd As Long, ByRef buf() As Long, ByVal size As Long, ByVal tout As Long) As Long
    L502_Recv = tmp_L502_Recv(hnd, buf(0), size, tout)
End Function

Public Function L502_Send(ByVal hnd As Long, ByRef buf() As Long, ByVal size As Long, ByVal tout As Long) As Long
    L502_Send = tmp_L502_Send(hnd, buf(0), size, tout)
End Function


Public Function L502_ProcessAdcData(ByVal hnd As Long, ByRef src() As Long, ByRef dest() As Double, ByRef size As Long, ByVal flags As Long) As Long
    L502_ProcessAdcData = tmp_L502_ProcessAdcData(hnd, src(0), dest(0), size, flags)
End Function

Public Function L502_ProcessData(ByVal hnd As Long, ByRef src() As Long, ByVal flags As Long, ByRef adc_data() As Double, ByRef adc_data_size As Long, ByRef din_data() As Long, ByRef din_data_size As Long) As Long
    L502_ProcessData = tmp_L502_ProcessData(hnd, src(0), flags, adc_data(0), adc_data_size, din_data(0), din_data_size)
End Function

Public Function L502_ProcessDataWithUserExt(ByVal hnd As Long, ByRef src() As Long, ByVal size As Long, ByVal flags As Long, ByRef adc_data() As Double, ByRef adc_data_size As Long, ByRef din_data() As Long, ByRef din_data_size As Long, ByRef usr_data() As Long, ByRef usr_data_size As Long) As Long
    L502_ProcessDataWithUserExt = tmp_L502_ProcessDataWithUserExt(hnd, src(0), size, flags, adc_data(0), adc_data_size, din_data(0), din_data_size, usr_data(0), usr_data_size)
End Function

Public Function L502_PrepareData(ByVal hnd As Long, ByRef dac1() As Double, ByRef dac2() As Double, ByRef digout() As Long, ByVal size As Long, ByVal flags As Long, ByRef out_buf() As Long) As Long
    L502_PrepareData = tmp_L502_PrepareData(hnd, dac1(0), dac2(0), digout(0), size, flags, out_buf(0))
End Function

Public Function L502_BfMemRead(ByVal hnd As Long, ByVal addr As Long, ByRef regs() As Long, ByVal size As Long) As Long
    L502_BfMemRead = tmp_L502_BfMemRead(hnd, addr, regs(0), size)
End Function

Public Function L502_BfMemWrite(ByVal hnd As Long, ByVal addr As Long, ByRef regs() As Long, ByVal size As Long) As Long
    L502_BfMemWrite = tmp_L502_BfMemWrite(hnd, addr, regs(0), size)
End Function

Public Function L502_BfExecCmd(ByVal hnd As Long, ByVal cmd_code As Integer, ByVal par As Long, ByRef snd_data() As Long, ByVal snd_size As Long, ByRef rcv_data() As Long, ByVal rcv_size As Long, ByVal tout As Long, ByRef recvd_size As Long) As Long
    L502_BfExecCmd = tmp_L502_BfExecCmd(hnd, cmd_code, par, snd_data(0), snd_size, rcv_data(0), rcv_size, tout, recvd_size)
End Function

Public Function L502_FlashRead(ByVal hnd As Long, ByVal addr As Long, ByRef data() As Byte, ByVal size As Long) As Long
    L502_FlashRead = tmp_L502_FlashRead(hnd, addr, data(0), size)
End Function
 
 Public Function L502_FlashWrite(ByVal hnd As Long, ByVal addr As Long, ByRef data() As Byte, ByVal size As Long) As Long
    L502_FlashWrite = tmp_L502_FlashWrite(hnd, addr, data(0), size)
 End Function

Public Function StrFromPtr(ByVal lpStr As Long) As String
    Dim bStr() As Byte
    Dim cChars As Long
    On Error Resume Next
    ' Get the number of characters in the buffer
    cChars = lstrlen(lpStr)
    If cChars Then
     ' Resize the byte array
     ReDim bStr(0 To cChars - 1) As Byte
     ' Grab the ANSI buffer
     Call CopyMemory(bStr(0), ByVal lpStr, cChars)
    End If
    ' Now convert to a VB Unicode string
    StrFromPtr = StrConv(bStr, vbUnicode)
End Function

Public Function L502_GetErrorString(ByVal Error_Code As Long) As String
    Dim Ptr As Long
    Ptr = tmp_L502_GetErrorString(Error_Code)
    L502_GetErrorString = StrFromPtr(Ptr)
End Function

Public Function L502_GetSerialList(ByRef serials() As String, ByVal flags As Long) As Long
    Dim tmp As Long
    Dim cnt As Long
    Dim ret_cnt As Long
    Dim dummy As Long
    Dim err As Long
    
    ret_cnt = 0
    tmp = 0
    
    ret_cnt = tmp_L502_GetSerialList(tmp, 0, flags, cnt)
      If ret_cnt < 0 Then
        err = ret_cnt
        ReDim serials(0)
    Else
        If cnt = 0 Then
            ReDim serials(0)
       Else
            tmp = GlobalAlloc(0, L502_SERIAL_SIZE * cnt)
            If tmp = 0 Then
                err = L502_ERR_MEMORY_ALLOC
            Else
                ret_cnt = tmp_L502_GetSerialList(tmp, cnt, flags, dummy)
                If ret_cnt < 0 Then
                   err = ret_cnt
                   ReDim serials(0)
                Else
                    If ret_cnt = 0 Then
                        ReDim serials(0)
                    Else
                        ReDim serials(0 To ret_cnt - 1)
                         For i = 0 To ret_cnt - 1
                            serials(i) = StrFromPtr(tmp)
                         Next
                    End If
                End If
                GlobalFree (tmp)
             End If
       End If
    End If
    
    If err = L502_ERR_OK Then
        err = ret_cnt
    End If
    L502_GetSerialList = err
End Function

