Я пытаюсь отобразить данные моего Arduino Adc на своем планшете Android в реальном времени, используя библиотеку AchartEngine. Моя частота дискретизации АЦП составляет 256 Гц. Мне удалось получить данные на Android, но я застрял на графике.
Я хочу нанести 10 секунд данных, то есть 2560 выборок на одну страницу, и продолжать прокручивать дальше. Я попытался построить его с помощью приведенного ниже кода, но он отображает все образцы раз в 10 секунд. Это похоже на то, что область просмотра графика обновляется каждые 10 секунд.
//handler For Receving serial data
UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() {
//Defining a Callback which triggers whenever data is read.
@Override
public void onReceivedData(byte[] arg0) {
byte[] buffer = arg0;
for (int i = 0; i <= (buffer.length - 1); i++) {
if (buffer[i] != 13) {
if (buffer[i] == 10) {
finaldata = rawdata;
rawdata = "";
} else {
chdata = (char) buffer[i];
rawdata += chdata;
}
}
}
data = Integer.parseInt(finaldata);
buffer_bt[databuff] = data;
databuff = databuff + 1;
if (databuff == 2559) {
for (int uu = 0; uu <= 2559; uu++) {
copy_buffer_bt[uu] = buffer_bt[uu];
}
databuff = 0;
ready_bt = 1;
threadon = true;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//all button & chartengine initializations
Thread thread = new Thread(null, commRunnable, "tag");
thread.start();
}
Runnable commRunnable = new Runnable() {
@Override
public void run() {
int ret = 0;
double[] buffer_plot = new double[Fs * 3];
double[] D = { -2, -1, 0, 1, 2 };
double output1 = 0;
double outputd1 = 0;
double[] buffer_d1 = new double[5];
double outputd2 = 0;
double[] buffer_d2 = new double[5];
int integer_hr_window = (int)(Fs * 2 / 3);
double[] buffer_hr = new double[integer_hr_window];
int count1 = 0;
int count2 = 0;
double summ = 0;
double mean1 = 0;
double mean2 = 0;
int ind = 0;
int read_value = 0;
// int vv =0;
// int ind_plot =0;
XYSeriesRenderer Xrenderer = new XYSeriesRenderer();
Xrenderer.setColor(Color.GREEN);
Xrenderer.setLineWidth(2);
mRenderer.setApplyBackgroundColor(true);
mRenderer.setBackgroundColor(Color.BLACK);
mRenderer.setMarginsColor(Color.WHITE);
mRenderer.setXLabelsColor(Color.BLACK);
mRenderer.setYLabelsColor(0, Color.BLACK);
mRenderer.setLabelsColor(Color.BLACK);
mRenderer.setChartTitle("SIGNAL");
mRenderer.setXTitle("Time [s] ");
mRenderer.setYTitle("Level");
mRenderer.setZoomButtonsVisible(false);
mRenderer.setXLabels(0);
mRenderer.setPanEnabled(true);
mRenderer.setClickEnabled(false);
mRenderer.addSeriesRenderer(Xrenderer);
mRenderer.setShowLegend(false);
mRenderer.setShowGrid(true);
mRenderer.setGridColor(Color.WHITE);
//mRenderer.setXAxisMin(0);
// mRenderer.setXAxisMax(50);
while (true) {
if (ready_bt == 1) {
for (int vv = 0; vv <= 2559; vv++) {
read_value = copy_buffer_bt[vv];
buffer_plot[ind] = read_value;
ind = ind + 1;
if (ind == 2559) {
ind = 0;
xSeries.clear();
int ind_plot = 1;
int ind_buffer_plot = 0;
while (ind_buffer_plot < buffer_plot.length) {
xSeries.add(ind_plot, buffer_plot[ind_buffer_plot]);
ind_plot = ind_plot + 1;
ind_buffer_plot = ind_buffer_plot + delta_plot;
}
// plot data
runOnUiThread(new Runnable() {@Override
public void run() {
if (flag_stop == 0 && control_a == 0) {
mRenderer.setChartTitle("SIGNAL");
dataset.addSeries(xSeries);
mChart = (GraphicalView) ChartFactory.getLineChartView(getBaseContext(), dataset, mRenderer);
layout.addView(mChart);
control_a = 1;
}
if (flag_stop == 0 && control_a == 1) {
dataset.clear();
mRenderer.setChartTitle("SIGNAL");
dataset.addSeries(xSeries);
mChart.repaint();
}
} //END RUN
}); //END UI THREAD
} //END IF
} //END FOR
ready_bt = 0;
} //end if
} //end while
} //end run
}; //end commrunnable