Sunteți pe pagina 1din 13

Conecta tus proyectos al puerto

USB
ELECTRNICA / HARDWARE

etiquetas: hardware, tutoriales


HTTP://WWW.NEOTEO.COM/CONECTA-TUS-PROYECTOS-AL-PUERTO-USB/

El puerto serie y el puerto paralelo ya quedaron atrs. Con la superpoblacin de ordenadores


porttiles, el espacio de accin de los enlaces por puerto serie comienza a reducirse. Lo mismo
ocurre con las conexiones por puerto paralelo. Ya ni siquiera los ordenadores de mesa traen un
puerto de este tipo utilizado antiguamente para las impresoras. Hoy todo trae conectividad USB. El
mouse, el teclado, la impresora multifuncin, el telfono mvil, el pen drive, el disco duro porttil, el
Blu-ray Player, el mdem, el router, todo se conecta a travs de un puerto USB. En este artculo
veremos la manera ms sencilla de realizar un circuito con un microcontrolador, encender y apagar
un LED desde nuestro ordenador porttil, en una aplicacin hecha por ti mismo a travs del
puerto USB. Conctate.
Las antiguas conexiones de puerto serie o paralelo permitan velocidades de transferencia de datos
de hasta 115 kbps., mientras que una conexin USB 1.1 alcanza los 1.2 Mbps. y una USB 2.0 logra
480 Mbps. Sin contar con la sencillez que supone utilizar un nico tipo de conector para todos los
perifricos necesarios, la posibilidad de conectar y desconectar sin tener que reiniciar el ordenador
a cada cambio de equipo es una ventaja que ha llevado al trabajo mvil hasta su mximo potencial.
Disponer de instrumentos de campo o de equipos porttiles que permitan monitorear el clima en el
lugar de los hechos es, gracias al ordenador mvil, un avance que complementado con la practicidad
de los puertos USB se ha ganado la preferencia de la mayora de los usuarios. Es hora entonces que
comiences a transitar el camino de las aplicaciones basadas en conectividad USB.
El programa Proton Development Suite posee entre sus herramientas ms importantes la que
conocemos como EasyHID USB Wizard. Esta prestacin se encarga de manera automtica de
generar los programas necesarios para poder utilizar los microcontroladores de la lnea PIC
18F2455, 18F2550, 18F4455 y 18F4550, que ser el que utilizaremos para nuestro ejemplo. El
cdigo para el PIC, lo genera tanto para Pic Basic Pro como para Proton, mientras que para el
ordenador, se encarga de generar el cdigo en Borland Delphi, Visual C++ y Visual Basic. Por
supuesto que todos estos parmetros se pueden seleccionar mientras se avanza en la preparacin
del software. En apenas muy pocos pasos, ya podemos tener una aplicacin HID USB lista para
comenzar a cargarla de cdigo. Tanto desde elMicrocode Studio Plus como desde Proton
Development Suite, al iniciar la aplicacin, nos encontraremos con pantallas a las que les iremos
cargando los datos que el sistema nos vaya pidiendo.

En la primer pantalla puedes cargar el nombre del producto que ests desarrollando

No cambies los nmeros de la segunda pantalla, utiliza los que aparecen de muestra
Como a este sistema lo estamos preparando para manejar y operar el receptor multibanda NeoTeo,
los datos que le agregaremos estarn en coincidencia con esta aplicacin. De all surgen los
nombres que ves en las imgenes. Aqu, en esta pequea gua, slo te daremos un ejemplo prctico
para que te vayas familiarizando con el sistema y sus pequeos secretos para lograr una conexin
exitosa. Las pantallas que comiencen a aparecer son las que ves en imagen; t les colocars el
nombre de la aplicacin que ms desees. Lo que NO debes cambiar en la segunda pantalla son los
nmeros deVendor ID y Product ID. Estos nmeros son asignados por el organismo que regula la
autenticidad de los productos USB donde puedes comprar por U$S 4mil una membresa anual con
nmeros otorgados exclusivamente a tu desarrollo. Por lo tanto, nuestro consejo es que utilices los
nmeros de muestra que provee la aplicacin para los proyectos domsticos que realices.

