LvglChart.vue 3.84 KB
Newer Older
wanli's avatar
wanli committed
1 2 3 4 5 6
<template>
  <div :class="className" :style="{ height: height, width: width }" />
</template>

<script>
import * as echarts from "echarts";
wanli's avatar
wanli committed
7
require("echarts/theme/macarons");
wanli's avatar
wanli committed
8 9
import resize from "./mixins/resize";
import { getDateTimeString } from "@/utils/utils";
wanli's avatar
wanli committed
10
import { wsNotify } from "@/utils/eventBus.js";
wanli's avatar
wanli committed
11

wanli's avatar
wanli committed
12 13
let chart = null

wanli's avatar
wanli committed
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
const seriesData = {
  frag_pct: [],
  free_biggest_size: [],
  free_cnt: [],
  free_size: [],
  total_size: [],
  used_cnt: [],
  used_pct: [],
};

export default {
  mixins: [resize],
  props: {
    className: {
      type: String,
      default: "chart",
    },
    width: {
      type: String,
      default: "100%",
    },
    height: {
      type: String,
wanli's avatar
wanli committed
37
      default: "270px",
wanli's avatar
wanli committed
38 39 40 41 42 43 44 45 46 47 48 49
    },
    autoResize: {
      type: Boolean,
      default: true,
    },
    chartData: {
      type: Object,
      required: true,
    },
  },
  data() {
    return {
wanli's avatar
wanli committed
50 51
      series: [],
      legendData: Object.keys(seriesData),
wanli's avatar
wanli committed
52 53 54 55 56 57 58 59 60 61 62
    };
  },
  watch: {
    chartData: {
      deep: true,
      handler(val) {
        this.handleMessage(val);
      },
    },
  },
  mounted() {
wanli's avatar
wanli committed
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
    let array = [];
    Object.keys(seriesData).forEach((k) => {
      array.push({
        name: k,
        type: "line",
        showSymbol: false,
        emphasis: {
          focus: "series",
          blurScope: "coordinateSystem",
        },
        data: seriesData[k],
      });
    });
    this.series = array;

wanli's avatar
wanli committed
78 79 80
    this.$nextTick(() => {
      this.initChart();
    });
wanli's avatar
wanli committed
81

82 83 84 85 86 87 88 89 90
    wsNotify.eventBus.$on("exportImg", () => {
      let picInfo = chart.getDataURL({
        type: "png",
        pixelRatio: 1.5,
        backgroundColor: "#fff",
      });
      wsNotify.eventBus.$emit("exported", { type: "lvgl", data: picInfo });
    });

wanli's avatar
wanli committed
91
    wsNotify.eventBus.$on("resize", () => {
wanli's avatar
wanli committed
92 93 94 95
      if (chart) chart.resize()
    });

    wsNotify.eventBus.$on("clear-lvgl-chart", () => {
96
      chart.clear()
wanli's avatar
wanli committed
97
      this.setOptions()
wanli's avatar
wanli committed
98
    });
wanli's avatar
wanli committed
99 100
  },
  beforeDestroy() {
wanli's avatar
wanli committed
101
    if (!chart) {
wanli's avatar
wanli committed
102 103
      return;
    }
wanli's avatar
wanli committed
104 105
    chart.dispose();
    chart = null;
wanli's avatar
wanli committed
106 107 108 109 110 111 112 113 114
  },
  methods: {
    handleData(data) {
      Object.keys(seriesData).forEach(key => {
        seriesData[key] = []
      });
      this.series.forEach(item => {
        item.data = []
      });
wanli's avatar
wanli committed
115
      chart.setOption({ series: this.series });
wanli's avatar
wanli committed
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132

      data.forEach((item) => {
        this.handleMessage(item);
      });
    },
    handleMessage(data) {
      Object.keys(data).forEach((k) => {
        var t = getDateTimeString(new Date());
        if (k == "timestamp") t = data[k];
        if (this.legendData.includes(k))
          seriesData[k].push({
            name: k,
            value: [t, data[k]],
          });
      });

      this.$nextTick(() => {
wanli's avatar
wanli committed
133 134
        chart &&
          chart.setOption({
wanli's avatar
wanli committed
135 136 137 138 139
            series: this.series,
          });
      });
    },
    initChart() {
wanli's avatar
wanli committed
140
      chart = echarts.init(this.$el, "macarons");
wanli's avatar
wanli committed
141 142 143
      this.setOptions();
    },
    setOptions() {
wanli's avatar
wanli committed
144
      chart.setOption({
wanli's avatar
wanli committed
145 146 147
        title: {
          text: "LVGL",
        },
wanli's avatar
wanli committed
148 149 150 151 152 153 154
        grid: {
          left: 10,
          right: 10,
          bottom: 10,
          top: 50,
          containLabel: true,
        },
wanli's avatar
wanli committed
155 156 157
        xAxis: {
          type: "time",
          splitLine: {
wanli's avatar
wanli committed
158

wanli's avatar
wanli committed
159 160 161 162 163 164 165 166 167
          },
          axisLabel: {
            formatter: "{HH}:{mm}:{ss}",
          },
        },
        yAxis: {
          type: "value",
          // boundaryGap: [0, "100%"],
          splitLine: {
wanli's avatar
wanli committed
168

wanli's avatar
wanli committed
169 170 171 172 173 174 175 176 177 178 179 180
          },
        },
        tooltip: {
          trigger: "axis",
          axisPointer: {
            type: "cross",
            animation: false,
          },
          padding: [5, 10],
        },
        legend: {
          data: this.legendData,
wanli's avatar
wanli committed
181 182 183 184 185 186 187
          selected: {
            frag_pct: false,
            free_biggest_size: false,
            free_cnt: false,
            free_size: false,
            total_size: false,
          },
wanli's avatar
wanli committed
188 189 190 191 192 193 194
        },
        series: this.series,
      });
    },
  },
};
</script>