2012-02-21 20 views
5

Estoy tratando de escribir una GUI de MATLAB que utiliza la interfaz XBee-API para hablar con una radio inalámbrica XBee a bordo de un Arduino. La GUI principalmente hace la recopilación de datos y analiza los paquetes entrantes.Implementación de la interfaz Java en MATLAB

Quiero hacer un addPacketListener como se define en the Developer's Guide (see section "Receiving Packets") para esperar a que los paquetes se procesen. En Java, esto es la forma en que se llevaría a cabo:

xbee.addPacketListener(new PacketListener() { 
    public void processResponse(XBeeResponse response) { 
     // handle the response 
    } 
}); 

en MATLAB, me gustaría hacer una addlistener() y establecer su devolución de llamada para hacer mi procesamiento.

Yo no sé mucho de todo acerca de Java, así que me preguntaba si es posible establecer el código processResponse a la MATLAB: puedo hacer algo como la siguiente:

function processResponse 
    #% do response here 
end 

>> xbee.addPacketListener(@processResponse) 

estoy no estoy seguro si esto tiene sentido completo; Básicamente, lo que intento lograr es ejecutar una devolución de llamada una vez que haya nuevos paquetes disponibles para mi XBee (que en Java se maneja con addPacketListener).

+0

No entiendo completamente lo que está preguntando. Cuando llamas al método addPacketListener como se ilustra arriba, pasas un nuevo objeto (una clase interna anónima), cuyo método processResponse se llamará cuando lleguen los paquetes. Esta es la devolución de llamada: solo complete la parte "manejar la respuesta" usted mismo. – cutchin

+0

@cutchin para que pueda escribir una clase MATLAB separada que exporte un método 'processResponse' y pasar una instancia de esa clase a' addPacketListener'? Intenté pasar un objeto MATLAB con un método 'processResponse' y obtuve el siguiente error:' XB.addPacketListener (testclass) Ningún método 'addPacketListener' con la firma correspondiente encontrada para la clase 'com.rapplogic.xbee.api.XBee'' –

+0

No soy un experto en la integración de MATLAB, pero creo que estás haciendo esto al revés. Escriba su código java para iniciar la interfaz XBee y recibir paquetes primero. Asegúrate de que funcione desde la línea de comando y puedes ver los paquetes que llegan. A partir de ahí, escriba una biblioteca (un archivo .jar) que importará en matlib y haga que recupere datos de su clase como se describe [aquí] (http://www.mathworks.com/help/techdoc/matlab_external/f6671). .html). – cutchin

Respuesta

3

Avíseme si me equivoco, pero parece que básicamente desea interceptar las llamadas de XBee al PacketListener.processResponse(XBeeResponse x) y hacer que MATLAB procese el contenido del objeto entrante XBeeResponse. No soy mucho un gurú de MATLAB, pero ¿es posible implementar una clase Java utilizando el código MATLAB y luego pasar esa clase a Java? Probablemente no, pero podría estar equivocado.

Creo que el problema que está tratando aquí se debe al hecho de que es fácil hacer llamadas de MATLAB a objetos Java, pero no al revés. Lo que haría es hacer una implementación realmente simple de PacketListener usando código Java, y luego usar una biblioteca de terceros como matlabcontrol para hacer que las llamadas a funciones de su implementación de Java PacketListener vuelvan a MATLAB.

Tuve que lidiar con este problema en un gran proyecto de software que requería una GUI escrita en Java para realizar llamadas en el código de back-end escrito en MATLAB, por lo que puedo responder por las capacidades de matlabcontrol. Otro recurso importante al controlar MATLAB desde Java, si realiza esta ruta, es undocumentedmatlab.com.

EDITAR

Otra cosa a tener cuidado de que se enhebrar en el lado de Java. Puede tener cualquier número de subprocesos de Java haciendo llamadas MatLab simultáneamente, pero MatLab "secuenciará" todas las llamadas desde Java. Digamos que Java necesita llamar a las funciones de MatLab "f1" y "f2". Configura dos hilos de Java y cada uno llama a f1 o f2, simultáneamente. MatLab obligará a uno a esperar a que el otro termine antes de iniciar la segunda llamada de función, y es completamente indeterminado cuál será el primero en ser llamado.

La razón por la que digo esto es que, cualquiera que sea el hilo de Java, la función processResponse(XBeeResponse x) se bloqueará si hace una llamada a MatLab y MatLab ya está ocupado haciendo otra cosa. Puede ser mejor que su PacketListener instale instancias XBeeResponse entrantes para que XBee no se quede atascado esperando que MatLab procese los datos. Sólo algo para tener en cuenta.

+0

. Definitivamente puede pasar datos de matlab a Java, de hecho, con bastante facilidad. – macduff

+0

matlabcontrol es una gran herramienta. ¡Gracias! –

Cuestiones relacionadas