unit RgReaderApiType;

interface

uses
  Winapi.Windows, RgReaderApiDef;

const
  MAX_STRING_LENGTH = 64;
  UID_LENGTH = 8;
  MIFARE_BLOCK_LENGTH = 16;

type
  // uint8_t	  	8 бит, целое, без знака
  // uint16_t	   16 бит, целое, без знака
  // uint32_t	   32 бит, целое, без знака
  // int8_t		    8 бит, целое, со знаком
  // int16_t		 16 бит, целое, со знаком
  // int32_t		 32 бит, целое, со знаком

  uint32p = ^uint32;
  uint16p = ^uint16;
  uint8p = ^uint8;
  int32p = ^int32;

  Tapi_error = cardinal;

  TRG_CARD_UID = array [0 .. UID_LENGTH - 1] of uint8;
  TRG_MIFARE_KEY = array [0 .. 5] of uint8;
  TRG_MIFARE_AES_KEY = array [0 .. 15] of uint8;
  Tblock_data = array [0 .. 15] of uint8;
  TRG_STAGE = (STAGE_BOOT = 0, STAGE_WRITE, STAGE_COMPLETE,
    STAGE_COMPLETE_ERROR);
  TRespBuf = array [0 .. 255] of uint8;
    TRg_SetBlock=array [0 .. 31] of uint8;

  TCallBackFn = procedure(mode: TRG_STAGE; currentBlock: uint16;
    totalBlocks: uint16; error: Tapi_error); cdecl;
  PCallBackFn = ^TCallBackFn;

  /// <summary>
  /// Предоставляет данные для подключения к конечной точке. Содержит базовую
  /// и расширенную информацию.
  /// Данный тип используется при поиске портов/устройств как возвращаемый.
  /// </summary>
  TRG_ENDPOINT_INFO = packed record
    /// <summary>
    /// Тип конечной точки, согласно TRG_CONNECTION_TYPE
    /// Определяет используемый механизм подключения.
    /// </summary>
    ENDPOINT_TYPE: TRG_ENDPOINT_TYPE;
    /// <summary>
    /// Адрес конечной точки (нуль-терминированная ASCII строка)
    /// Максимальная длина строки - 64 символа, включая завершающий \0
    /// </summary>
    address: array [0 .. 64 - 1] of ansichar;
    /// <summary>
    /// Отображаемое (системное) имя конечной точки (нуль-терминированная ASCII строка)
    /// Максимальная длина строки - 128 символов, включая завершающий \0
    /// </summary>
    friendly_name: array [0 .. 128 - 1] of ansichar;
  end;

  /// <summary>
  /// Указатель на структуру конечной точки устройства
  /// </summary>
  PRG_ENDPOINT_INFO = ^TRG_ENDPOINT_INFO;

  /// <summary>
  /// Определяет тип и адрес конечной точки для подключения к устройству/устройствам
  /// </summary>
  TPRG_ENDPOINT = packed record
    /// <summary>
    /// Тип конечной точки, согласно TRG_ENDPOINT_TYPE
    /// Определяет используемый механизм подключения.
    /// </summary>
    ENDPOINT_TYPE: TRG_ENDPOINT_TYPE;
    /// <summary>
    /// Адрес конечной точки (нуль-терминированная ASCII строка)
    /// </summary>
    address: ansistring;
    // ----------------------   может добавить не обращать внимание на адрес если HID
  end;

  /// <summary>
  /// Указатель на структуру конечной точки устройства
  /// </summary>
  PRG_ENDPOINT = ^TPRG_ENDPOINT;

  /// <summary>
  /// Информация об устройстве (для 202)
  /// </summary>
  TRG_DEVICE_INFO_SHORT = packed record
    /// <summary>
    /// Адрес устройства
    /// </summary>
    address: uint8;
    /// <summary>
    /// Тип устройства
    /// </summary>
    device_Type: TRG_DEVICE_TYPE;
    /// <summary>
    /// Версия прошивки
    /// </summary>
    firmware: uint8;
    /// <summary>
    /// Количество записанных кодограмм
    /// </summary>
    codogramms: uint8;
  end;

  /// <summary>
  /// Указатель на структуру информации об устройстве (для 202)
  /// </summary>
  PRG_DEVICE_INFO_SHORT = ^TRG_DEVICE_INFO_SHORT;

  /// <summary>
  /// Информация об устройстве
  /// </summary>
  TRG_DEVICE_INFO_EXT = packed record
    /// <summary>
    /// Адрес устройства
    /// </summary>
    address: uint8;
    /// <summary>
    /// Серийный номер
    /// </summary>
    serial: uint32;
    /// <summary>
    /// Значение для проверки на запрет прошивки
    /// </summary>
    // --------------------- что это
    firmwareUpdateLock: uint8;
    /// <summary>
    /// Тип устройства
    /// </summary>
    device_Type: TRG_DEVICE_TYPE;
    /// <summary>
    /// Версия прошивки
    /// </summary>
    firmware: uint16;
    /// <summary>
    /// Количество записанных кодограмм
    /// </summary>
    // --------------------- не правильное описание
    capabilities: uint32;
  end;

  /// <summary>
  /// Указатель на структуру информации об устройстве
  /// </summary>
  PRG_DEVICE_INFO_EXT = ^TRG_DEVICE_INFO_EXT;

  /// <summary>
  /// Информация о карте
  /// </summary>
  TRG_CARD_INFO = packed record
    /// <summary>
    /// Тип карты, согласно TRG_CARD_TYPE_CODE
    /// </summary>
    cardType: TRG_CARD_TYPE_CODE;
    /// <summary>
    /// UID карты
    /// </summary>
    cardUid: TRG_CARD_UID;
  end;

  /// <summary>
  /// Указатель на структуру информации о карте
  /// </summary>
  PRG_CARD_INFO = ^TRG_CARD_INFO;

  /// <summary>
  /// Структура данных с блока карты
  /// </summary>
  TRG_CARD_MEMORY = packed record
    /// <summary>
    /// Номер профиля или номер блока, в зависимости от места использования
    /// </summary>
    profile_block: uint8;
    /// <summary>
    /// Данные блока
    /// </summary
    block_data: Tblock_data;
  end;

  /// <summary>
  /// Указатель на структуру данных с блока карты
  /// </summary>
  PRG_CARD_MEMORY = ^TRG_CARD_MEMORY;

  /// <summary>
  /// Структур параметров авторизации карт Mifare
  /// </summary>
  TRG_CARD_AUTH_PARAMS = packed record
    /// <summary>
    /// Флаги авторизации, согласно E_RG_CARD_AUTH_FLAGS
    /// </summary>
    asscessFlags: uint8;
    /// <summary>
    /// Ключ авторизации карт Mifare Classic
    /// </summary>
    classicKey: TRG_MIFARE_KEY;
    /// <summary>
    /// Ключ авторизации карт Mifare Plus SL3
    /// </summary>
    plusKey: TRG_MIFARE_AES_KEY;
  end;

  /// <summary>
  /// Указатель на структуру параметров авторизации карт Mifare
  /// </summary>
  PRG_CARD_AUTH_PARAMS = ^TRG_CARD_AUTH_PARAMS;

  /// <summary>
  /// Версия библиотеки
  // ------------------------------- нет функции. Добавить описание где Мажор\Минор
  /// </summary>
  TRG_GetVersion = function(): cardinal; cdecl;

  /// <summary>
  /// Выполняет инициализацию внутренних механизмов библиотеки.
  /// =0
  /// </summary>
  // TRG_InitializeLib = function(params: uint32): Tapi_error; cdecl;
  TRG_InitializeLib = function(): Tapi_error; cdecl;

  /// <summary>
  /// Завершает работу внутренних механизмов библиотеки.
  /// </summary>
  /// <returns></returns>
  TRG_Uninitialize = function(): Tapi_error; cdecl;

  /// <summary>
  /// Закрывает и уничтожает ранее выделенный ресурс по указанному дескриптору.
  /// </summary>
  /// <param name="handle">Дескриптор ресурса.</param>
  /// <returns></returns>
  TRG_CloseResource = function(handle: THandle): Tapi_error; cdecl;

  /// <summary>
  /// Выполняет поиск доступных точек подключения.
  /// </summary>
  /// <param name="pEndPointListHandle">Указатель на переменную, в которомю будет записан дескриптор списка найденных точек подключения.</param>
  /// ------------------------------------------- не правильно pCount  enpointTypeMask
  /// <param name="pCount">Маска типов конечных точек.</param>
  /// <param name="pCount">Указатель на переменную, по которому будет сохранено колличество элементов в списке результатов.</param>
  /// <returns></returns>
  TRG_FindEndPoints = function(pEndPointListHandle: pHandle;
    enpointTypeMask: TRG_ENDPOINT_TYPE; pCount: uint32p): Tapi_error; cdecl;

  /// <summary>
  /// ------------------------------------------- не правильно  RG_GetEndpointList
  /// Извлекает из списка результатов, полученного с помощью функции RG_GetEndpointList, информацию о точке подключения по указанному индексу.
  /// </summary>
  /// <param name="endPointListHandle">Дескриптор списка точек подключения, полученный через RG_GetEndpointList.</param>
  /// <param name="listIndex">Индекс в списке.</param>
  /// <param name="pEndpointInfo">Указатель на структуру информации о точке подключения.</param>
  /// <returns></returns>
  TRG_GetFoundEndPointInfo = function(endPointListHandle: THandle;
    listIndex: uint32; pEndpointInfo: PRG_ENDPOINT_INFO): Tapi_error; cdecl;

  /// <summary>
  /// ------------------------------------------- не правильно , согласно маске
  /// Выполняет поиск устройств по всем доступным точкам подключения.
  /// </summary>
  /// <param name="pDevicesListHandle">Указатель на переменную, в которомю будет записан дескриптор списка найденных устройств.</param>
  /// --------------------- нет описания маски
  /// <param name="pCount">Указатель на переменную, по которому будет сохранено колличество элементов в списке результатов.</param>
  /// <returns></returns>
  TRG_FindDevices = function(pDevicesListHandle: pHandle;
    endpointTypeMask: uint8; pCount: uint32p): Tapi_error; cdecl;

  /// <summary>
  /// Извлекает из списка результатов, полученного с помощью функции RG_GetDevicesList, информацию об устройстве по индексу.
  /// Для RDR-202
  /// </summary>
  /// <param name="deviceListHandle">Дескриптор списка найденных устройств, полученный через RG_GetDevicesList.</param>
  /// <param name="listIndex">Индекс в списке.</param>
  /// <param name="pEndpointInfo">Указатель на структуру информации о точке подключения.</param>
  /// <param name="pDeviceInfoExt">Указатель на структуру расширенной информации об устройстве.</param>
  /// <returns></returns>
  TRG_GetFoundDeviceInfo = function(deviceListHandle: THandle;
    listIndex: uint32; pEndpointInfo: PRG_ENDPOINT_INFO;
    pDeviceInfoExt: PRG_DEVICE_INFO_EXT): Tapi_error; cdecl;

  /// <summary>
  /// Инициализация устройства.
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <returns></returns>
  TRG_InitDevice = function(pEndPoint: PRG_ENDPOINT; address: uint8)
    : Tapi_error; cdecl;

  /// <summary>
  /// Сбрасывает состояние устройства. Потребуется повторная инициализация.
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <returns></returns>
  TRG_CloseDevice = function(pEndPoint: PRG_ENDPOINT; address: uint8)
    : Tapi_error; cdecl;

  /// <summary>
  /// Запрос информации об устройстве. Требуется предварительная инициализация устройства методом RG_InitDevice.
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="pDeviceInfo">Указатель на структуру информации об устройстве.</param>
  /// <returns></returns>
  TRG_GetInfo = function(pEndPoint: PRG_ENDPOINT; address: uint8;
    pDeviceInfo: PRG_DEVICE_INFO_SHORT): Tapi_error; cdecl;

  /// <summary>
  /// ------------------------------------------- не работает без инициализации а по идее должно?
  /// Запрос расширенной информации об устройстве.
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="pDeviceInfo">Указатель на структуру расширенной информации об устройстве.</param>
  /// <returns></returns>
  TRG_GetInfoExt = function(pEndPoint: PRG_ENDPOINT; address: uint8;
    pDeviceInfo: PRG_DEVICE_INFO_EXT): Tapi_error; cdecl;

  /// <summary>
  /// Задает для устройство типы считываемых карт. Требуется предварительная инициализация устройства методом RG_InitDevice.
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="mCardsFamilyMask">Маска типов считываемых карт, согласно TRG_CARD_FAMILY_CODE.</param>
  /// <returns></returns>
  TRG_SetCardsMask = function(pEndPoint: PRG_ENDPOINT; address: uint8;
    mCardsFamilyMask: uint8): Tapi_error; cdecl;

  /// <summary>
  /// Удаляет все профили из памяти устройства. Требуется предварительная инициализация устройства методом RG_InitDevice.
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <returns></returns>
  TRG_ClearProfiles = function(pEndPoint: PRG_ENDPOINT; address: uint8)
    : Tapi_error; cdecl;

  /// <summary>
  /// Записывает профиль в память устройства. Требуется предварительная инициализация устройства методом RG_InitDevice.
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="mProfileNum">Номер профиля, под которым он будет записан в память устройства.</param>
  /// <param name="mBlockNum">Номер блока карты.</param>
  /// <param name="pCardAuthParams">Указатель на структуру параметров авторизации карты.</param>
  /// <returns></returns>
  TRG_WriteProfile = function(pEndPoint: PRG_ENDPOINT; address: uint8;
    profileNum: uint8; blockNum: uint8; pCardAuthParams: PRG_CARD_AUTH_PARAMS)
    : Tapi_error; cdecl;

  /// <summary>
  /// ------------------------------------------- В ответ когда нет карты возвращает тип - Pin? Может FF тогда уж кидать и ему присвоить- Неизвестно.
  /// Считывает данные из указаннного блока памяти карты используя указанные параметры авторизации.
  /// Требуется предварительная инициализация устройства методом RG_InitDevice.
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="pStatusType">Указатель на переменную, по которому будет записано текущее значение татуса.</param>
  /// <param name="pPinStates">Указатель на переменную, по которому будут записаны флаги текущего состояния входов/выходов.</param>
  /// <param name="pCardInfo">Указатель на структуру информации о карте, заполняется в зависимости от текущего статуса.</param>
  /// <param name="pMemory">Указатель на структуру данных, считанных из блока памяти карты при успешной авторизации по профилю. Номер профиля сохраняется в pMemory->profile_block.</param>
  /// <returns>Код ошибки</returns>
  TRG_GetStatus = function(pEndPoint: PRG_ENDPOINT; address: uint8;
    pStatusType: PRG_STATUS_TYPE; pPinStates: uint8p; pCardInfo: PRG_CARD_INFO;
    pMemory: PRG_CARD_MEMORY): Tapi_error; cdecl;

  // NLMK
  // TRG_SetProfile = function(pEndPoint: PRG_ENDPOINT; address: uint8)
  // : Tapi_error; cdecl;

  /// <summary>
  /// Сбрасывает поле на время, достаточное для переключения карты из одного режима в другой (например, при переключении из SL1 в SL3) и других операций
  /// Требуется предварительная инициализация устройства методом RG_InitDevice.
  /// При наличии активных подписок на события, требуется вызов RG_IsolateDevice().
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="mAddress">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <returns></returns>
  TRG_ResetField = function(pEndPoint: PRG_ENDPOINT; address: uint8)
    : Tapi_error; cdecl;

  /// <summary>
  /// Выполняет цикл запроса карт в поле, процедуру антиколлизии и выбор карты.
  /// Требуется предварительная инициализация устройства методом RG_InitDevice.
  /// При наличии активных подписок на события, требуется вызов RG_IsolateDevice().
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="mAddress">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="pSak">Указатель на переменную для записи кода SAK (Select Acknowledge)</param>
  /// <param name="pAtq">Указатель на переменную для записи кода типа карты Mifare.</param>
  /// <param name="pUidBuf">Указатель на блок памяти для сохранения UID выбранной карты.</param>
  /// <param name="pAtq">Размер блока памяти по указателю pUidBufSize.</param>
  /// <returns></returns>
  TRG_Iso_Ras = function(pEndPoint: PRG_ENDPOINT; address: uint8; pSak: uint16p;
    pAtqa: uint16p; pUidBuf: pointer; uidBufSize: int32): Tapi_error; cdecl;

  /// <summary>
  /// Выполняет авторизацию сектора карты Mifare Classic
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="mAddress">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="blockNum">Номер блока сектора, в который производится авторизация.</param>
  /// <param name="keyType">Тип используемого ключа авторизации (A/B).</param>
  /// <param name="pKeyBuf">Указатель на блок памяти, содержащей, как минимум, 6 байт данныхъ ключа авторизации.</param>
  /// <returns></returns>
  TRG_MF_AuthorizeClassic = function(pEndPoint: PRG_ENDPOINT; address: uint8;
    blockNum: uint8; keyType: uint8; pKeyBuf: uint8p): Tapi_error; cdecl;

  /// <summary>
  /// Авторизация сектора карты Mifare.
  /// Требуется предварительная инициализация устройства методом RG_InitDevice.
  /// При наличии активных подписок на события, требуется вызов RG_IsolateDevice().
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="mAddress">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="blockNum">Номер блока сектора, в который производится авторизация.</param>
  /// <param name="pKeyBuf">Указатель на блок памяти с данными ключа авторизации.</param>
  /// <param name="keyBufSize">Размер блока памяти/данных по указателю pKeyBuf (максимально допустимая длинна ключа - 16 байт).</param>
  /// <returns></returns>
  TRG_Iso_Auth = function(pEndPoint: PRG_ENDPOINT; address: uint8;
    blockNum: uint16; pKeyBuf: uint8p; keyBufSize: int32): Tapi_error; cdecl;

  /// <summary>
  /// Выполняет чтение данных из блока памяти карты Mifare Classic/Plus
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="mAddress">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="flags">ФЛаги определяющие тип карты, с которой производится чтение.</param>
  /// <param name="blockNum">Номер блока карты.</param>
  /// <param name="pDataBuf">Указатель на блок памяти, в которую будут записаны данные считанные из блока памяти карты.</param>
  /// <param name="dataBufSize">Размер блока памяти по указателю pDataBuf.</param>
  /// <returns></returns>
  TRG_MF_ReadBlock = function(pEndPoint: PRG_ENDPOINT; address: uint8;
    blockNum: uint8; flags: uint8; pDataBuf: uint8p; dataBufSize: int32)
    : Tapi_error; cdecl;

  /// <summary>
  /// Выполняет запись данных в блок памяти карты Mifare Classic/Plus
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="mAddress">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="flags">Флаги определяющие тип карты, в память которой производится запись (Classic/Plus).</param>
  /// <param name="blockNum">Номер блока карты.</param>
  /// <param name="pDataBuf">Указатель на блок памяти содержащей данные, которые необходимо записать в блок памяти карты.</param>
  /// <param name="dataBufSize">Размер блока памяти по указателю pDataBuf.</param>
  /// <returns></returns>
  TRG_MF_WriteBlock = function(pEndPoint: PRG_ENDPOINT; address: uint8;
    blockNum: uint8; flags: uint8; pDataBuf: uint8p; dataBufSize: int32)
    : Tapi_error; cdecl;

  /// <summary>
  /// Выполняет команду перехода на обмен по ISO 14443-4
  /// Требуется предварительная инициализация устройства методом RG_InitDevice.
  /// При наличии активных подписок на события, требуется вызов RG_IsolateDevice().
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="pAtsBuf">Указатель на блок памяти для записи UID выбранной карты.</param>
  /// <param name="atsBufSize">Размер блока памяти по указателю pAtsBuf</param>
  /// <param name="pAtsSize">Указатель на переменную, для записи количества байт, сохраненных в pAtsBuf.</param>
  /// <returns></returns>
  TRG_Iso_Rats = function(pEndPoint: PRG_ENDPOINT; address: uint8;
    pAtsBuf: uint8p; atsBufSize: int32; pAtsSize: int32p): Tapi_error; cdecl;

  /// <summary>
  /// Выполняет произвольную передачу данных по протоколу ISO14443-4.
  /// Требуется предварительная инициализация устройства методом RG_InitDevice.
  /// При наличии активных подписок на события, требуется вызов RG_IsolateDevice().
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="pReqBuf">Указатель на блок памяти, в котором хранятся передаваемые данные.</param>
  /// <param name="reqBufSize">Размер блока памяти по указателю pDataBuf.</param>
  /// <param name="pRespBuf">Указатель на блок памяти, в который будет зхаписан ответ на переданное сообщение.</param>
  /// <param name="respBufSize">Размер блока памяти по указателю respBufSize.</param>
  /// <param name="pRespSize">Указатель на переменную, для записи количества байт, сохраненных в pRespBuf.</param>
  /// <returns></returns>
  TRG_Iso_Exchange = function(pEndPoint: PRG_ENDPOINT; address: uint8;
    const pReqBuf: uint8p; reqBufSize: int32; pRespBuf: uint8p;
    respBufSize: int32; pRespSize: int32p): Tapi_error; cdecl;

  TRG_UpdateFirmware = Function(pEndPoint: PRG_ENDPOINT; address: uint8;
    const fwFilePath: ansistring; CallBackFn: PCallBackFn): Tapi_error; cdecl;


  /// <summary>
  /// Считывает данные из указаннного блока памяти карты используя указанные параметры авторизации.
  /// Требуется предварительная инициализация устройства методом RG_InitDevice.
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="pStatusType">Указатель на переменную, по которому будет записано текущее значение татуса.</param>
  /// <param name="pUidBuffer">Указатель на блок памяти, для хранения UID.</param>
  /// <param name="uidBufferSize">Размер блока памяти по указателю pUidBuffer.</param>
  /// <param name="pUidSize">Указатель на переменную, в котрую будет записан размер UID карты.</param>
  /// <returns>Код ошибки</returns>
  TRG_GetCard = Function(pEndPoint: PRG_ENDPOINT; address: uint8;
    pStatusType: PRG_STATUS_TYPE; pUidBuffer: uint8p; uidBufferSize: int32;
    pUidSize: int32p): Tapi_error; cdecl;

  /// <summary>
  /// Выполняет передачу PIN-кода защиты параметров
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="pin">PIN-код</param>
  /// <returns></returns>
  TRG_UnlockSettigns = Function(pEndPoint: PRG_ENDPOINT; address: uint8;
    pin: uint16): Tapi_error; cdecl;

  /// <summary>
  /// Выполняет передачу PIN-кода защиты параметров
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="pin">PIN-код</param>
  /// <returns></returns>
  TRG_CommitSettings = Function(pEndPoint: PRG_ENDPOINT; address: uint8;
    pin: uint16): Tapi_error; cdecl;

  /// <summary>
  /// Выполняет чтение блока параметров
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="blockType">Тип блока параметров, согласно E_RG_SETTINGS_BLOCK_TYPE</param>
  /// <param name="blockNum">Номер блока/профиля</param>
  /// <param name="block32Buf">Указатель на область памяти, куда будет произведено чтение данных блока из памяти устройства</param>
  /// <param name="block32BufSize">Размер блока памяти по указателю pBlockData</param>
  /// <returns></returns>
  TRG_ReadSettingsBlock = Function(pEndPoint: PRG_ENDPOINT; address: uint8;
    blockType: TRG_SETTINGS_BLOCK_TYPE; blockNum: uint16; block32Buf: uint8p;
    block32BufSize: int32): Tapi_error; cdecl;

  /// <summary>
  /// Выполняет запись блока параметров
  /// </summary>
  /// <param name="pEndPoint">Указатель на структуру параметров подключения.</param>
  /// <param name="address">Адрес устройства (0...3, в зависимости от типа подключения).</param>
  /// <param name="blockType">Тип блока параметров, согласно E_RG_SETTINGS_BLOCK_TYPE</param>
  /// <param name="blockNum">Номер блока/профиля</param>
  /// <param name="block32Buf">Указатель на область памяти с данными блока параметров, которые требуется записать, не более 32 байт.</param>
  /// <param name="block32BufSize">Размер блока памяти по указателю pBlockData</param>
  /// <returns></returns>
  TRG_WriteSettingsBlock = Function(pEndPoint: PRG_ENDPOINT; address: uint8;
    blockType: TRG_SETTINGS_BLOCK_TYPE; blockNum: uint16; const block32Buf: uint8p;
    block32BufSize: int32): Tapi_error; cdecl;

implementation

end.