En las primeras aplicaciones te recomendamos utilizar los parmetros preestablecidos

Pantalla final de seleccin de PIC y destino de carpetas


Luego avanzas a la pantalla que te permite ajustar los valores de tiempo en que el ordenador
controlar la existencia de la conexin USB (Polling). Este punto es muy importante porque el
ordenador interrogar por el enlace y, si no lo encuentra (Atached), te expulsar la conexin y
quedars inactivo (Dettached). Esta accin de comprobacin puede ser realizada en forma constante
mediante una interrupcin con un Timer (TMR1) del microcontrolador o a travs de un programa
organizado y estructurado de manera apropiada dentro del PIC. El tamao de los Buffers de entrada
y salida quedar en 8 bytes. Hasta que no logres tener buena prctica en la realizacin de esta clase
de aplicaciones, te recomendamos utilizar siempre los valores indicados por default. Son ms que
suficientes para las aplicaciones a nivel inicial como la que haremos en esta entrega.

En la pantalla siguiente puedes seleccionar el lugar donde guardars los archivos que se cargarn
en dos carpetas individuales: una para el programa base del microcontrolador y otra para el
software de aplicacin que utilizars en el ordenador. Siempre trata de buscar una locacin de
nombre corto que se encuentre cercana al rbol raz del disco duro porque con nombres extensos
el compilador puede generar errores al armar los programas. Debajo de la seleccin del PIC,
tienes un casillero para habilitar la generacin automtica de un programa manejado con
interrupciones que mantengan viva la conexin USB durante todo el tiempo que ests conectado.
Como puedes ver, no tendrs que preocuparte por realizar un programa con los tiempos bien
ajustados. Listo, eso es todo. A la siguiente pantalla, el sistema comenzar a organizar y armar el
cdigo; t slo debes esperar a que termine su trabajo sin errores.

Una vez que hayas realizado estos cinco sencillos pasos, tendrs los programas listos para
comenzar a trabajar. Lo primero que debes hacer es definir el tipo de hardware que
utilizars alrededor del microcontrolador seleccionado y en funcin de l organizar todo el resto de
la aplicacin. Es decir, en este caso, slo colocaremos un pulsador y un LED como componentes
adicionales y un LCD de 16 caracteres y dos lneas. Adems de definir el hardware que utilizars,
tambin aqu se define la idea bsica del software que crears para utilizar y controlar tu
aplicacin desde el ordenador. Para nosotros es importante poder controlar de manera autnoma el
dispositivo que hemos ideado con el PIC y poder hacerlo a travs del ordenador, si es que lo
deseamos. En este ltimo caso, al conectarlo al ordenador porttil, los mandos en el hardware
dejarn de funcionar y el LCD nos indicar que estamos conectados al ordenador y podremos as
operar el hardware directamente a travs del puerto USB.
El circuito
En el circuito podemos ver claramente definidos los sectores ms importantes del desarrollo: el PIC
18F4550, al centro de la imagen, el display LCD 16X2, el conector USB, el conector ICSP para poder
programar el PIC en forma serial y sin necesidad de extraerlo del proyecto, el cristal de 20Mhz, el
pulsador, el LED que elegimos de color verde y, por ltimo, el ingreso de la seal de 5 volts
provenientes desde el ordenador a travs del conector USB. Muchos desarrollos basan su
alimentacin en esta tensin que extraen desde el conector. Un ejemplo de esto es el mecanismo de
la carga de bateras de muchos MPX (MP3, MP4, MP5, etc.) o de algn GPS. Los quemadores de
PICs suelen extraer alimentacin desde este puerto y muchas otras aplicaciones tambin lo hacen.
Debes tener en cuenta que esta salida de tensin tiene un mximo posible de 500 miliamperes; si te
excedes de este consumo, puedes daar la salida del puerto. En muchas oportunidades bastar con
reponer un resistor fusible en el motherboard, pero te aconsejamos no jugar con esta suerte.

