Реализация Java-интерфейса в MATLAB - PullRequest
5 голосов
/ 21 февраля 2012

Я пытаюсь написать графический интерфейс MATLAB, использующий интерфейс XBee-API для связи с беспроводным радио XBee на борту Arduino. Графический интерфейс в основном выполняет сбор данных и анализирует входящие пакеты.

Я хочу сделать addPacketListener, как определено в Руководстве разработчика (см. Раздел «Получение пакетов») для ожидания обработки пакетов. В Java это делается так:

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

В MATLAB я бы сделал addlistener() и установил бы его обратный вызов для выполнения моей обработки.

Я совсем немного знаю о Java, поэтому мне было интересно, можно ли установить код processResponse в стиле MATLAB: могу ли я сделать что-то вроде следующего:

function processResponse
    #% do response here
end 

>> xbee.addPacketListener(@processResponse)

Я не уверен, имел ли это полный смысл; в основном я пытаюсь выполнить обратный вызов, как только новые пакеты станут доступны для моего XBee (который в Java обрабатывается addPacketListener).

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Дайте мне знать, если я ошибаюсь, но похоже, что вы в основном хотите перехватить вызовы XBee на PacketListener.processResponse(XBeeResponse x) и заставить MATLAB обработать содержимое входящего XBeeResponse объекта.Я не большой гуру MATLAB, но возможно ли вообще реализовать класс Java с использованием кода MATLAB, а затем передать этот класс обратно в Java?Я думаю, что, вероятно, нет, но я могу ошибаться.

Я думаю, что проблема, с которой вы здесь работаете, связана с тем, что легко выполнять вызовы MATLAB для объектов Java, но не наоборот.Что бы я сделал, это сделал бы действительно простую реализацию PacketListener с использованием Java-кода, а затем использовал стороннюю библиотеку, такую ​​как matlabcontrol , чтобы сделать вызовы функций из вашей реализации Java PacketListener обратно в MATLAB.

Мне приходилось сталкиваться с этой проблемой в большом программном проекте, для которого требовался графический интерфейс, написанный на Java, для выполнения вызовов внутреннего кода, написанного на MATLAB, поэтому я могу поручиться за возможности matlabcontrol.Еще один важный ресурс при управлении MATLAB из Java, если вы идете по этому пути, это undocumentedmatlab.com .

РЕДАКТИРОВАТЬ

Еще одна вещь дляБудьте осторожны с потоками на стороне Java.Вы можете иметь любое количество потоков Java, выполняющих вызовы MatLab одновременно, но MatLab будет «секвенировать» все вызовы из Java.Допустим, Java должна вызывать функции MatLab "f1" и "f2".Вы устанавливаете два потока Java, каждый из которых вызывает либо f1, либо f2 одновременно.MatLab заставит одного ждать завершения другого, прежде чем начать второй вызов функции, и он совершенно не определяет, какой из них будет вызван первым.

Причина, по которой я это говорю, заключается в том, что бы ни вызывал поток Javaфункция processResponse(XBeeResponse x) будет заблокирована, если она вызовет MatLab, а MatLab уже занят чем-то другим.Лучше всего, чтобы ваш PacketListener кэшировал входящие экземпляры XBeeResponse, чтобы XBee не застревал в ожидании, пока MatLab обработает данные.Просто что-то иметь в виду.

0 голосов
/ 21 февраля 2012

Для взаимодействия MATLAB с Java следуйте требованиям интерфейса в Добавление классов и методов Java в рабочую область MATLAB .

Наихудшим является добавление пути к вашим классам Java jars к пути javaclass, а затем вызов конструкторов, методов и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...