среда, 20 августа 2014 г.

Описание API вызова библиотеки HIDOUTEX.DLL

Данная библиотека (далее DLL), для работы с любыми USB.HID устройствами (VID=ваш, PID=ваш) через SetupAPI в ОС NT/2000/2003/XP/7/8/10, предоставляет универсальный доступ к записи и считыванию для других приложений вне зависимости от языка в среде Win32/64.

Схема общей эмуляции HID на ATMega:


 Для использования DLL в своих проектах соблюдайте соглашение об stdcall-вызовах. Тип соглашения о вызове объявляется после прототипа функции, будь то объявление функционального типа или же объявление функции.

Библиотека HIDOUTEX.dll позволяет, независимое от записи, чтение любого заданного HID-устройства. Таким образом, вы можете управлять выходами одного заданного HID-устройства и считывать параметры с него же или с другого HID-устройства. К примеру, подключив к USB портам ПК/ноутбука/нетбука uniUSB и HID-термометр можно осуществить управление одним, считывая показания другого через одну функцию в один момент времени.

Таблица расшифровок входных и выходных параметров экспортируемой функции 'setget_leds()' библиотеки 'HIDOUTEX.DLL':
Параметр    Функционал                    Тип переменной
===============================================================================
outvid        Vendor ID устройства для записи            Integer
outpid        Product ID устройства для записи        Integer
report        репорт                        Byte
anydata        данные                        Byte
invid        Vendor ID устройства для чтения            Integer
inpid        Product ID устройства для чтения        Integer
inleds        Байт для чтения                    Byte
Пример динамического подключения (Delphi 6/7/2006/2009/2010/TDL/XE5-7):
var
 leds: byte; // значение байта данных на МК

  setget_leds:function(outvid, outpid: integer; report, anydata: byte;
                       invid, inpid: integer; var inleds: longword):pchar;stdcall;
  LibHandle: THandle;


{ установка любого бита в байте }
function SetBit(AWord: longword; ABit: byte; AState: boolean = true): longword;
begin
 if AState then Result:= AWord or (1 shl ABit)
  else Result:= AWord and (not (1 shl ABit))
end;

function LinkProc(ProcName: string):Pointer;
begin
 result:= GetProcAddress(LibHandle,PChar(ProcName))
end;

{ инициализация }
begin
 LibHandle:= LoadLibrary('hidoutex.dll');
 if LibHandle<>0 then
  setget_leds:= LinkProc('setget_leds');
end;

{ пример вызова (записи) }
var rd: cardinal;
begin
 // управление выходами
 setget_leds($0207, $2010, $0, inleds, $0, $3, rd);

 // параметр чтения температуры
 caption:= rd - 273 + 3;
 ...
Ниже показан пример вызова (под С):
function TestDLL()
{
  // определяем новый тип DLL
  setledsdll = DLL.DefineDLL("MyDLL");

  // описываем вызываемую функцию
  // последний параметр - возвращаемое значение, должен быть указан обязательно
  proc = setledsdll.DefineProc("setget_leds", *char);

  // загружаем DLL в память, связывая имя DLL-файла с созданным ранее типом DLL
  lib = DLL.Load("hidoutex.dll", "MyDLL");

  // вызываем функцию
  lib.setget_leds(int outvid, outpid; byte report, anydata; int invid, inpid; var long inleds);
}
Ниже показан пример вызова (под С#):
using System.Runtime.InteropServices;
...

    unsafe static class hidout
    {

        [DllImport("hidoutex.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.char)]
        static extern char setget_leds (
            [In] int outvid,
            [In] int outpid,
            [In] byte report,
            [In] byte anydata,
            [In] int invid,
            [In] int inpid,
            [Out] long inleds
            );

        public static int setget_leds_ ( int outvid, outpid; byte report, anydata; int invid, inpid; long inleds ) {
            setget_leds(outvid, outpid, report, anydata, invid, inpid, inleds);
            return 0;
        }
    }

{ пример вызова }
hidout.setget_leds_(0x0207, 0x2010, 0x00, 0x00, 0x00, 0x00, long rd);



ПОРЯДОК ИСПОЛЬЗОВАНИЯ

  •  // допустим нужно зажечь нулевой бит (установить в "1"), что соответствует порту PB0 (выв.14 МК), тогда пользуемся функцией SetBit() и передадим значение байта в функцию setleds()
 leds:= SetBit(leds, 0, true)
 setleds($0207, $2010, $0, leds, $0, $0, rd)
  •  // допустим нужно погасить нулевой бит (установить в "0"), что соответствует порту PB0 (выв.14 МК), тогда пользуемся функцией SetBit() и передадим значение байта в функцию setleds()
 leds:= SetBit(leds, 0, false)
 setleds($0207, $2010, $0, leds, $0, $0, rd)
  •  // допустим нужно зажечь первый бит (установить в "1"), что соответствует порту PB1 (выв.15 МК), тогда пользуемся функцией SetBit() и передадим значение байта в функцию setleds()
 leds:= SetBit(leds, 1, true)
 setleds($0207, $2010, $0, leds, $0, $0, rd)
  •  // допустим нужно погасить первый бит (установить в "0"), что соответствует порту PB1 (выв.15 МК), тогда пользуемся функцией SetBit() и передадим значение байта в функцию setleds()
 leds:= SetBit(leds, 1, false)
 setleds($0207, $2010, $0, leds, $0, $0, rd)

забрать

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.