Adems, debes recordar que en la tercera pantalla del EasyHID USB Wizard, por default,
esta corrientese limita a 50 mA. Este pequeo valor ser suficiente para extraer de all la informacin
que le daremos al programa del PIC para indicarle que nos estamos conectando al ordenador. Pero
antes de escribir siquiera una lnea de cdigo de programa, debemos grabar el PIC con el firmware
que nos gener elEasyHID (previo compilarlo y obtener el .HEX). Luego de grabarlo, procederemos
a conectarlo al ordenador para que ste lo reconozca como un nuevo dispositivo HID
(Human Interface Device) y para que estemos seguros de que no hayan existido errores en la
generacin del cdigo, al menos, en el correspondiente al microcontrolador.

Las imgenes aparecern como al instalar cualquier dispositivo USB

Por ltimo, verificas que el dispositivo funcione correctamente


El nombre del producto seleccionado en la primera imagen deber aparecer al conectar el dispositivo
avisando que ha encontrado un nuevo hardware. Luego de esto veremos el mensaje que indica que
se trata de un dispositivo de interfaz humana USB. Si todo marcha correcto, finalizar la
instalacin indicando que el dispositivo se ha instalado con xito y que funciona correctamente. Si
todo es as, dentro de Configuracin > Panel de Control > Sistema > Hardware > Administrador
de Dispositivos, encontrars una imagen como la que puedes ver a la derecha. Esto es vlido para
el SO XP.Importante: No intentes ponerte a jugar queriendo insertar y extraer varias veces el
conector del ordenador ya que el dispositivo creado se identificar una vez y, para que el ordenador
vuelva a reconocerlo, debes reiniciarlo o apagarlo y volver a conectarlo (a tu proyecto). Esto es
debido a la estructura del programa que ya veremos cmo funciona y qu parmetros podremos
aprender a dominar y manejar a gusto.
El programa dentro del PIC, en el cdigo que genera EasyHID, tiene una lgica muy sencilla pero a
la vez muy rgida y al principio complicada de entender. Pero una vez que comprendes el mecanismo
de trabajo, tus desarrollos se harn realidad en pocos minutos. La rutina se basa en interrogar,
en primera instancia, si el dispositivo est conectado al puerto USB. Si no lo est, queda en un bucle
infinito del que no sale hasta detectar la conexin o hasta que se reinicia el PIC. Esto sucede en la
ltima parte donde vemos la etiqueta AttachToUSB. Como puedes ver, all se repite en un lazo
infinito hasta que (UNTIL) el registro interno del PIC detecte la conexin al puerto USB. Para ser
claro: si antes de esto pensabas poner un destellador, un blinker, un reproductor de MP3 o lo que se
te ocurra dentro de tu PIC, debes saber que hasta que no lo conectes a un puerto USB, el cdigo del
programa quedar muerto en ese lazo.

Es por esto que con el simple agregado de una lnea de cdigo puedes esquivar esta atadura y salir
del lazo. Para esto vamos a utilizar la tensin de entrada de 5Volts que trae el puerto USB,
ingresando a travs de R6 y R5 a RC0. Si RC0 no detecta tensin de entrada, deber sacarnos del
bucle y llevarnos hacia otro lugar del programa que agregaremos nosotros donde no sea necesario
estar conectado a un puerto USB y donde podamos realizar cualquier funcin tal como hacemos con
cualquier otro microcontrolador. Dentro de ese lazo cerrado que utilizaremos para realizar una
actividad autnoma, podremos escribir/leer una memoria EEPROM, interpretar un teclado, manejar
un display LCD y cualquier otra cosa a la que ya estemos acostumbrados.

