Невозможно обновить мой тепловой график с двойным значением

Я разрабатываю приложение для Android, где я получил данные от датчика давления (прикрепленного к Arduino) и хочу показать их в тепловой карте Scichart. Я успешно создал тепловую карту Scichart с IPaletteProvider. Теперь я хочу обновить тепловую карту с помощью датчика давления, но в настоящее время я не могу обновить свою тепловую карту. Вот мой весь (код PressureActivity).

 public class PressureSensorActivity extends AppCompatActivity {
    private String TAG="PressureSensorActivity";
    private BluetoothAdapter mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
  //  private HeatMap heatMap;
    private TextView pressureTextView;
    private SciChartSurface chart;
    private static final int WIDTH = 300, HEIGHT = 200;
    private FastUniformHeatmapRenderableSeries heatmapRenderableSeries;
    private BroadcastReceiver mReceiver=new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Constants.DATA)) {
                String data = intent.getStringExtra("DATA");
                if (data.contains("ccccc")) {
                    Log.d("DATA contain weight tag", data);
                    int index = data.indexOf('/');
                    int indexx = data.indexOf('#');
                    String d = data.substring((index + 1), indexx);
                    Log.d(TAG + "Reduce data", d);
                    pressureTextView.setText(Integer.parseInt(d)+" psi");
                    DoubleValues doubleValues=new DoubleValues(1);
                    doubleValues.add(Double.parseDouble(d));
                    dataSeries.updateZValues(doubleValues);

                }
            }
            else if (intent.getAction().equals(Constants.DISCONNECTED)) {
                Toast.makeText(PressureSensorActivity.this, "Disconnected...", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(PressureSensorActivity.this, MainActivity.class));
                PressureSensorActivity.this.finish();
            }
        }
    };
    private final UniformHeatmapDataSeries<Integer, Integer, Double> dataSeries =
            new UniformHeatmapDataSeries<>(Integer.class, Integer.class, Double.class, WIDTH, HEIGHT);
   // private SciChartBuilder sciChartBuilder = SciChartBuilder.init(this);
    private final IPaletteProvider paletteProvider=new CustomUniformHeatMapProvider();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pressure_sensor);
        SpannableString s = new SpannableString("Pressure Sensor");
        s.setSpan(new ForegroundColorSpan(Color.BLACK), 0,"Pressure Sensor".length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        getSupportActionBar().setTitle(s);
        pressureTextView=findViewById(R.id.pressure_value_text_view);
        chart=findViewById(R.id.heatmap);
        SciChartBuilder.init(this);
        SciChartBuilder sciChartBuilder=SciChartBuilder.instance();
        final NumericAxis xAxis = sciChartBuilder.newNumericAxis().build();
        final NumericAxis yAxis = sciChartBuilder.newNumericAxis().build();

        FastUniformHeatmapRenderableSeries heatmapRenderableSeries = sciChartBuilder.newUniformHeatmap()
                .withColorMap(new ColorMap(new int[]{DarkBlue, CornflowerBlue, DarkGreen, Chartreuse, Yellow, Red}, new float[]{0f, 0.2f, 0.4f, 0.6f, 0.8f, 1}))
                .withMinimum(0)
                .withMaximum(200)
                .withDataSeries(dataSeries)
                .withPaletteProvider(paletteProvider)
                .build();

        SciChartHeatmapColourMap colourMap=findViewById(R.id.heatmapColourMap);
        colourMap.setMinimum(heatmapRenderableSeries.getMinimum());
        colourMap.setMaximum(heatmapRenderableSeries.getMaximum());
        colourMap.setColorMap(heatmapRenderableSeries.getColorMap());
        Collections.addAll(chart.getXAxes(), xAxis);
        Collections.addAll(chart.getYAxes(), yAxis);
        Collections.addAll(chart.getRenderableSeries(), heatmapRenderableSeries);
        ModifierGroup modifiers = sciChartBuilder.newModifierGroupWithDefaultModifiers()
                .withCursorModifier().withShowTooltip(true).withReceiveHandledEvents(true).build()
                .build();
        Collections.addAll(chart.getChartModifiers(), modifiers);
        LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver,new IntentFilter(Constants.DISCONNECTED));
        LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver,new IntentFilter(Constants.DATA));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver);
        this.finish();
    }

    private class CustomUniformHeatMapProvider extends PaletteProviderBase<FastUniformHeatmapRenderableSeries> implements IUniformHeatmapPaletteProvider {
        private double thresholdValue;
         public CustomUniformHeatMapProvider()
         {
            super(FastUniformHeatmapRenderableSeries.class);
        }

        public void setThresholdValue(double thresholdValue) {
            this.thresholdValue = thresholdValue;
            if(renderableSeries != null)
                renderableSeries.invalidateElement();
        }

        @Override
        public boolean shouldSetColors() {
            return false;
        }
        @Override
        public void update() {
            final FastUniformHeatmapRenderableSeries renderableSeries = this.renderableSeries;
            final UniformHeatmapRenderPassData currentRenderPassData = (UniformHeatmapRenderPassData) renderableSeries.getCurrentRenderPassData();
            final DoubleValues zValues = currentRenderPassData.zValues;
            final IntegerValues zColors = currentRenderPassData.zColors;
            final int size = zValues.size();
            zColors.setSize(size);
            // working with array is much faster than calling set() many times
            final double[] zValuesArray = zValues.getItemsArray();
            final int[] zColorsArray = zColors.getItemsArray();
            for (int zIndex = 0; zIndex < size; zIndex++) {
                final double value = zValuesArray[zIndex];
                Log.d(TAG+" zValuesArray",String.valueOf(value));
                Log.d(TAG+" zColorsArray",String.valueOf(zColorsArray[zIndex]));

                zColorsArray[zIndex] = value > thresholdValue ? Color.BLACK : Color.BLUE;
            }
        }
    }
}

