Я задавал вопросы, касающиеся моего проекта Android, который постоянно отображает данные Bluetooth в режиме реального времени.
По сути, я уже создал первую версию своего приложения, собрав воедино некоторый открытый исходный код.код Blueterm и OrientationSensorExample
Было предложено добавить поток, обработчик, службу или использовать Async Task, или AIDL и т. д. Но я нене знаю, как их использовать, и был бы признателен за объяснение.
Вот описание открытого исходного кода Blueterm, с которого я начал (см. ссылку выше).Blueterm - это в основном программа-эмулятор терминала, которая общается через Bluetooth.Он состоит из нескольких видов деятельности, причем Blueterm является наиболее важным.Он обнаруживает, связывает и соединяется с удаленным устройством Bluetooth, которое поддерживает SPP / RfComm.После подключения я могу использовать Blueterm для настройки удаленного устройства, посылая ему команды для включения выборки, изменения количества каналов для выборки (на один канал), изменения формата входных данных (мне нравятся данные, разделенные запятыми) и т. Д.
Вот описание открытого исходного кода OrientationSensorExample, с которого я начал (см. Ссылку выше).Это в основном пример приложения библиотеки AnroidPlot.Деятельность OrientationSensor реализует SensorEventListener.Это включает переопределение onSenorChanged (), которое вызывается всякий раз, когда берутся новые данные датчика ориентации, и перерисовывает график.
Объединяя эти два проекта с открытым исходным кодом (Blueterm и OrientationSensorExample) в одно приложение (Blueterm), вотописание того, как работает общее приложение (Blueterm).Когда я запускаю Blueterm, весь экран эмулирует красивый синий терминал.В открывшемся меню «Параметры» выполните сопряжение, подключитесь и настройте удаленное устройство Bluetooth, как описано выше.После того, как я настроил удаленное устройство, я снова захожу в меню параметров и выбираю «Данные графика», который запускает действие «График».Эмулятор терминала исчезает, и появляется хороший прокручиваемый график в реальном времени из действия Plot.
Насколько я могу судить, существует фоновый поток, который вызывает метод update () следующим образом:
/**
* Look for new input from the ptty, send it to the terminal emulator.
*/
private void update() {
int bytesAvailable = mByteQueue.getBytesAvailable();
int bytesToRead = Math.min(bytesAvailable, mReceiveBuffer.length);
try {
int bytesRead = mByteQueue.read(mReceiveBuffer, 0, bytesToRead);
append(mReceiveBuffer, 0, bytesRead);
//VTR use existing handler that calls update() to get data into plotting activity
Plot.plotData(mReceiveBuffer, 0, bytesRead);
} catch (InterruptedException e) {
//VTR OMG their swallowing this exception
}
}
В методе update () мне было удобно вызывать мой метод Plot.plotData () и передавать ему ту же дату, которая передается методу append () для построения графика данных.ПРИМЕЧАНИЕ. Это работает, только если plotData () является статическим методом.Никто не смог объяснить, почему.
В любом случае plotData () - это статический метод, и вот как он и его вспомогательные методы выглядят сейчас:
private static StringBuffer strData = new StringBuffer("");
public static void plotData(byte[] buffer, int base, int length) {
Log.i("Entering: ", "plotData()");
/*
byte[] buffer = (byte[]) msg.obj;
int base = msg.arg1;
int length = msg.arg2;
*/
for (int i = 0; i < length; i++) {
byte b = buffer[base + i];
try {
if (true) {
char printableB = (char) b;
if (b < 32 || b > 126) {
printableB = ' ';
}
Log.w("Log_plotData", "'" + Character.toString(printableB)
+ "' (" + Integer.toString(b) + ")");
strData.append(Character.toString(printableB));
if (b == 10)
{
Log.i("End of line: ", "processBlueData()");
Log.i("strData", strData.toString());
splitData(strData);
strData = new StringBuffer("");
}
}
} catch (Exception e) {
Log.e("Log_plotData_exception", "Exception while processing character "
+ Integer.toString(i) + " code "
+ Integer.toString(b), e);
}
}
Log.i("Leaving: ", "plotData()");
}
private static void splitData(StringBuffer strBuf) {
String strDash = strBuf.toString().trim();
String[] strDashSplit = strDash.split("-");
for (int ndx = 0; ndx < strDashSplit.length; ndx++)
{
if (strDashSplit[ndx].length() > 0)
Log.i("strDashSplit", ndx + ":" + strDashSplit[ndx]);
String strComma = strDashSplit[ndx].trim();
String[] strCommaSplit = strComma.split(",");
for (int mdx = 0; mdx < strCommaSplit.length; mdx++)
{
if (strCommaSplit[mdx].length() > 0)
Log.i("strCommaSplit", mdx + ":" + strCommaSplit[mdx]);
if (mdx == 1)
{
int raw = Integer.parseInt(strCommaSplit[1],16);
Log.i("raw", Integer.toString(raw));
float rawFloat = raw;
Log.i("rawFloat", Float.toString(rawFloat));
float ratio = (float) (rawFloat/65535.0);
Log.i("ratio", Float.toString(ratio));
float voltage = (float) (5.0*ratio);
Log.i("voltage", Float.toString(voltage));
nowPlotData(voltage);
}
}
}
}
public static void nowPlotData(float data) {
// get rid the oldest sample in history:
if (plotHistory.size() > HISTORY_SIZE) {
plotHistory.removeFirst();
}
// add the latest history sample:
plotHistory.addLast(data);
// update the plot with the updated history Lists:
plotHistorySeries.setModel(plotHistory, SimpleXYSeries.ArrayFormat.Y_VALS_ONLY);
//VTR null pointer exception?
if (plotHistoryPlot == null)
Log.i("aprHistoryPlot", "null pointer exception");
// redraw the Plots:
plotHistoryPlot.redraw();
}
Если настоятельно рекомендуется plotData() не быть статическим методом, и что я должен сделать что-то еще, пожалуйста, объясните здесь и как.Спасибо!