De esta forma, cuando encendamos nuestro dispositivo, apenas caiga en la instruccin de verificar la
insercin en el puerto USB, ser enviado fuera de ese lazo cerrado y pasar a funcionar de manera
autnoma. Nosotros hemos decidido mostrar este funcionamiento en el display LCD con el mensaje
alusivo correspondiente. Es en esta seccin del programa creada por nosotros mismos en la que
delinearemos el funcionamiento autnomo del desarrollo. Aqu decidiremos qu har por s sola
nuestra creacin. Para el caso de muestra que nos convoca, slo encenderemos y apagaremos un
LED con un pulsador. Pero t puedes expandir la aplicacin a un sistema de adquisicin de datos
para aplicaciones de campo que guarde en una tarjeta SD o en memorias EEPROM de gran
capacidad datos que despus pueden ser analizados en laboratorio. O lo que sea. Nosotros, por
ejemplo, utilizaremos esta base para controlar nuestro receptor de VHF-UHF que venimos
entregando por secciones cada sbado. Tambin puedes construir un Holter Cardaco para
monitorear pacientes con insuficienciacardiovascular. O lo que tu imaginacin sea capaz de lograr.
La condicin de funcionamiento de este sistema dual se basa en la colocacin en la mayor parte
que sea posible de la rutina que detecte que el USB se ha conectado, es decir, que RC0 se
vuelve igual a uno. Aqu ocurrirn dos cosas: por un lado, el programa puede seguir siendo operado
desde su teclado nativo (en nuestro ejemplo, un solo botn) o no. En nuestro ejemplo, el botn deja
de funcionar; pasa a interesarnos el trabajo a travs del ordenador. Y por el otro lado, ya debes ir
preparando algunas lneas de programa para el software que hayas seleccionado. Nosotros hemos
optado por una aplicacin en VB6 que nos muestra varias cosas: por ejemplo, que el sistema se
conecta y se desconecta del puerto de manera efectiva y sin inconvenientes (funcionamiento ptimo
de la instruccin de PORTC.0). Luego vemos un botn que se encargar de prender y apagar el LED
en el dispositivo y un crculo de color que emula esta accin, tal como sucede en el equipo mientras
es controlado en forma remota. Por ltimo, un pequeo texto que cambia de Encendido a
Apagado acompaando la accin del LED.

Tal como se poda ver en el circuito, hemos conectado al LED en PORTC.1 y al botn en
PORTC.2. La aplicacin es sencilla pero intenta ser didctica para que comiences a hacer tus
primeros pasos en el manejo del puerto USB. Debes tener conciencia que dominar este puerto es la
llave de salida para que tus diseos puedan tener aplicaciones exitosas, efectivas y prcticas, sobre
todo, en el mundo de los ordenadores porttiles.
Volviendo a la programacin del microcontrolador, que es la ms compleja, debemos seguir
aclarando puntos difciles dentro de la rutina del servicio USB. Entre las cuestiones que suelen
traernos dolores de cabeza estn los buffers y su ubicacin o numeracin dentro del PIC respecto a
la numeracin que llevarn en el software dentro del ordenador. En Visual Basic, la posicin 0 no se
puede emplear ya que se la utiliza para el reporte del dispositivo, tal como lo expresa el cdigo
generado: first byte is the report ID, e.g. BufferIn(0) the other bytes are the data from the
microcontrolller Por lo tanto, la enumeracin debe iniciarse desde el 1 hasta el 8 y esto
corresponder dentro del PIC en posiciones de Buffer que irn del 0 al 7. Es decir, que lo que en el
PIC sea USBBuffer[2] y sea un dato para transmitir, en VB6 ser BufferIn(3). Compara entre los
listados de los programas que te entregamos, observa este detalle y expndelo utilizando otros
botones, otros LEDs, en fin, otros recursos para ampliar las prestaciones del dispositivo remoto
desde el ordenador.
Observa que adems tienes dos lazos cerrados que si el programa del PIC cae all dentro se
cuelga y no sale ms hasta que lo reinicies. Estos puntos son los momentos en los que entrega
los datos al bus desde el buffer (DoUSBOut) o aquellas instancias en las que solicita los datos
cargados dentro del buffer (DoUSBIn). Si en cualquiera de los casos no encuentra valores, se
quedar all esperando que lleguen y t debes advertirlo rpidamente para sacarlo de esa situacin.
Por eso te entregamos los programas completos. Para que puedas experimentar a partir de un
modelo que sabemos que funciona. Ahora depende de tu imaginacin y tu creacin. Esto recin
comienza, amigo. Proton eEasyHID lograron hacerlo muy fcil, ahora la conectividad USB est en
tus manos.
Download :Soft para el PIC y el Ordenador
'****************************************************************
'* Name
: USBNeoTeo.BAS <NOMBRE DEL DESARROLLO>
*
'* Author : Mario G. Sacco
*
'* Notice : Copyright (c) 2009
*
'*
: All Rights Reserved
*
'* Date
: 13/11/2009
*