Вот результирующая моя диаграмма тепловых карт, но я не могу обновить ее через ZValues. Любой есть идея, пожалуйста, помогите мне. Спасибо заранее.

Вот моя результирующая диаграмма тепловых карт

1 ответ

Решение

Как я вижу из вашего кода, размер вашей тепловой карты составляет 300x200 ячеек:

   private static final int WIDTH = 300, HEIGHT = 200;
   private final UniformHeatmapDataSeries<Integer, Integer, Double> dataSeries =
            new UniformHeatmapDataSeries<>(Integer.class, Integer.class, Double.class, WIDTH, HEIGHT);

Но вы обновляете только один zValue, а другие zValues ​​в dataSeries останутся с двойными значениями по умолчанию:

   DoubleValues doubleValues=new DoubleValues(1);
   doubleValues.add(Double.parseDouble(d));
   dataSeries.updateZValues(doubleValues);

Чтобы исправить код, вам нужно иметь по крайней мере 60000 элементов (у него может быть больше, но только первые элементы WIDTH * HEIGHT будут скопированы и отображены в тепловой карте) в doubleValues, поэтому все ячейки в тепловой карте будут иметь значения не по умолчанию:

   DoubleValues doubleValues=new DoubleValues();
   for (int x = 0; x < WIDTH; x++) {
       for (int y = 0; y < HEIGHT; y++) {
           doubleValues.add(value);
       }
   }
   dataSeries.updateZValues(doubleValues);

Или вы можете обновлять zValues ​​ваших dataSeries один за другим, но это будет намного медленнее, потому что zValue является универсальным параметром и в результате двойное значение будет упаковано / распаковано:

   for (int x = 0; x < WIDTH; x++) {
       for (int y = 0; y < HEIGHT; y++) {
            dataSeries.updateZAt(x, y, value);
       }
   }

Раскрытие информации: я ведущий разработчик в команде SciChart Android

Другие вопросы по тегам