Построение графика прокрутки в реальном времени в Android с помощью AchartEngine - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь отобразить данные моего 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
...