'* Version : 1.0


*
'* Notes
:
*
'*
:
*
'****************************************************************
'SELECCIONAMOS EL PIC Y LA FRECUENCIA DE TRABAJO (48Mhz PARA USB)
Device = 18F4550
Xtal = 48
'ESTA FILA LA GENERA EL MISMO "EASYHID USB WIZARD" Y LA COLOCA
'JUNTO A ESTE ARCHIVO .BAS DONDE TRABAJAREMOS LA APLICACIN
'(EN LA MISMA CARPETA)
USB_Descriptor = "Receptor2DESC.inc"
'SETEO EL LCD 16X2 PARA 4 CABLES
LCD_DTPin = PORTB.4
LCD_RSPin = PORTB.3
LCD_ENPin = PORTB.2
LCD_Interface = 4
LCD_Lines = 2
LCD_Type = 0
'LOS TAMAOS DEL BUFFER USB
Symbol USBBufferSizeMax = 8
Symbol USBBufferSizeTX = 8
Symbol USBBufferSizeRX = 8
Dim
USBBuffer[USBBufferSizeMax] As Byte
'VARIABLES AGREGADAS POR M PARA ESTE EJEMPLO
Symbol LED = PORTC.1
'LED SE V A LLAMAR LA SALIDA DE PORTC.1
Dim LEDUSB As Bit
'ESTADO DEL LED (APAGADO O ENCENDIDO)
Dim A As Word
'VARIABLE MULTIFUNCIN
Dim B As Bit
'VARIABLE BIESTADO EN LA QUE RECIBO EL BOTN
'PARA PRENDER Y APAGAR EL LED
'REGISTROS Y BANDERAS
Dim PP0 As Byte System
Symbol CARRY_FLAG = STATUS.0
Symbol ATTACHED_STATE = 6

'
'
'
'

Cls
Clear
A= 0:B = 0

'LIMPIO DISPLAY AL INICIAR


'LIMPIO LA RAM AL INICIAR
'PONGO LAS VARIABLES A CERO

GoSub AttachToUSB

'ME VOY A VER SI EST CONECTADO


'AL INICIAR EL PROGRAMA

'
'
'
'
'
'
'
'

REGISTRO DENTRO DEL PIC USBPOLL STATUS


EN ESTADO ALTO SI EL PIC NO TIENE
EL CONTROL SOBRE EL BUFFER
SI USB EST CONECTADO

*****************************************************************
*****************************************************************
* LAZO PRINCIPAL DEL PROGRAMA MIENTRAS SE EST CONECTADO A USB; *
* RECUERDA QUE DEBES MANTENER LA CONEXIN "VIVA" CON LLAMADOS
*
* CONSTANTES A LAS RUTINAS USBPoll, USBIn or USBOut CADA ALGUNOS*
* MILISEGUNDOS O MS
*
*****************************************************************
*****************************************************************

ProgramLoop:
Print At 1,1,"
Print At 2,1,"

Conectado
al bus USB

" 'ESCRIBO EN EL LCD QUE ENTRAMOS


" 'EN EL LAZO DE CONEXIN USB

USBBuffer[0] = 0
USBBuffer[1] = LED

GoSub DoUSBOut
DelayMS 1

'EL PRIMER BYTE ES DE REPORTE DE CONEXIN


'EL SEGUNDO BYTE SER EL ESTADO DEL LED
'Y HAR CAMBIAR EN LA APLICACIN EN VB6
'EL COLOR DEL SHAPE DEL LED DE ROJO A VERDE
'EL DE CONEXIN, CAMBIA AL DETECTAR
'"PP0 = ATTACHED_STATE"
'TRANSMITO LO ALMACENADO EN EL BUFFER
'DOY UN TIEMPO DE DEMORA

GoSub DoUSBIn

'ME VOY A LEER EL BUFFER DE ENTRADA

B = USBBuffer[2]

'UTILIZO OTRO REGISTRO DEL BUFFER


'(TENGO 8 POSIBLES) Y AL VALOR OBTENIDO LO
'CARGO EN LA VARIABLE "B"

If B = 0 Then
GoTo ProgramLoop
Else
Toggle LED
End If

'SI NO HAY DATO INGRESADO


'CIERRO EL LAZO DE ESPERA
'SI HAY DATO EN EL LUGAR CORRESPONDIENTE
'ES PORQUE SE PULS EL BOTN EN PANTALLA
'ENTONCES CAMBIO EL ESTADO DEL LED

GoTo ProgramLoop

'CIERRO EL LAZO DESPUS DE TODO EL TRABAJO

' ************************************************************
' *
RUTINA DE RECEPCIN DE DATOS
*
' ************************************************************
DoUSBIn:
If PORTC.0 = 0 Then GoTo FUERA 'CONTROLO SI SE DESCONECT DE USB
USBIn 1, USBBuffer, USBBufferSizeRX, DoUSBIn
Return
' ************************************************************
' *
RUTINA DE TRANSMISIN DE DATOS
*
' ************************************************************
DoUSBOut:
If PORTC.0 = 0 Then GoTo FUERA 'CONTROLO SI SE DESCONECT DE USB
USBOut 1, USBBuffer, USBBufferSizeTX, DoUSBOut
Return
' ************************************************************
' *
ESPERA HASTA QUE EL USB SE CONECTE
*
' ************************************************************
AttachToUSB:
If PORTC.0 = 0 Then GoTo FUERA 'CONTROLO SI SE DESCONECT DE USB
Repeat
USBPoll
Until PP0 = ATTACHED_STATE
Return
'******************************************************************************
'******************************************************************************
'**
PROGRAMA QUE SE DESARROLLA DE FORMA AUTNOMA
**
'******************************************************************************
'******************************************************************************
FUERA:
'RUTINA FUERA DEL CONTACTO USB
Cls
'LIMPIO LA PANTALLA AL INICIAR
FUERA2:
'COMIENZO LAZO CERRADO HASTA
'VOLVER A CONECTAR A USB
Print At 1,1,"
AUTONOMO "
'PUEDO IMPRIMIR
Print At 2,1,"
SIN USB
"
'UN TEXTO EJEMPLO
If LED = 1 Then
'CONTROLAR EL ESTADO DE UNA VARIABLE
Print At 1,14,"LED"
'ESCRIBIR SEGN EL ESTADO
Print At 2,14,"ON "
'DE DICHA VARIABLE

Else
Print At 1,14,"LED"
Print At 2,14,"OFF"
EndIf

'SINO
'ESCRIBIR OTRO TEXTO
'FINALIZO LA RUTINA DE CONTROL

For A = 1 To 500

'VOY A CONTROLAR DURANTE EL TIEMPO


'QUE DETERMINE "A"
If PORTC.0 = 1 Then GoTo ProgramLoop 'CONTROLO SI SE CONECT A USB
If PORTC.2 = 0 Then
'SI SE PULSA EL BOTN
DelayMS 400
'(DOY UN TIEMPO PARA ELLO)
Toggle LED
'CAMBIO EL ESTADO DEL LED
EndIf
'FINALIZA LA CONDICIN DE CONTROL DEL BOTN

DelayMS 1
Next
Print At 1,1,"
Print At 2,1,"
If LED =
Print At
Print At
Else
Print At
Print At
EndIf

'DURANTE ESTE TIEMPO EL LCD HABR ESTADO


'ENCENDIDO
"
"
1 Then
1,14,"LED"
2,14,"ON "

'BORRO EL LCD
'INTERROGO EL ESTADO DEL LED
'Y LO EXPONGO EN EL LCD

1,14,"LED"
2,14,"OFF"

For A = 1 To 500

'VOY A CONTROLAR DURANTE EL TIEMPO


'QUE DETERMINE "A"
If PORTC.0 = 1 Then GoTo ProgramLoop 'CONTROLO SI SE CONECT A USB
If PORTC.2 = 0 Then
'SI SE PULSA EL BOTN
DelayMS 400
'(DOY UN TIEMPO PARA ELLO)
Toggle LED
'CAMBIO EL ESTADO DEL LED
EndIf
'FINALIZA LA CONDICIN DE CONTROL DEL BOTN

DelayMS 1
Next

'DURANTE ESTE TIEMPO EL LCD HABR ESTADO


'APAGADO

If PORTC.0 = 1 Then GoTo ProgramLoop


GoTo FUERA2

'CONTROLO SI SE CONECT A USB


'CIERRO EL LAZO EJEMPLO DE ACTIVIDADES QUE
'PUEDE ESTENDERSE A LA CANTIDAD QUE NECESITEMOS
'DURANTE EL FUNCIONAMIENTO SIN CONEXIN USB

VISUAL

Attribute VB_Name = "HIDDLLInterface"


