Невозможно обновить мой тепловой график с двойным значением
Я разрабатываю приложение для 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