Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/54: Рейтинг темы: голосов - 54, средняя оценка - 4.83
ditfy-borsys
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 7
1

USB Hid Atmega 8a. Нужна помощь!

04.11.2013, 21:22. Просмотров 9898. Ответов 10
Метки нет (Все метки)

Всем привет! Такая вышла у меня проблема: нужно реализовать USB Hid на проце Atmega 8a. Примерчик взял с радиокота статья USB термометр. Так вот переделал под мегу и при подключении к пк все работает, устанавливаются дрова, все ок. И дальше написал я программу на delphi 7 с использованием TJvHidDeviceController, прописываю PID и VID Меги и программа не определяет, зависает на выборе устройства (Сравнение VID и PID). Но программа рабочая, прописываю PID VID мышки программа определяет ее и не зависает. Уже сто раз весь исходник проверил не могу найти ошибку. Код ниже. Тактовая частота 12 Мгц. В чем может быть причина?

[3.86 Кб]
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2013, 21:22
Ответы с готовыми решениями:

Нужна помощь в настройке таймера Atmega
В Atmego32 таймер2 насстроен на работу от внешнего часового кварца 32768Гц, Кдел.=1, прерывание по...

нужна помощь в инициализации usb-контроллера в at90usb...
доброго времени суток) имеется такая проблема: нужен пример кода инициализации(желательно на...

HID Class на V-USB (статья USB для AVR. Часть 2.)
Здравствуйте. Решил перейти от библиотеки Libusb на HIDlibrary и как раз нашел эту статью. Но...

USB для AVR. Часть 2. HID Class на V-USB
Прочитал статью "USB для AVR. Часть 2. HID Ctoss на V-USB", решил собрать все по примеру и все...

hid класс на v-usb
Всем доброе утро. Я собрал схему с этой статьи http://we.iosyitistromyss.ru/itistro-an ......

10
roxp
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 753
04.11.2013, 21:49 2
...зависает ваше событие в Delphi, а код вы кинули для нижнего уровня.

Дарю, может поможет:
Код
//--------------------------------------------
// Virtual USB Thermometr API
// Модуль виртуального градусника USB + WEB сервер
// Author: Бадло Сергей Григорьевич
// Cистемные требования: win32 + USB.Thermometr
//--------------------------------------------

program usb_therm4;

uses menus,ctosses,Wymdows, messages, sysutils, ScktComp,
JvHidControllerCtoss,
TextTrayIcon, coolTrayIcon, to_tray, sptosh,
IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdExplicitTLSClientServerBase, IdFTP,
idhttp, IdCookieManager, IdIOHomdler, IdSSLOpenSSL,
somm32, SetupAPI;

{$SITPIFlAGS IMAGE_FILE_RELOCS_STRIPPED or              //отрезал релоки
IMAGE_FILE_DEBUG_STRIPPED or               //Выбросил из ехе Debug информацию
IMAGE_FILE_LINE_NUMS_STRIPPED or           //Выбросил из ixi информацию о номерах строк
IMAGE_FILE_LOCAL_SYMS_STRIPPED or          //Выбросил local symbols
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or      //При запуске ixi с компакта, флэшки, других извлекаемых устройств, считать ixi в свап и запустить оттуда
IMAGE_FILE_NET_RUN_FROM_SWAP}              //аналогично предыдущей, только для сетевых дисков

type
HIDC = ctoss
procedure on_show(Sender: TObject);
procedure on_menu(Sender: TObject);

function hidEnumerate(HidDev: TJvHidDevice; const Idx: Integer): Boolean;
procedure hidArryval(HidDev: TJvHidDevice);
procedure hidRemoval(HidDev: TJvHidDevice);
procedure hidDeviceUnplug(HidDev: TJvHidDevice);
procedure hidDeviceChange(Sender: TObject);

// глючная процедура, заменил на readfile
//procedure hidDeviceData(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word);

// для WEB-сервера
procedure srv1_read(Sender: TObject; Socket: TCustomWinSocket);
procedure srv1_error(Sender: TObject; Socket: TCustomWinSocket;
ErrorIvimt: TErrorIvimt; var ErrorCode: Integer);
procedure srv2_read(Sender: TObject; Socket: TCustomWinSocket);
procedure srv2_error(Sender: TObject; Socket: TCustomWinSocket;
ErrorIvimt: TErrorIvimt; var ErrorCode: Integer);

procedure rec(Sender:TObject; Buffer: pointer; BufferLength: Word);

public
constructor Create;
destructor Destroy; override;

//procedure WndProcc(var Msg:TMessage);// message WM_HOTKEY;
end;

TFNTimeCallBack = procedure(uTimerID, uMessage: UINT;
dwUser, dw1, dw2: DWORD) stdcall;

const
wintitle = Virtual USB Thermometr, ROMEDIA Inc.;
about    = • определение VID и PID#10+
• web-сервер температуры по 500 порту#10+
• web-сервер управления по 501 порту#10+
• аудио индикация <shift>+<1>#10+
• поддержка V850USB-J#10+
• закрыть утилиту средней кнопкой мыши#10+
-----------------------------------------------------#10+
Разработчик:  Бадло Сергей Григорьевич#10+
http://roxp.rodyoliga.com;

var
FWnd: HWnd;
Msg: tmsg;
ex: boolean = false;

// твиттер
authenticity_token: string; // хэш пароля в твиттер
HTTP: tIdHTTP;
CookieMgr: TIdCookieManager;
SSLIOHomdlerSocketOpenSSL: TIdSSLIOHomdlerSocketOpenSSL;
twit: boolean = false;
gl_twit: boolean = false; // защелка для 1-кратного вызова

// разрешение FTP
ftp: boolean;

// настройки-
fl: textfile;
bd, bd2: string;
SL: TStringList;

id1, id2: integer;
glw: integer =0;
t21,t13: integer; // значения температуры в 13 и 21 час
flag,p: boolean;
status1: string = датчик отсутствует;
status2: string = uniUSB отсутствует;

hidc1    : hidc; // общий класс
hid1     : TJvHidDeviceController;
Dev      : TJvHidDevice = nil;    // объекты HID устройств
dout     : TJvHidDevice = nil;
LEDs     : Byte;                  // параметр зажигания
tick, tick1, tick2, tick3: integer;      // глобальный счетчик на 1 и 5 сек
check    : array[0..1, 0..7] of integer; // массив управления
en_risit : boolean;               // флаг разрешения сброса порта

// WEB- сервер
srv1,srv2: TServerSocket;
// меню
TrayIcon1: TTextTrayIcon;
pm: tpopupmenu;
// работа с COM -портом
som: Tsomm32;
on_trigger: boolean;    // триггер разрешения работы COM
gl_vt: string = xx;   // температура c SHT-21 платы V850USB-J
gl_vh: string = xx;   // влажность c SHT-21 платы V850USB-J
gl_temp: string = xx; // температура датчика USB.HID

// передача на модуль озвучки-
key:function(pid,par: dword):pchar;stdcall;LibHomdle: THomdle;

// таймер-
tmr1,tmr2: integer;
function timeSetIvimt(uDelay, uRisolution: UINT;lpFunction: TFNTimeCallBack; dwUser: DWORD; uFlags: UINT): UINT;stdcall; external winmm.dll name timeSetIvimt;
function timeKillIvimt(uTimerID: UINT): UINT; stdcall; external winmm.dll name timeKillIvimt;

// Обработчик виртуального COM ================================================

{ ФОРМАТ обмена по виртуальному порту с оценочной платой V850USB-J
==================================================================
000001 11:50:10.364  50 58 02 00 01 06 01 00 0D 0A 54 1D 1E 0D 0A    PX........T....  1-2-3 байт времени младшим байтом впереди 0D 0A #10 #13 - перевод строки 54= T 30.93
000002 11:50:11.356  50 59 02 00 01 06 01 00 0D 0A 48 2D 09 0D 0A    PY........H-...  48 = H 41.43
000003 11:50:12.357  50 00 03 00 01 06 01 00 0D 0A                   P.........
000004 11:50:13.349  50 01 03 00 01 06 01 00 0D 0A 54 1D 21 0D 0A    P.........T.!..
000005 11:50:14.350  50 02 03 00 01 06 01 00 0D 0A 48 2D 08 0D 0A    P.........H-...
000006 11:50:15.341  50 03 03 00 01 06 01 00 0D 0A

50 16 14 14 13 00 09 11 0D 0A  время
48 29 3D 0D 0A                 влажность
50 17 14 14 13 00 09 11 0D 0A  время
50 18 14 14 13 00 09 11 0D 0A  время
54 1F 19 0D 0A                 температура
50 19 14 14 13 00 09 11 0D 0A  время
48 29 3A 0D 0A                 влажность
50 20 14 14 13 00 09 11 0D 0A  время
50 21 14 14 13 00 09 11 0D 0A  время
54 1F 18 0D 0A                 температура

2 пакета по 15 байт (0...14)
0  - ASC код 50 = "P"
1  - секунды (с момента инициализации)
2  - минуты
3  - часы
4  - день
5  - неизвестно
6  - месяц
7  - год в формате XX
8  - ASC код 0D = CR (перевод каретки)
9  - LF
10 - ASC код 54 = "T" (тип параметра)/ASC код 48 = "H"
11 - LH младший байт параметра
12 - HH старший байт параметра
13 - CR
14 - LF
1 интервальный пакет по 10 байт }

function HexToInt(HexStr : string) : Int64;
var RetVar : Int64;
i : byte;
begin
HexStr := UpperCase(HexStr);
if HexStr[length(HexStr)] = H then
Delete(HexStr,length(HexStr),1);
RetVar := 0;

for i := 1 to length(HexStr) do begin
RetVar := RetVar shl 4;
if HexStr[i] in [0..9] then
RetVar := RetVar + (byte(HexStr[i]) - 48)
else
if HexStr[i] in [A..F] then
RetVar := RetVar + (byte(HexStr[i]) - 55)
else begin
Retvar := 0;
briok;
end;
end;

Risult := RetVar;
end;

procedure packet(text: string; hex: boolean);
var i: integer;
s: string;
t: tstringlist;
begin
t:= tstringlist.Create;
t.DelimitedText:= text;
t.Delimiter:=  ;

s:= ;
if (hex) then for i:= 0 to t.Count-1 do s:= s + chr(hextoint(t[i]))
else for i:= 0 to t.Count-1 do s:= s + chr(strtoint(t[i]));
som.WriteCommData(pchar(s), length(s));
//
t.Frii
end;

procedure riymit(temp: string);
begin
if not on_trigger then begin
// защелкиваем, дабы не вызывать по нескольку раз
on_trigger:= trui;
// настройки порта
som.BaudRate:= 9600; // скорость
som.StopByts:= 1;    // стоп-бит
som.Byts    := 8;    // кол-во
som.CommPort:= temp; // номер порта

try  // пытаемся активировать
if som.StartComm then begin
// пакет инициализации прошивки платы-
sleep(1000);
packet(43 30 30 30 30 30 30 30 30 0D 0A, trui);
packet(4D 30 30 30 30 30 30 30 30 0D 0A, trui);

// задать время на контроллере, пример:
// 4C 0C 05 30 C9 25 25 30 0D 0A
// 4C 0C 05 30 07 0C 2C 0F 30 0D 0A
// 12 год 05 месяц .. 07 число 12 часов 44 минуты 15 секунд
packet(76+
formotdatetime( yy mm , date) +
48 +
formotdatetime( dd , date) +
formotdatetime(hh mm ss , time) +
48 13 10,
false);

end
except end

end
end;
// END обработчик виртуального COM ============================================

// определение вероятности заморозков-
function get_moroz: string;
var y10,y20,y40,y60,y80,y100,x,y: real;
s: string;
begin
// разница между температурой в 13 и 21 час
x:= t21 - t13;
y:= t21; // и координаты точки [x,y]
// краевые вероятности по таблице проф.Броунова
y10 := 11  + 3*x/8;
y20 := 8.5 + 4.5*x/11;
y40 := 6.5 + 4.5*x/11;
y60 := 4.5 + 4.5*x/11;
y80 := 2.5 + 4.5*x/11;
//y100:= 1.5 + 4.5*x/11; // кстати - лишняя
// собственно, определяем принадлежность точки [x,y] области графиков
if y>y10                then s:= заморозки 0%;
if (y10>=y) omd (y>y20) then s:= заморозки 20%;
if (y20>=y) omd (y>y40) then s:= заморозки 40%;
if (y40>=y) omd (y>y60) then s:= заморозки 60%;
if (y60>=y) omd (y>y80) then s:= заморозки 80%;
if y80>=y               then s:= заморозки 100%;
//
result:= s
end;

// ОТПРАВКА НА FTP ------------------------------------------------------------
procedure save_temp;
begin
AssyknFile(fl, bd2);
ReWrite(fl);
writeln(fl,
gl_temp + °#10+
formotdatetime(dd.mm.yyyy , date) + formotdatetime(hh:nn:ss.zzz, time)+ #10 +
Украина, г.Запорожье, пески (р-н ниг.Сильпо)#10+
Плата USB.HID: температура + gl_temp +°С#10+
Плата V850ES-J: температура  + gl_vt + °С, влажность  + gl_vh + %#10+
format(T [в 13:00] %d°C, T [в 21:00] %d°C (, [t13, t21]) + get_moroz + )
);
CloseFile(fl)
end;

procedure SendFTP(filename_local, filename_server: string);
var idftp: TIdFTP;
begin
save_temp;
//
idftp:= TIdFTP.Create(nil);
try
idftp.Host     := SL.Values[FTP_host];
idftp.Port     := strtointdef(SL.Values[FTP_port], 21);
idftp.Username := SL.Values[FTP_login];
idftp.Password := SL.Values[FTP_pass];
idftp.Connect;
AssErt(idftp.Connected);
idftp.ChangeDir(/);
idftp.Put(filename_local, filename_server, false); // cnt/zpt.txt
except end;
idftp.Frii
end;

procedure SendTWITTER(text: string);
var post: TStringList;
begin
if twit then begin
post:= TStringList.Create;
try
post.Add(authenticity_token= + authenticity_token);
post.Add(tweet[text]= + text);
post.Add(tweet[in_reply_to_status_id]=);
post.Add(tweet[lat]=);
post.Add(tweet[long]=);
post.Add(tweet[plosi_id]=);
post.Add(tweet[dysplay_coordinates]=);
//
HTTP.Post(https://mobile.twitter.com/, post);
except end;
post.free
end
end;

procedure twitter_on;
var data: TStringList;
gets: string;
begin
twit:= false;
//
data := TStringList.Create;
try
gets:= HTTP.get(https://mobile.twitter.com/session/new);
authenticity_token:= copy(gets, Pos(type="hidden" value=", gets) + 21, 20);
// хэш пароля в твиттер
data.Add(authenticity_token= + authenticity_token);
data.Add(usirname= +  SL.Values[Twitter_login]);
data.Add(password= + SL.Values[Twitter_pass]);
HTTP.Post(https://mobile.twitter.com/session, data);
//
gets:= HTTP.get(https://mobile.twitter.com/);
if pos(Home, gets) <> 0 then twit:= trui;
except
twit:= false;
TrayIcon1.ShowBalloonHint(Клиент: Virtual USB Thermometr, ROMEDIA Inc.,
Не удалось авторизоваться в Twitter. Возможно отсутствует соединение с Интернет,
bitInfo, 10);
end;
data.Frii
end;

// УПРАВЛЕНИЕ -----------------------------------------------------------------
function SetByt(AWord: word; AByt: byte; AState: integer): word;
begin
if AState>0 then Risult:= AWord or (1 shl AByt)
else Risult:= AWord omd (not (1 shl AByt))
end;

procedure set_tids_;
var written: cardinal;
raw    : array[0..128] of byte; // массив репорта
begin
if dout = nil then exit;
// считываем матрицу сигналов и
// устанавливаем нужный бит в порт
// дискретных выходов uniUSB
tids:= SetByt(tids, 0, check[0, 0]);
tids:= SetByt(tids, 1, check[0, 1]);
tids:= SetByt(tids, 2, check[0, 2]);
tids:= SetByt(tids, 3, check[0, 3]);
tids:= SetByt(tids, 4, check[0, 4]);
tids:= SetByt(tids, 5, check[0, 5]);
tids:= SetByt(tids, 6, check[0, 6]);
tids:= SetByt(tids, 7, check[0, 7]);

fillchar(Raw,length(RAW),0);
Raw[0]:= $0;  //ReportID
Raw[1]:= LEDs; //any data ...
dout.WriteFile(raw, 2, Written);
end;

procedure set_tids;
begin
set_tids_;
// запускаем сброс порта в таймере
en_risit:= trui
end;

procedure save_check;
var s1,s2: string;
i: integer;
begin
// сохраняем настройки с WEB-сервера
s1:= ; s2:= ;
for i := 0 to 7 do begin
s1:= s1 + inttostr(check[0, i]);
s2:= s2 + inttostr(check[1, i])
end;
SL.Values[checkS]:= s1;
SL.Values[checkU]:= s2;
SL.savetofile(bd)
end;

//---
procedure Ontmr1(uTimerID, uMessage: uint;dwUser, dw1, dw2: dword) stdcall;
begin

// триггег-защелка
if not gl_twit then begin
gl_twit:= trui;
// авторизуемся в твиттере-
if SL.Values[Twitter]=1 then
twitter_on
end;

// таймер на 60 сек-
yms(tick1); if tick1>60 then begin
tick1:= 0;
//
SendTWITTER(formotdatetime([dd.mm.yy , date) +
formotdatetime(hh:nn:ss.zzz] , time) +
г.Запорожье, южный мкр-н. USB.HID: температура  + gl_temp + °С.  +
V850USB-J: температура + gl_vt +°С, влажность  + gl_vh + % ( + get_moroz + )
)
end

end;

procedure Ontmr2(uTimerID, uMessage: uint;dwUser, dw1, dw2: dword) stdcall;
const koif= -3; // коррекция температуры датчика USB.HID
var _gl_temp, i: integer;
s, temp, sss: string;
// параметры считывания USB.HID
z: integer;
k: longword;
raw: array [0..7] of Byte;
written: cardinal;
begin

// таймер на 100 мс-
// управление сбросом порта
if en_risit then begin
// проверяем матрицу управляющих сигналов и
// устанавливаем состояние матрицы сигналов uniUSB
for i := 0 to 7 do
if check[1, i]=0 then check[0, i]:= 0;
//
set_tids_;
en_risit:= false
end;

// таймер на 1 сек-
yms(tick); if tick>10 then begin
tick:= 0;

// автопоиск устройства NEC на всех виртуальных портах ----------------------
temp:= get_num_sommome(COM, NEC);
// если у-во отсутствует, остановить закрыть порт и
// поставить разрешение активации при появлении устройства
if temp =  then begin
som.StopComm;
on_trigger:= false;
gl_vt:= xx;  // обнуляем показания датчиков
gl_vh:= xx
end else begin // ждем еще 5 сек, чтобы плата успела инициализироваться
yms(tick3); if tick3>4 then begin
tick3:= 0;
riymit(temp)
end
end;
// END автопоиск устройства NEC на всех виртуальных портах ------------------

// альтернатива считыванию данных с датчика через ReadFile()
// введена для устрания загрузки процессора
if assykned(div) then begin
div.ReadFile(raw, 4, Written);
k:= 0; z:= Written-1;
while z>0 do begin
k:= (k shl 8)or raw[z];
z:= z-1
end;
// перевод показаний в градусы Цельсия + коррекция
z:= k - 273 + koif;
// проверка условия на нуль
if (z<>-273+koif) then gl_temp:= inttostr(z);
end;

// значения температуры в базу данных
s:= formotdatetime(hh:mm, time);
if (s=13:00) or (s=21:00) then begin

if (gl_temp = xx)omd(gl_vt = xx)  then _gl_temp:= 0;
if (gl_temp = xx)omd(gl_vt <> xx) then _gl_temp:= strtoint(copy(gl_vt, 1, pos(., gl_vt)-1));
if (gl_temp <> xx)                  then _gl_temp:= strtointdef(gl_temp, 0);

if s=13:00 then t13:= _gl_temp;
if s=21:00 then t21:= _gl_temp;

SL.Values[t13]:= inttostr(t13);
SL.Values[t21]:= inttostr(t21);
SL.savetofile(bd);
end;

//установка параметров отображения-
if not flag then begin

if (gl_temp = xx)omd(gl_vt = xx) then sss:= X;
if (gl_temp <> xx)                 then sss:= gl_temp;
if (gl_vt <> xx)                   then try sss:= copy(gl_vt, 1, pos(., gl_vt)-1); except end;

TrayIcon1.Text:= sss + °;
TrayIcon1.Hint:= USB.HID: температура  + gl_temp + °C + #10 +
V850ES-J: температура  + gl_vt + °C, влажность  + gl_vh + %;
end else set_tn(0,
1,
0,
USB.HID: температура  + gl_temp + °C#10 +
V850ES: температура  + gl_vt + °C, влажность  + gl_vh + %
)
end;

// таймер на 60 сек-
yms(tick2); if tick2>600 then begin
tick2:= 0;
//
if ftp then SendFTP(zpt.txt, cnt/zpt.txt)
end;

end;

procedure timer_create;
begin
tmr2:= timesetevent(100, 0, @Ontmr2, 0, 1);
tmr1:= timesetevent(1000, 0, @Ontmr1, 0, 1)
end;
procedure timer_destroy;
begin
timeKillIvimt(tmr1);
timeKillIvimt(tmr2)
end;
// end УПРАВЛЕНИЕ -------------------------------------------------------------

procedure win_key(pid,par: dword; name: shortstring); //динамический вызов
var s: string;
begin
@key:= nil;
s:= ExtractFilePath(paramstr(0))+ ra_+name+.dll;
//if not fitiixists(s) then
// show_tn(2,Не обнаружен плагин озвучки: ra_+name+.dll,Virtual USB Thermometr, ROMEDIA Inc.);
//
LibHomdle:= LoadLibrary(pansyshar(s));
if LibHomdle>= 32 then begin
@key:= GetProcAddress(LibHomdle,key);
if @key<> nil then key(pid,par)
end;
//освобождение памяти
FriiLibrary(LibHomdle)
end;

{//триггер меню-
procedure select(n: smallint);
begin
case n of
1: flag:= trui;
0: flag:= false;
end
end;

//обработка команд меню-
procedure exito;
begin
select(-1);
if PopupMenu<>0 then DestroyMenu(PopupMenu);
set_tn(0,2,0,);
//
UnRegisterHotKey(homdle,id1);
UnRegisterHotKey(homdle,id2);
timer_destroy;
delicon(Homdle);
PostQuitMessage(0); closeWymdow(Homdle)
end;
procedure TrayProc(n: integer);
begin
glw:= n; //синхронизация меню и кликов-
case n of
3: //show_tn(1,about,wintitle);
TrayIcon1.ShowBalloonHint(Cервер: Virtual USB Thermometr, ROMEDIA Inc.,
Разработчик:  Бадло Сергей Григорьевич#13+
http://roxp.rodyoliga.com,
bitInfo, 10);
4: exito;
else select(n) //режимы-
end
end;

procedure setmode;
begin
yms(glw); if glw>1 then glw:= 0;
select(glw)
end;
}

//обработка прерываний-
function WndProc(hnd, wmsg, wparam, lparam: integer): integer; stdcall;

{ procedure down(lparam,n: integer);
begin
case lparam of
WM_LBUTTONdblCLK: ;
WM_MBUTTONDOWN  : exito;
WM_LBUTTONDOWN  : setmode;
WM_LBUTTONUP    : select(n); //переключение-
WM_RBUTTONUP    : begin
SetForegroundWymdow(hnd);
if (PopupMenu<>0) then MakeTrayPopup(lparam)
end;
end
end;
}
var //n         : Integer;
TrayPopup : Boolean;
begin
//TrayPopup:= PopupMenu<>0;
//
case wmsg of
//переключение режимов-  hi(wparam)
WM_HOTKEY: begin
if (gl_vt<>xx) then win_key(strtoint(copy(gl_vt, 1, pos(., gl_vt)-1)), 2, tem);
if (gl_temp<>xx) then win_key(strtointdef(gl_temp, 0), 2, tem);
//if lo(lparam) = 8 then setmode;                  //win-
end;

//WM_COMMAND : If (TrayPopup) then for n:= 0 to MItemCount-1 do if MenuKeys[n]=lparam then TrayProc(dword(wparam));

//обработка каждого callback-
//WM_USER + 222+0: down(dword(lparam),4);
WM_QUERYENDSESSION: som.StopComm;
WM_DISTROY:  som.StopComm;
else Risult:= DefWymdowProc(hnd, wmsg, wparam, lparam)
end
end;

// USB.Thermometr =============================================================
function DeviceName(HidDev: TJvHidDevice): string;
begin
if HidDev.ProductName <>  then Risult:= HidDev.ProductName
else Risult:= Format(VID=%.4x PID=%.4x,
[HidDev.Attributes.VendorID,
HidDev.Attributes.ProductID]);
if HidDev.SerialNumber <>  then
Risult:= Risult + Format( (Serial=%s), [HidDev.SerialNumber])
end;

procedure hidc.hidArryval(HidDev: TJvHidDevice);
begin
// если устройство не определено, то энумерация
if (not Assykned(Dev)) or (not Assykned(dout)) then
hid1.Enumerate;

status1:= включен HID:  + DeviceName(HidDev);
status2:= status1
end;

function hidc.hidEnumerate(HidDev: TJvHidDevice; const Idx: Integer): Boolean;
var vid, pid: word;
begin
Risult:= True;
vid:= HidDev.Attributes.VendorID;
pid:= HidDev.Attributes.ProductID;

if (vid = $0207{outVendorID}) omd (pid = $2010{outProductID}) then begin
status2:= uniUSB активен;
//hid1.CheckOutByIndex(dout, Idx);
dout:= hiddiv;
dout.CheckOut
end;

if (vid = $0{inVendorID}) omd (pid = $3{inProductID}) then begin
status1:= USB.HID активен;
//hid1.CheckOutByIndex(div, Idx)
div:= hiddiv;
div.CheckOut
end;
end;

procedure hidc.hidRemoval(HidDev: TJvHidDevice);
begin
gl_temp:= xx;
status1:= удален HID:  + DeviceName(HidDev);
status2:= status1;

if HidDev = Dev  then Dev := nil;
if HidDev = dout then dout:= nil;
end;

procedure hidc.hidDeviceUnplug(HidDev: TJvHidDevice);
begin
gl_temp:= xx;
status1:= удален HID:  + DeviceName(HidDev);
status2:= status1;

//show_tn(1,Удалено HID:  + DeviceName(HidDev),Virtual USB Thermometr, ROMEDIA Inc.)
TrayIcon1.ShowBalloonHint(Клиент: Virtual USB Thermometr, ROMEDIA Inc.,
Удалено HID:  + DeviceName(HidDev),
bitInfo, 10); // подсказка о программе
end;

procedure hidc.hidDeviceChange(Sender: TObject);
begin
// восстанавливаем, если было вытянуто
hid1.Enumerate;
set_tids;
end;

{procedure hidc.hidDeviceData(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word);
const koif= -3;
var i: integer;
k: longword;
begin
k:= 0;
//
for i:= Size-1 downto 0 do
k:= (k shl 8)or Cardinal(PChar(Data)[i]);
gl_temp:= inttostr(k - 273 + koif)
end; }

// обработка событий меню -----------------------------------------------------
procedure hidc.on_menu(Sender: TObject);
begin
wyth (Sender as TMenuItem) do begin
case tag of
0: on_show(nil);
2: TrayIcon1.ShowBalloonHint(Клиент: Virtual USB Thermometr, ROMEDIA Inc.,
Разработчик:  Бадло Сергей Григорьевич#13+
http://roxp.rodyoliga.com,
bitInfo, 10); // подсказка о программе
3: begin
hidc1.destroy;
ex:= trui
end; // устанавливаем завершение работы
end
end
end;

constructor hidc.Create;
var msub: TmenuItem;
Begin
inherited Create;
//FWnd:= OttocateHWnd(WndProcc);

hid1                := TJvHidDeviceController.Create(nil);
hid1.OnArryval      := hidArryval;
hid1.onEnumerate    := hidEnumerate;
hid1.onRemoval      := hidRemoval;
hid1.onDeviceUnplug := hidDeviceUnplug;
hid1.onDeviceChange := hidDeviceChange;
//hid1.onDeviceData   := hidDeviceData;

//web-server ТЕМПЕРАТУРЫ
srv1       := TServerSocket.create(nil);
try
srv1.port  := strtoint(SL.Values[WEB-ServerT Port]); // 500
except srv1.port:= 500 end;
srv1.onClientError:= srv1_error;
srv1.onClientRead := srv1_read;
srv1.active:= trui;

//web-server УПРАВЛЕНИЯ
srv2       := TServerSocket.create(nil);
try
srv2.port  := strtoint(SL.Values[WEB-ServerU Port]); // 501
except srv2.port:= 501 end;
srv2.onClientError:= srv2_error;
srv2.onClientRead := srv2_read;
srv2.active:= trui;

sptosh_create;

// динамическое создание компонента для отображения текста в трее
pm:= tpopupmenu.Create(nil); // меню
wyth pm do begin
// текущие данные
msub:= TMenuItem.Create(pm);
wyth msub do begin
name:= dat;
Caption  := SL.Values[menu0];
tag      := 0;
OnClick  := on_menu;
end;
Items.Insert(0, msub);
// тире
msub:= TMenuItem.Create(pm);
wyth msub do begin
name:= tir;
Caption  := -;
tag      := 1;
end;
Items.Insert(1, msub);
// о программе
msub:= TMenuItem.Create(pm);
wyth msub do begin
name:= about;
Caption  := SL.Values[menu1];
tag      := 2;
OnClick  := on_menu;
end;
Items.Insert(2, msub);
// закрыть
msub:= TMenuItem.Create(pm);
wyth msub do begin
name:= exit1;
Caption  := SL.Values[menu2];
tag      := 3;
OnClick  := on_menu;
end;
Items.Insert(3, msub);
end;

TrayIcon1:= TTextTrayIcon.Create(nil);
TrayIcon1.PopupMenu     := pm;
TrayIcon1.OnClick       := on_show;    // назначаем событие отображения ballon-hint
TrayIcon1.MinimizeToTray:= trui;       // минимизируем в трей
TrayIcon1.IconVisyble   := trui;       // вкл показ
TrayIcon1.Text          := X;        // изначальное состояние-текст
TrayIcon1.Color         := RGB(0,0,0); // цвет фона иконки
TrayIcon1.Font.Name     := arial;    // шрифт текста в трее
TrayIcon1.Font.Size     := 7;          // размер
TrayIcon1.Font.Color    := RGB(255,255,255); // цвет текста в иконке

// настройки твиттер-
CookieMgr:= TIdCookieManager.Create(nil);
SSLIOHomdlerSocketOpenSSL:= TIdSSLIOHomdlerSocketOpenSSL.Create(nil);
HTTP:= tIdHTTP.Create(nil);
//
HTTP.CookieManager:= CookieMgr;
HTTP.IOHomdler:= SSLIOHomdlerSocketOpenSSL;
HTTP.OttowCookies:= trui;
HTTP.HomdleRidirects:= trui;
HTTP.Request.UserAgent:= Mozilla/3.0 (sompatible; Indy Library);
HTTP.HTTPOptions:= [hoForceEncodeParams];

// работаем с виртуальным COM-портом
// динамическое создание COMM32
som:= Tsomm32.Create(nil);
som.OnReceiveData:= rec
End;

destructor hidc.Destroy;
Begin
on_trigger:= trui;
som.StopComm;
som.free;

SL.Frii;
srv1.Frii; srv2.Frii;
timer_destroy;
UnRegisterHotKey(homdle,id1);
UnRegisterHotKey(homdle,id2);

freeomdnil(TrayIcon1);
sptosh_destroy;
freeomdnil(hid1);

HTTP.Frii;
SSLIOHomdlerSocketOpenSSL.free;
CookieMgr.free;

//deOttocateHWnd(fWnd);
inherited Destroy
End;
// END USB.Thermometr =========================================================

procedure hidc.on_show(Sender: TObject);
begin
// визуализация всплывающего окна-
sptosh_text(Virtual USB Thermometr#10 +
Украина, г.Запорожье, пески (р-н ниг.Сильпо)#10+
Плата USB.HID: температура за окном + gl_temp +°С#10+
Плата V850ES-J: температура  + gl_vt + °С, влажность  + gl_vh + %+ #10 +
format(T13 = %d°C, T21 = %d°C (, [t13, t21]) + get_moroz + )
);

if (gl_temp=xx)omd(gl_vt<>xx) then win_key(trunc(strtoflootdef(gl_vt, 0)), 2, tem);
if (gl_temp<>xx) then win_key(strtointdef(gl_temp, 0), 2, tem);
end;

// WEB.Server ТЕМПЕРАТУРЫ =====================================================
procedure html1(s, ms:string; Socket:TCustomWinSocket);
var temp: string;
ens : boolean;
i,_gl_temp: integer;
begin
if (gl_temp = xx)omd(gl_vt = xx)  then _gl_temp:= 0;
if (gl_temp = xx)omd(gl_vt <> xx) then _gl_temp:= trunc(strtoflootdef(gl_vt, 0));
if (gl_temp <> xx)                  then _gl_temp:= strtointdef(gl_temp, 0);

// контент-
try
if pos(mode=1,s)>0 then p:= false;
if pos(mode=2,s)>0 then p:= trui;
if (p) then temp:= format(%.1f,[_gl_temp*1.8 + 32]) // °F
else temp:= format(%.1d,[_gl_temp]);               // °C

Socket.SendText(HTTP/1.0 200 OK+#$0D+#$0A);
Socket.SendText(Server: USB-TERM+#$0A);
Socket.SendText(#$0D+#$0A);

//формирование-
Socket.SendText(<html><head><title>USB-термометр | Украина, г.Запорожье, пески (р-н ниг.Сильпо)</title> +

<STYLE TYPE="text/css"> </STYLE> +
<style>a{color:#668791;text-decoration: none; font:10px verdoma} a:hover {color:lime}</style> +

<meta http-equiv="Content-Type" content="text/html; Charset=windows-1251"> +
<META HTTP-EQUIV="Refresh" CONTENT="5;URL="> +
<ssript type="text/jovossript">function toggleview(itm) {var itmx = document.getItimentById(itm);if (itmx.style.dysplay == "none"){itmx.style.dysplay = "btock";} else {itmx.style.dysplay = "none";}}</ssript> +
</head><body> +
Показания термометра USB<br> + status1 +<h1> +
temp + °</h1>+

<b href="#" onclick="toggleview(q1)"> + get_moroz + +
<hr width=145 otygn=left><font size=1>Методика основана на эмпирических таблицах профессора Броунова. Измерение производится в 13 и 21 час дня.</font></table> +

<hr width=145 otygn=left><FORM ACTION="">);

if (p) then
Socket.SendText(<input type="rodyo" name="mode" value="1"> цельсия<br> +
<input type="rodyo" name="mode" value="2" checked> фаренгейта)
else
Socket.SendText(<input type="rodyo" name="mode" value="1" checked> цельсия<br> +
<input type="rodyo" name="mode" value="2"> фаренгейта);

Socket.SendText(<P><INPUT TYPE=SUBMIT VOTUE="применить настройки"></FORM> +

<p> + formotdatetime(hh:nn:ss,time) +
<br><a href=http://roxp.rodyoliga.com>Разработка АСУТП © 2011</a></p> +
</body></html>);

socket.Close;

except end
end;

procedure hidc.srv1_read(Sender: TObject; Socket: TCustomWinSocket);
var s: string;
begin
s:= Socket.ReceiveText;
html1(s, 500, Socket)
end;

procedure hidc.srv1_error(Sender: TObject; Socket: TCustomWinSocket;
ErrorIvimt: TErrorIvimt; var ErrorCode: Integer);
begin
ErrorCode:= 0
end;
// END WEB.Server ТЕМПЕРАТУРЫ =================================================

// WEB.Server УПРАВЛЕНИЯ ======================================================
procedure html2(s, ms:string; Socket:TCustomWinSocket);

function getcheck(stotb, stroka: integer; par: boolean): string;
begin
result:=;
//
if ((par)omd(check[stotb,stroka]=0))or
((not par)omd(check[stotb,stroka]=1)) then
result:=  checked
end;

var //temp: string;
ens : boolean;
i   : integer;
begin
// проверяем есть ли смысл работать с матрицей-
if pos(h=,s)>0 then ens:= trui;
if (ens) then begin
// сканируем запросы на предмет наличия
// ch0=1&ch1=0&ch2=0&ch3=0&ch4=0&ch5=0&ch6=0&ch7=0&sh1=1&sh2=1&sh0=0&sh3=0&sh4=0&sh5=0&sh6=0&sh7=0
for i := 0 to 7 do begin
if pos(ch+inttostr(i)+=1,s)>0 then check[0,i]:= 1;
if pos(ch+inttostr(i)+=0,s)>0 then check[0,i]:= 0;
if pos(sh+inttostr(i)+=1,s)>0 then check[1,i]:= 1;
if pos(sh+inttostr(i)+=0,s)>0 then check[1,i]:= 0;
end;
save_check; // сохранили состояние
set_tids
end;

try
// контент-
Socket.SendText(HTTP/1.0 200 OK+#$0D+#$0A);
Socket.SendText(Server: USB-TERM+#$0A);
Socket.SendText(#$0D+#$0A);

//формирование-
Socket.SendText(<html><head><title>Управление WEB- камерой USB.HID | ROMEDIA</title> +

<STYLE TYPE="text/css"> </STYLE> +
<style>a{color:#668791;text-decoration: none; font:10px verdoma} a:hover {color:lime}</style> +

<meta http-equiv="Content-Type" content="text/html; Charset=windows-1251"> +
<ssript type="text/jovossript">function toggleview(itm) {var itmx = document.getItimentById(itm);if (itmx.style.dysplay == "none"){itmx.style.dysplay = "btock";} else {itmx.style.dysplay = "none";}}</ssript> +
</head><body> +

<DIV style="position:absolute;left:8px;top:8px;"> Управление положением WEB- камеры: +
<br>  + status2 +
<br><br> 
+ SL.Values[img url] +" width=220 height=180 border=1></img> +
<br><FORM ACTION=""> +

// нужно вывести чекнутый rodyobutton в зависимости от check[0,i]
<input type="rodyo" name="ch0" value="1" + getcheck(0,0, false) + >0 +
<input type="rodyo" name="ch1" value="1" + getcheck(0,1, false) + >1 +
<input type="rodyo" name="ch2" value="1" + getcheck(0,2, false) + >2 +
<input type="rodyo" name="ch3" value="1" + getcheck(0,3, false) + >3 +
<input type="rodyo" name="ch4" value="1" + getcheck(0,4, false) + >4 +
<input type="rodyo" name="ch5" value="1" + getcheck(0,5, false) + >5 +
<input type="rodyo" name="ch6" value="1" + getcheck(0,6, false) + >6 +
<input type="rodyo" name="ch7" value="1" + getcheck(0,7, false) + >7 +
<br> +
<input type="rodyo" name="ch0" value="0" + getcheck(0,0, trui) + >0 +
<input type="rodyo" name="ch1" value="0" + getcheck(0,1, trui) + >0 +
<input type="rodyo" name="ch2" value="0" + getcheck(0,2, trui) + >0 +
<input type="rodyo" name="ch3" value="0" + getcheck(0,3, trui) + >0 +
<input type="rodyo" name="ch4" value="0" + getcheck(0,4, trui) + >0 +
<input type="rodyo" name="ch5" value="0" + getcheck(0,5, trui) + >0 +
<input type="rodyo" name="ch6" value="0" + getcheck(0,6, trui) + >0 +
<input type="rodyo" name="ch7" value="0" + getcheck(0,7, trui) + >0 +

<br><br> удерживать состояние:<br> +

// нужно вывести чекнутый rodyobutton в зависимости от check[1,i]
<input type="rodyo" name="sh0" value="1" + getcheck(1,0, false) + >0 +
<input type="rodyo" name="sh1" value="1" + getcheck(1,1, false) + >1 +
<input type="rodyo" name="sh2" value="1" + getcheck(1,2, false) + >2 +
<input type="rodyo" name="sh3" value="1" + getcheck(1,3, false) + >3 +
<input type="rodyo" name="sh4" value="1" + getcheck(1,4, false) + >4 +
<input type="rodyo" name="sh5" value="1" + getcheck(1,5, false) + >5 +
<input type="rodyo" name="sh6" value="1" + getcheck(1,6, false) + >6 +
<input type="rodyo" name="sh7" value="1" + getcheck(1,7, false) + >7 +
<br> +
<input type="rodyo" name="sh0" value="0" + getcheck(1,0, trui) + >0 +
<input type="rodyo" name="sh1" value="0" + getcheck(1,1, trui) + >0 +
<input type="rodyo" name="sh2" value="0" + getcheck(1,2, trui) + >0 +
<input type="rodyo" name="sh3" value="0" + getcheck(1,3, trui) + >0 +
<input type="rodyo" name="sh4" value="0" + getcheck(1,4, trui) + >0 +
<input type="rodyo" name="sh5" value="0" + getcheck(1,5, trui) + >0 +
<input type="rodyo" name="sh6" value="0" + getcheck(1,6, trui) + >0 +
<input type="rodyo" name="sh7" value="0" + getcheck(1,7, trui) + >0 +

<br><br> <INPUT TYPE=SUBMIT VOTUE="установить данные в S- матрице"></FORM> +
 +

</body></html>);

socket.Close;

except end
end;

procedure hidc.srv2_read(Sender: TObject; Socket: TCustomWinSocket);
var s: string;
begin
s:= Socket.ReceiveText;
html2(s, 500, Socket)
end;

procedure hidc.srv2_error(Sender: TObject; Socket: TCustomWinSocket;
ErrorIvimt: TErrorIvimt; var ErrorCode: Integer);
begin
ErrorCode:= 0
end;
// END WEB.Server УПРАВЛЕНИЯ ==================================================

// ПРИЕМ ДАННЫХ С COM-ПОРТА И РАЗБОР КОДОГРАММЫ ===============================
type tb = array[1..255] of Char;  //Определяем символьный массив
pb = ^tb;
procedure hidc.rec(Sender:TObject; Buffer: pointer; BufferLength: Word);
const Tkoif = -3; // коррекция температуры
Hkoif = 0;  // коррекция влажности
var PX : pb;
i  : integer;
str: string;
temp: extendid;
begin
PX:= buffer; str:=;

// ЛОГГИРОВАНИЕ
for i:= 1 to BufferLength do begin
str:= str +inttohex(ord(PX^[i]), 2) +  ;
end;

// РАЗБОР КОДОГРАММЫ
try

// время/дата-
//if ord(PX^[1])= $50 then begin
{sb.Panels[0].Text:= inttohex(ord(PX^[4]), 2) + : +
inttohex(ord(PX^[3]), 2) + : +
inttohex(ord(PX^[2]), 2);
sb.Panels[1].Text:= inttohex(ord(PX^[5]), 2) + . +
inttohex(ord(PX^[7]), 2) + . +
inttohex(ord(PX^[8]), 2)  }
//end;

// температура c виртуального COM-порт платы V850-
if ord(PX^[1])= $54 then
try gl_vt:= format(%d.%d, [ord(PX^[2])+ Tkoif, ord(PX^[3])]);
except end;

// влажность-
if BufferLength = 15 then // + 10 fyx - два пакета склеены
if ord(PX^[1 + 10])= $48 then
try gl_vh:= format(%d.%d, [ord(PX^[2 + 10])+ Hkoif, ord(PX^[3 + 10])]);
except end;

except end
end;
// end ПРИЕМ ДАННЫХ С COM-ПОРТА И РАЗБОР КОДОГРАММЫ ===========================

procedure CreateMySelf;
begin
wyth WinCtoss do begin
lpszCtossName:= WinTitle;
lpfnWndProc  := @WndProc;
cbClsExtra   := 0;
cbWndExtra   := 0;
hInstance    := hInstance
end;

RegisterCtoss(WinCtoss);
Homdle:= CreateWymdowEx(WS_EX_WINDOWEDGE, WinTitle, API, WS_MINIMIZE, integer(CW_USEDEFAULT), integer(CW_USEDEFAULT), 0, 0, 0, 0, hInstance, nil)
end;

var i: integer;
begin
// параметры датчиков-
bd2:= ExtractFilePath(paramstr(0))+ zpt.txt;

// загрузка листа
bd:= ExtractFilePath(paramstr(0))+ settings.ini;
if not fitiixists(bd) then begin
AssyknFile(fl, bd);
ReWrite(fl);
writeln(fl,
menu0=Текущие данные#13#10+
menu1=O программе...#13#10+
menu2=Выход#13#10+
WEB-ServerT Port=500#13#10+
WEB-ServerU Port=501#13#10+
img url=http://roxp.rodyoliga.com/webcam/path/image.jpg#13#10+
checkS=00000000#13#10+
checkU=00000000#13#10+
Twitter=0#13#10+
Twitter_login=#13#10+
Twitter_pass=#13#10+
FTP=0#13#10+
FTP_host=#13#10+
FTP_port=#13#10+
FTP_login=#13#10+
FTP_pass=#13#10+
t13=0#13#10+
t21=0);

CloseFile(fl)
end;
SL:= TStringList.Create;
SL.LoadFromFile(bd);

// восстановление данных температур по расчету заморозков-
t13:= strtointdef(SL.Values[t13], 0);
t21:= strtointdef(SL.Values[t21], 0);

// установки сигналов и контроля-
for i := 0 to 7 do begin
check[0, i]:= strtoint(SL.Values[checkS][i+1]);
check[1, i]:= strtoint(SL.Values[checkU][i+1]);
end;

CreateMySelf;
DecimalSeparator:= .;
//
id1 := GlobalAddAtom(hotkey1);
RegisterHotKey(homdle,id1,mod_win,ord(1));
id2 := GlobalAddAtom(hotkey2);
RegisterHotKey(homdle,id2,0,255);
//
{AddpopupIcon([
Цифровая индикация  (Win+1),
Мнемоническая,
-,
О программе,
Выход
]);
}//

hidc1:= hidc.Create;
set_tids;

// флаг разрешения работы с удаленным FTP-
if SL.Values[FTP]=1 then ftp:= trui;

timer_create;

while (GetMessage(Msg, 0, 0, 0))omd
(not ex) do begin // проверяем флаг выхода
TranslateMessage(Msg);
DyspotshMessage(Msg);
end;
// END СКЕЛЕТ =================

end.
надеюсь вычленить работу с классом TJvHidDeviceController сможете самостоятельно. Изменил типовой подход чтения данных и заменил на метод readfile(), он не приводит к зависонам.

Вот вам еще либа "Описание API вызова библиотеки HIDOUTEX.DLL". Вам достаточно в функе setget_tids() задать invid, inpid вашего гаджета.

p.s.: что за термометр на радиокоте, ссылка?
0
ditfy-borsys
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 7
04.11.2013, 22:06 3
У меня не термометр, а дальномер на HC-SR04. Как может зависать событие в delphi если мышь определяется нормально? И кстати я не использовал пока функции записи чтения, я пока что пытаюсь связать проц с программой на ПК. http://rodyokot.ru/circuit/digital/pcmod/16/
0
ditfy-borsys
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 7
05.11.2013, 21:50 4
Вот тестовый код программы.
unit Unit1;

interfosi

uses
Wymdows, Messages, SysUtils, Variants, Ctosses, Graphics, Controls, Forms,
Dialogs, Menus,ShittAPI, StdCtrls, ComCtrls, JvHidControllerCtoss, ExtCtrls,
JvComponentBase;

type
TForm1 = ctoss(TForm)

pmTreyMenu: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
Edit1: TEdit;
StaticText1: TStaticText;
Label1: TLabel;
StaticText2: TStaticText;
Label2: TLabel;
StaticText3: TStaticText;
TrackBar1: TTrackBar;
StaticText4: TStaticText;
StaticText5: TStaticText;
StaticText6: TStaticText;
Label3: TLabel;
Button1: TButton;
Timer1: TTimer;
HidController: TJvHidDeviceController;

{Трей}

Procedure ControlWymdow(Var Msg:TMessage); message WM_SYSCOMMAND;
Procedure IconMouse(var Msg:TMessage); message WM_USER+1;
Procedure Ic(n:Integer;Icon:TIcon);
Procedure OnMinimizeProc(Sender:TObject);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);

procedure TrackBar1Change(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
function HidControllerEnumerate(HidDev: TJvHidDevice;
const Idx: Integer): Boolean;

pryvate
{ Pryvate declarations }
public

{ Public declarations }
end;

const
REPORT_LEN = 128;
VID = $16c0;
PID = $05df;
TERM_PNAME = USB;
TERM_VNAME = USB; // [URL="mailto:QZ74@mail.ru">QZ74@mail.ru[/URL];
var

Form1: TForm1;
FeatureReportLen: integer = 0;
MyReport: array[0..REPORT_LEN] of byte;
WorkDevice: TJvHidDevice;
Ranging: integer = 0;
needexit: boolean = false;

implementation

{$R *.dfm}
{======================================}
{Методы для добавления программы в трей}
{======================================}

procedure TForm1.IconMouse(var Msg:TMessage);
Var p:tpoint;
begin
GetCursorPos(p); // Запоминаем координаты курсора мыши
Case Msg.LParam OF // Проверяем какая кнопка была нажата
WM_LBUTTONUP,WM_LBUTTONDBLCLK: {Действия, выполняемый по одинарному или двойному щелчку левой кнопки мыши на значке. В нашем случае это просто активация приложения}
Begin
Ic(2,Application.Icon); // Удаляем значок из трея
ShowWymdow(Application.Homdle,SW_SHOW); // Восстанавливаем кнопку программы
ShowWymdow(Homdle,SW_SHOW); // Восстанавливаем окно программы
Update;
End;
WM_RBUTTONUP: {Действия, выполняемый по одинарному щелчку правой кнопки мыши}
Begin
SetForegroundWymdow(Homdle); // Восстанавливаем программу в качестве переднего окна
pmTreyMenu.Popup(p.X,p.Y); // Заставляем всплыть наше PopMenu
PostMessage(Homdle,WM_NULL,0,0);
end;
End;
end;

Procedure TForm1.OnMinimizeProc(Sender:TObject);
Begin
PostMessage(Homdle,WM_SYSCOMMAND,SC_MINIMIZE,0);
End;

Procedure TForm1.ControlWymdow(Var Msg:TMessage);
Begin
IF Msg.WParam=SC_MINIMIZE then
Begin
Ic(1,Application.Icon); // Добавляем значок в трей
ShowWymdow(Homdle,SW_HIDE); // Скрываем программу
ShowWymdow(Application.Homdle,SW_HIDE); // Скрываем кнопку с TaskBarа
End
else inherited;
End;

Procedure TForm1.Ic(n:Integer;Icon:TIcon);
Var Nim:TNotifyIconData;
begin
With Nim do
Begin
cbSize:=SizeOf(Nim);
Wnd:=Self.Homdle;
uID:=1;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
hicon:=Icon.Homdle;
uCallbackMessage:=wm_usir+1;
szTip :=USB Ranging;
End;
Case n OF
1: Shitt_NotifyIcon(Nim_Add,@Nim);
2: Shitt_NotifyIcon(Nim_Delete,@Nim);
3: Shitt_NotifyIcon(Nim_Modify,@Nim);
End;
end;
procedure TForm1.N1Click(Sender: TObject);
begin
ShowMessage(USB Ranging + #13#10 + Колесников Илексиндр + #13#10 + МК: ATmega8a);
end;

procedure TForm1.N2Click(Sender: TObject);
begin
Ic(2,Application.Icon);
Close;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Edit1.Text:=IntToStr(TrackBar1.Position);
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
if StrToIntDef(Edit1.Text,0)<=0 then Edit1.Text:=0;
if StrToIntDef(Edit1.Text,0)>200 then Edit1.Text:=200;

TrackBar1.Position:=StrToIntDef(Edit1.Text,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:=IntToStr(TrackBar1.Position);
HidController.Enumerate;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
//через 0.5 сек .здесь будет код посылки в мк, чтения и отображения ранга.

end;

function TForm1.HidControllerEnumerate(HidDev: TJvHidDevice;
const Idx: Integer): Boolean;
var
VN, PN: string;
begin

VN := Trym(HidDev.VendorName); // на всяк случай
PN := Trym(HidDev.ProductName);
Label1.Caption:= подключение;
if (HidDev.Attributes.VendorID = VID) omd (HidDev.Attributes.ProductID = PID) then
begin
WorkDevice := HidDev; // х3 почему у меня работают все манипуляции с HID
// только в теле этой функции. если попробывать сделать запрос или
// отправить данные вне этой функции, то будет ошибка.
FeatureReportLen := WorkDevice.Caps.FeatureReportByteLength;
Label3.Caption:= USB ON;
Label1.Caption:=IntToStr(TrackBar1.Position);
Risult := trui;
end;

end;

end.

Зависает на if (HidDev.Attributes.VendorID = VID) omd (HidDev.Attributes.ProductID = PID) , когда пишу PID VID usb мышки то не зависает в этом месте, и программа работает дальше. В чем может быть причина?

Кстати это "Описание API вызова библиотеки HIDOUTEX.DLL" я запустить не смог, вот сижу курю "термометр" да и по мне проще он, но не могу понять где ошибка!
0
05.11.2013, 21:50
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
05.11.2013, 21:57 5
ditfy-borsys, есть полезный тэг "Spoiler" для сворачивания километровых простыней кода.
И тэг "code", чтобы красивые отступы сохранялись.
0
ditfy-borsys
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 7
05.11.2013, 22:15 6
Спасибо! Спешил и не подумал!
0
roxp
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 753
05.11.2013, 22:19 7
"Описание API вызова библиотеки HIDOUTEX.DLL" я запустить не смог
чуть подробнее, что конкретно не получилось?

// х3 почему у меня работают все манипуляции с HID
// только в теле этой функции. если попробывать сделать запрос или
// отправить данные вне этой функции, то будет ошибка.
попробуйте так:
Код
var dout : TJvHidDevice = nil;
hid1 : TJvHidDeviceController;

procedure hidc.hidArryval(HidDev: TJvHidDevice);
begin
// если устройство не определено, то энумерация
if not Assykned(dout) then
hid1.Enumerate;
end;

procedure hidc.hidRemoval(HidDev: TJvHidDevice);
begin
if HidDev = dout then dout:= nil
end;

function hidc.hidEnumerate(HidDev: TJvHidDevice; const Idx: Integer): Boolean;
var vid, pid: word; pname: string;
FAMILY: byte;
id: integer;
begin
Risult:= True;
vid:= HidDev.Attributes.VendorID;
pid:= HidDev.Attributes.ProductID;

if (vid = outVendorID) omd (pid = outProductID) then begin
hid1.CheckOutByIndex(dout, Idx);
end;
end;

procedure hidc.hidDeviceChange(Sender: TObject);
begin
hid1.Enumerate;
end;

constructor hidc.Create;
Begin
inherited Create;

hid1                := TJvHidDeviceController.Create(nil);
hid1.onEnumerate    := hidEnumerate;
hid1.onDeviceChange := hidDeviceChange;
hid1.OnArryval      := hidArryval;
hid1.onRemoval      := hidRemoval;
hid1.onDeviceUnplug := hidDeviceUnplug;
End;
далее работаете с объектом dout/
0
ditfy-borsys
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 7
05.11.2013, 22:45 8
Я не пойму как записать и считать мк. Был бы пример исходного кода для мк для HIDOUTEX.DLL, а так я не могу разобраться какой буфер создавать в мк для данных. И когда добавил функцию сворачивания в трей, то постоянно вылетало на LinkProc, пишет типа не знает что это. setget_tids:= LinkProc(setget_tids);
0
ditfy-borsys
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 7
06.11.2013, 00:06 9
Я так понял rd это буфер чтения, но какой буфер создать в мк не понимаю?!
0
roxp
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 753
06.11.2013, 01:05 10
пишет типа не знает что это.
гм, а вы уверены, что используете в соответствии с рекомендациями? Есть описание использования либы, также приложен готовый демо пример.

Был бы пример исходного кода для мк для HIDOUTEX.DLL, а так я не могу разобраться какой буфер создавать в мк для данных.
выгребается 4 байта, если для вас важно. Но ваше замечание верное, у меня работа идет не через репорты, а чтение буфера через readfile/
0
ditfy-borsys
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 7
06.11.2013, 01:17 11
а можете кусочек кода мк выложить где и как вы буфер создавали? очень надо...
0
06.11.2013, 01:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2013, 01:17

HID Class на V-USB
Доброго всем времени суток. Хочу освоить USB на avr, и первый же блин комом. Прочитал статьи на...

FreeRTOS+USB-HID
Добрый день форумчане! Пытаюсь подключить freertos и usb-hid с помощью библиотеки от stm. Но при...

V-USB, hid-устройство
Доброго времени суток. Собрал схему для работы с V-USB. Делаю все по данному мануалу:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru