jPicUSB: Clase Java para comunicación USB con PICs usando API de Microchip Oñativia, Gerónimo Isidro Universidad Nacional de Tucumán – Facultad de Ciencias Exactas – Ingeniería en Computación geronimox@gmail.com - desarrollos@divideandconquer.com.ar - www.divideandconquer.com.ar La mayoría de los fabricantes de computadoras portátiles, y de escritorio, poco a poco están jubilando al antiguo puerto serie; de la misma manera en que se dejó en el olvido al antiguo puerto paralelo. De este echo surgió la necesidad, y casi obligación, de migrar nuestros desarrollos a las nuevas tecnologías. El puerto USB trae consigo muchas ventajas respecto a los antiguos puertos serie y paralelo, las más notables son: Alta tasa de transferencia (mínimo 100 veces mayor al puerto serie) Hasta 127 dispositivos conectados en un mismo bus Es capaz de alimentar un periférico con 500mA/5V Es Plug And Play y Hot Swapable Tambien no se debe dejar de lado que se ha convertido en un Standard en la Industria de Computadoras, por lo que es prácticamente imposible encontrar una PC sin un puerto USB a nuestra disposición. Esta ponencia no abordará el software del lado de un PIC, sino del lado de la PC, y específicamente desde una aplicación Java, utilizando la clase jPicUSB para lograr la comunicación PIC-PC. ¿Que es jPicUSB? JPicUSB es una clase java, que utilizando interfaces nativas (JNI) [7], permite a una aplicación Java hacer llamados a una librería dinámica, en este caso (jpicusb.dll). JPicUSB.dll es una librería que implementa todas las funciones de la API USB de Microchip [4] (mpusbapi.dll), con la diferencia de que está especialmente recompilada para permitir a la clase jPicUSB que haga llamados a sus funciones. ¿Porque jPicUSB? El desarrollo rápido de aplicaciones e interfaces gráficas es una de las cualidades más notables de Java, pero este lenguaje, no nos proporciona un mátodo fácil para acceder a librerías dinámicas (.dll). Aquí es donde jPicUSB facilita el camino, como si se tratase de cualquier lenguaje. Métodos disponibles en JPicUSB Ficheros que componen al paquete jPicUSB jpicusb.jar jpicusb.dll – – javadoc – Interfaz java con la librería dinámica jpicusb.dll Librería dinámica que contiene todas las funciones de la API USB de Microchip [4] Carpeta con la documentación de la clase. (Descripción de todos los métodos) Distintos tipos de Métodos disponibles en jpicusb.jar En la clase iface del Paquete jPicUSB podemos distinguir 3 tipos diferentes de métodos. - Métodos de inicialización varios Cargan la librería dinámica y establecen valores por defecto. - Métodos generales Lectura y Escritura de datos a un dispositivo USB, apertura de una conexión, etc. - Métodos rápidos Imitan a los métodos generales, pero con menos código para agilizar el desarrollo. Cada uno de estos 3 tipos de métodos están descriptos a continuación. Métodos de inicialización varios static void load( ) Carga la librería dinámica jpicusb.dll. Este método debe ser llamado solo una vez, antes de cualquier llamada a otro método. static void set_vidpid(java.lang.String s) Establece el VID&PID utilizado por defecto en toda llamada a un método rápido. static void set_instance(int i) Establece la instancia utilizada por defecto en toda llamada a un método rápido. Descripción de los Métodos “rapidos” en la clase jpicusb.jar Además de las funciones proporcionadas por la API de Microchip [4], jPicUSB dispone de varios métodos que agilizan el desarrollo. Estos métodos “rápidos” se identifican gracias a que a su nombre le antecede el carácter Q (“Quick”). Antes de utilizar estos métodos, es necesaria una simple configuración de la librería utilizando los métodos de inicialización varios, descriptos en la lista anterior (set_vidpid y set_instance). Los métodos “rápidos” disponibles son: static byte[ ] QRead (int dwLen, long dwMilliseconds) Establece una conexión al VID&PID por defecto, lee dwLen bytes, con un timeout de dwMilliseconds milisegundos y luego cierra la conexión. Retorna los bytes leídos en un arreglo de bytes. static long QWrite (byte[ ] pData, int dwLen, long dwMilliseconds) Establece una conexión al VID&PID por defecto, escribe dwLen bytes del arreglo pData, con un timeout de dwMilliseconds milisegundos y luego cierra la conexión. Retorna la cantidad de bytes que se escribieron con éxito. static byte[ ] QWriteRead(byte[] pData, int dwLenWrite, int dwLenRead, long dwMilliseconds) Establece una conexión al VID&PID por defecto, escribe dwLenWrite bytes del arreglo pData, luego lee dwLenRead bytes, con un timeout de dwMilliseconds milisegundos y luego cierra la conexión. Retorna los bytes leídos en un arreglo de bytes. Descripcion de los Métodos generales en la clase jpicusb.jar Los métodos generales, son aquellos que se comportan igual a las funciones proporcionadas por la API USB de Microchip [4], ya que se tratan de las mismas funciones, recompiladas de tal forma, que puedan ser accedidas desde la librería jPicUSB en Java. static int GetDeviceCount(java.lang.String pVID_PID) Retorna la cantidad de dispositivos que coinciden con pVID_PID. static long Open(int instance, java.lang.String pVID_PID, java.lang.String pEP, int dwDir, int dwReserved) Abre una conexión con el dispositivo cuyo VID&PID coincide con pVID_PID. Retorna una handle que identifica a la conexión para ser usada con los demás métodos generales que requieren una conexión previamente establecida. static boolean Close(long handle) Cierra la conexión proporcionada. static byte[ ] Read(long handle, int dwLen, long dwMilliseconds) Lee dwLen bytes de la conexión proporcionada via el parámetro handle. Retorna un arreglo de bytes con los datos leídos. static long Write(long handle, byte[] pData, int dwLen, long dwMilliseconds) Escribe dwLen bytes de pData en la conexión proporcionada vía el parámetro handle. Retorna un entero representando la cantidad de bytes escritos con éxito. static byte[ ] Read(java.lang.String pVID_PID, int instance, int dwLen, long dwMilliseconds) Abre una conexión con el dispositivo cuyo VID&PID coincide con pVID_PID. Lee dwLen bytes de la conexión y luego cierra la conexión abierta. Retorna un arreglo de bytes con los datos leídos. static long Write(java.lang.String pVID_PID, int instance, byte[] pData, int dwLen, long dwMilliseconds) Abre una conexión con el dispositivo cuyo VID&PID coincide con pVID_PID. Escribe dwLen bytes de pData a la conexión y luego cierra la conexión abierta. Retorna un entero representando la cantidad de bytes escritos con éxito. static byte[ ] WriteRead(java.lang.String pVID_PID, int instance, byte[] pData, int dwLenWrite, int dwLenRead, long dwMilliseconds) Abre dos pipes (uno de lectura y otro de escritura) con el dispositivo cuyo VID&PID coincide con pVID_PID. Envia dwLenWrite bytes de pData al dispositivo y luego lee dwLenRead bytes del mismo. Luego cierra la conexión. Retorna un arreglo de bytes con los datos leídos. Nota: Varios usuarios reportaron problemas al ejecutar el método load. El problema se resolvió instalando los Runtimes de Visual C++ [6] Usando jPicUSB en cuatro pasos Pasos básicos para la utilización de jPicUSB en un Proyecto Java de Netbeans [5] Para utilizar jPicUSB en nuestras aplicaciones, es necesario añadir el paquete jpicusb.jar al proyecto. Importar todos los paquetes contenidos en jPicUSB. Inicializar la librería en el código antes de usarla. Y antes de ejecutar la aplicación, copiar la librería jpicusb.dll al contexto en el cual se ejecuta nuestra aplicación. Anexos que acompañan esta ponencia: 1. jpicusb_1.1.1.rar Librería jPicUSB y su documentación. 2. jPicUsb_1.1.1_Led_Show_Demo.rar Demostración de jPicUSB en un proyecto en NetBeans, con simulación de hardware utilizando PIC18F4550 en Proteus. Vínculos de Interes: 1. Web del Proyecto: http://divideandconquer.com.ar/dyq/2009/01/jpicusb-comunicacion-pic-usb-usando-java/ 2. Tutorial de desarrollo de una aplicación paso a paso con NetBeans y uso de jPicUSB http://www.ucontrol.com.ar/forosmf/programacion-en-java/tutorial-java-pic-usb-(primerospasos)/ 3. Video del proyecto de demostración de la librería http://tinypic.com/player.php?v=2eb4awn&s=5 4. Microchip Aplication Libraries http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDoc Name=en540668 5. NetBeans IDE http://www.netbeans.org/ 6. Microsoft Visual C++ SP1 Redistributable Package http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D3802B2AF5FC2&displaylang=en 7. Java Native Interface http://es.wikipedia.org/wiki/Java_Native_Interface http://java.sun.com/j2se/1.5.0/docs/guide/jni/index.html