1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimport { ColorUtils } from '../component/trace/base/ColorUtils';
17fb726d48Sopenharmony_ciimport { BaseStruct } from './BaseStruct';
18fb726d48Sopenharmony_ci
19fb726d48Sopenharmony_ciexport class CpuFreqStruct extends BaseStruct {
20fb726d48Sopenharmony_ci  static maxFreq: number = 0;
21fb726d48Sopenharmony_ci  static maxFreqName: string = '0 GHz';
22fb726d48Sopenharmony_ci  static hoverCpuFreqStruct: CpuFreqStruct | undefined;
23fb726d48Sopenharmony_ci  static selectCpuFreqStruct: CpuFreqStruct | undefined;
24fb726d48Sopenharmony_ci  cpu: number | undefined;
25fb726d48Sopenharmony_ci  value: number | undefined;
26fb726d48Sopenharmony_ci  startNS: number | undefined;
27fb726d48Sopenharmony_ci  dur: number | undefined; // Self-supplementing, the database is not returned
28fb726d48Sopenharmony_ci
29fb726d48Sopenharmony_ci  static draw(freqCtx: unknown, freqData: CpuFreqStruct): void {
30fb726d48Sopenharmony_ci    if (freqData.frame) {
31fb726d48Sopenharmony_ci      let freqWidth = freqData.frame.width || 0;
32fb726d48Sopenharmony_ci      let freqIndex = freqData.cpu || 0;
33fb726d48Sopenharmony_ci      freqIndex += 2;
34fb726d48Sopenharmony_ci      // @ts-ignore
35fb726d48Sopenharmony_ci      freqCtx.fillStyle = ColorUtils.colorForTid(freqIndex);
36fb726d48Sopenharmony_ci      // @ts-ignore
37fb726d48Sopenharmony_ci      freqCtx.strokeStyle = ColorUtils.colorForTid(freqIndex);
38fb726d48Sopenharmony_ci      if (freqData.startNS === CpuFreqStruct.hoverCpuFreqStruct?.startNS) {
39fb726d48Sopenharmony_ci        // @ts-ignore
40fb726d48Sopenharmony_ci        freqCtx.lineWidth = 1;
41fb726d48Sopenharmony_ci        // @ts-ignore
42fb726d48Sopenharmony_ci        freqCtx.globalAlpha = 0.6;
43fb726d48Sopenharmony_ci        let drawHeight: number = Math.floor(
44fb726d48Sopenharmony_ci          ((freqData.value || 0) * (freqData.frame.height || 0) * 1.0) / CpuFreqStruct.maxFreq
45fb726d48Sopenharmony_ci        );
46fb726d48Sopenharmony_ci        // @ts-ignore
47fb726d48Sopenharmony_ci        freqCtx.fillRect(
48fb726d48Sopenharmony_ci          freqData.frame.x,
49fb726d48Sopenharmony_ci          freqData.frame.y + freqData.frame.height - drawHeight,
50fb726d48Sopenharmony_ci          freqWidth,
51fb726d48Sopenharmony_ci          drawHeight
52fb726d48Sopenharmony_ci        );
53fb726d48Sopenharmony_ci        // @ts-ignore
54fb726d48Sopenharmony_ci        freqCtx.beginPath();
55fb726d48Sopenharmony_ci        // @ts-ignore
56fb726d48Sopenharmony_ci        freqCtx.arc(freqData.frame.x, freqData.frame.y + freqData.frame.height - drawHeight, 3, 0, 2 * Math.PI, true);
57fb726d48Sopenharmony_ci        // @ts-ignore
58fb726d48Sopenharmony_ci        freqCtx.fill();
59fb726d48Sopenharmony_ci        // @ts-ignore
60fb726d48Sopenharmony_ci        freqCtx.globalAlpha = 1.0;
61fb726d48Sopenharmony_ci        // @ts-ignore
62fb726d48Sopenharmony_ci        freqCtx.stroke();
63fb726d48Sopenharmony_ci        // @ts-ignore
64fb726d48Sopenharmony_ci        freqCtx.beginPath();
65fb726d48Sopenharmony_ci        // @ts-ignore
66fb726d48Sopenharmony_ci        freqCtx.moveTo(freqData.frame.x + 3, freqData.frame.y + freqData.frame.height - drawHeight);
67fb726d48Sopenharmony_ci        // @ts-ignore
68fb726d48Sopenharmony_ci        freqCtx.lineWidth = 3;
69fb726d48Sopenharmony_ci        // @ts-ignore
70fb726d48Sopenharmony_ci        freqCtx.lineTo(freqData.frame.x + freqWidth, freqData.frame.y + freqData.frame.height - drawHeight);
71fb726d48Sopenharmony_ci        // @ts-ignore
72fb726d48Sopenharmony_ci        freqCtx.stroke();
73fb726d48Sopenharmony_ci      } else {
74fb726d48Sopenharmony_ci        // @ts-ignore
75fb726d48Sopenharmony_ci        freqCtx.globalAlpha = 0.6;
76fb726d48Sopenharmony_ci        // @ts-ignore
77fb726d48Sopenharmony_ci        freqCtx.lineWidth = 1;
78fb726d48Sopenharmony_ci        let drawHeight: number = Math.floor(
79fb726d48Sopenharmony_ci          ((freqData.value || 0) * (freqData.frame.height || 0)) / CpuFreqStruct.maxFreq
80fb726d48Sopenharmony_ci        );
81fb726d48Sopenharmony_ci        // @ts-ignore
82fb726d48Sopenharmony_ci        freqCtx.fillRect(
83fb726d48Sopenharmony_ci          freqData.frame.x,
84fb726d48Sopenharmony_ci          freqData.frame.y + freqData.frame.height - drawHeight,
85fb726d48Sopenharmony_ci          freqWidth,
86fb726d48Sopenharmony_ci          drawHeight
87fb726d48Sopenharmony_ci        );
88fb726d48Sopenharmony_ci      }
89fb726d48Sopenharmony_ci    }
90fb726d48Sopenharmony_ci    // @ts-ignore
91fb726d48Sopenharmony_ci    freqCtx.globalAlpha = 1.0;
92fb726d48Sopenharmony_ci    // @ts-ignore
93fb726d48Sopenharmony_ci    freqCtx.lineWidth = 1;
94fb726d48Sopenharmony_ci  }
95fb726d48Sopenharmony_ci}
96