' this is the interface to the HID controller DLL - you should not
' normally need to change anything in this file.
'
' WinProc() calls your main form 'event' procedures - these are currently
' set to..
'
' MainForm.OnPlugged(ByVal pHandle as long)
' MainForm.OnUnplugged(ByVal pHandle as long)
' MainForm.OnChanged()
' MainForm.OnRead(ByVal pHandle as long)
Option Explicit
' HID interface API declarations...
Declare Function hidConnect Lib "mcHID.dll" Alias "Connect" (ByVal pHostWin As Long) As
Boolean
Declare Function hidDisconnect Lib "mcHID.dll" Alias "Disconnect" () As Boolean
Declare Function hidGetItem Lib "mcHID.dll" Alias "GetItem" (ByVal pIndex As Long) As
Long
Declare Function hidGetItemCount Lib "mcHID.dll" Alias "GetItemCount" () As Long
Declare Function hidRead Lib "mcHID.dll" Alias "Read" (ByVal pHandle As Long, ByRef pData
As Byte) As Boolean
Declare Function hidWrite Lib "mcHID.dll" Alias "Write" (ByVal pHandle As Long, ByRef
pData As Byte) As Boolean
Declare Function hidReadEx Lib "mcHID.dll" Alias "ReadEx" (ByVal pVendorID As Long, ByVal
pProductID As Long, ByRef pData As Byte) As Boolean
Declare Function hidWriteEx Lib "mcHID.dll" Alias "WriteEx" (ByVal pVendorID As Long,
ByVal pProductID As Long, ByRef pData As Byte) As Boolean
Declare Function hidGetHandle Lib "mcHID.dll" Alias "GetHandle" (ByVal pVendoID As Long,
ByVal pProductID As Long) As Long
Declare Function hidGetVendorID Lib "mcHID.dll" Alias "GetVendorID" (ByVal pHandle As
Long) As Long
Declare Function hidGetProductID Lib "mcHID.dll" Alias "GetProductID" (ByVal pHandle As
Long) As Long
Declare Function hidGetVersion Lib "mcHID.dll" Alias "GetVersion" (ByVal pHandle As Long)
As Long
Declare Function hidGetVendorName Lib "mcHID.dll" Alias "GetVendorName" (ByVal pHandle As
Long, ByVal pText As String, ByVal pLen As Long) As Long
Declare Function hidGetProductName Lib "mcHID.dll" Alias "GetProductName" (ByVal pHandle
As Long, ByVal pText As String, ByVal pLen As Long) As Long
Declare Function hidGetSerialNumber Lib "mcHID.dll" Alias "GetSerialNumber" (ByVal
pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
Declare Function hidGetInputReportLength Lib "mcHID.dll" Alias "GetInputReportLength"
(ByVal pHandle As Long) As Long
Declare Function hidGetOutputReportLength Lib "mcHID.dll" Alias "GetOutputReportLength"
(ByVal pHandle As Long) As Long
Declare Sub hidSetReadNotify Lib "mcHID.dll" Alias "SetReadNotify" (ByVal pHandle As
Long, ByVal pValue As Boolean)
Declare Function hidIsReadNotifyEnabled Lib "mcHID.dll" Alias "IsReadNotifyEnabled"
(ByVal pHandle As Long) As Boolean
Declare Function hidIsAvailable Lib "mcHID.dll" Alias "IsAvailable" (ByVal pVendorID As
Long, ByVal pProductID As Long) As Boolean
' windows API declarations - used to set up messaging...

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal


lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal
lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As
Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
' windows API Constants
Private Const WM_APP = 32768
Private Const GWL_WNDPROC = -4
' HID message
Private Const
Private Const
Private Const
Private Const
Private Const

constants
WM_HID_EVENT = WM_APP + 200
NOTIFY_PLUGGED = 1
NOTIFY_UNPLUGGED = 2
NOTIFY_CHANGED = 3
NOTIFY_READ = 4

' local variables


Private FPrevWinProc As Long
Private FWinHandle As Long

' Handle to previous window procedure


' Handle to message window

' Set up a windows hook to receive notification


' messages from the HID controller DLL - then connect
' to the controller
Public Function ConnectToHID(ByVal pHostWin As Long) As Boolean
FWinHandle = pHostWin
ConnectToHID = hidConnect(FWinHandle)
FPrevWinProc = SetWindowLong(FWinHandle, GWL_WNDPROC, AddressOf WinProc)
End Function
' Unhook from the HID controller and disconnect...
Public Function DisconnectFromHID() As Boolean
DisconnectFromHID = hidDisconnect
SetWindowLong FWinHandle, GWL_WNDPROC, FPrevWinProc
End Function
' This is the procedure that intercepts the HID controller messages...
Private Function WinProc(ByVal pHWnd As Long, ByVal pMsg As Long, ByVal wParam As Long,
ByVal lParam As Long) As Long
If pMsg = WM_HID_EVENT Then
Select Case wParam
' HID device has been plugged message...
Case Is = NOTIFY_PLUGGED
MainForm.OnPlugged (lParam)
' HID device has been unplugged
Case Is = NOTIFY_UNPLUGGED
MainForm.OnUnplugged (lParam)
' controller has changed...
Case Is = NOTIFY_CHANGED
MainForm.OnChanged
' read event...
Case Is = NOTIFY_READ
MainForm.OnRead (lParam)
End Select
End If
' next...
WinProc = CallWindowProc(FPrevWinProc, pHWnd, pMsg, wParam, lParam)

End Function

S-ar putea să vă placă și