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 { SpSystemTrace } from '../SpSystemTrace';
17fb726d48Sopenharmony_ciimport { TraceRow } from '../trace/base/TraceRow';
18fb726d48Sopenharmony_ciimport { renders } from '../../database/ui-worker/ProcedureWorker';
19fb726d48Sopenharmony_ciimport { FlagsConfig } from '../SpFlags';
20fb726d48Sopenharmony_ciimport { CpuFreqStruct } from '../../database/ui-worker/ProcedureWorkerFreq';
21fb726d48Sopenharmony_ciimport {
22fb726d48Sopenharmony_ci  queryFanceNameList,
23fb726d48Sopenharmony_ci  queryFpsNameList,
24fb726d48Sopenharmony_ci  queryRealFpsList,
25fb726d48Sopenharmony_ci  queryRSNowTimeList,
26fb726d48Sopenharmony_ci  querySignaledList,
27fb726d48Sopenharmony_ci  querySkipDataList,
28fb726d48Sopenharmony_ci} from '../../database/sql/Ltpo.sql';
29fb726d48Sopenharmony_ciimport { LtpoRender, LtpoStruct } from '../../database/ui-worker/ProcedureWorkerLTPO';
30fb726d48Sopenharmony_ciimport { HitchTimeStruct, hitchTimeRender } from '../../database/ui-worker/ProcedureWorkerHitchTime';
31fb726d48Sopenharmony_ciimport { lostFrameSender } from '../../database/data-trafic/LostFrameSender';
32fb726d48Sopenharmony_ci
33fb726d48Sopenharmony_ciexport class SpLtpoChart {
34fb726d48Sopenharmony_ci  private readonly trace: SpSystemTrace | undefined;
35fb726d48Sopenharmony_ci  static APP_STARTUP_PID_ARR: Array<number> = [];
36fb726d48Sopenharmony_ci  static jsonRow: TraceRow<CpuFreqStruct> | undefined;
37fb726d48Sopenharmony_ci  static trace: SpSystemTrace;
38fb726d48Sopenharmony_ci  static presentArr: Array<LtpoStruct> = [];
39fb726d48Sopenharmony_ci  static fanceNameList: Array<LtpoStruct> = [];
40fb726d48Sopenharmony_ci  static fpsnameList: Array<LtpoStruct> = [];
41fb726d48Sopenharmony_ci  static realFpsList: Array<LtpoStruct> = [];
42fb726d48Sopenharmony_ci  static rsNowTimeList: Array<LtpoStruct> = [];
43fb726d48Sopenharmony_ci  static skipDataList: Array<LtpoStruct> = [];
44fb726d48Sopenharmony_ci  static ltpoDataArr: Array<LtpoStruct> = [];
45fb726d48Sopenharmony_ci  static sendLTPODataArr: Array<LtpoStruct> = [];
46fb726d48Sopenharmony_ci  static sendHitchDataArr: Array<LtpoStruct> = [];
47fb726d48Sopenharmony_ci  static signaledFence: Array<LtpoStruct> = [];
48fb726d48Sopenharmony_ci  static tempRsNowTimeList: Array<LtpoStruct> = [];
49fb726d48Sopenharmony_ci  static threadName: String = 'Present%';
50fb726d48Sopenharmony_ci  static funName: String = 'H:Waiting for Present Fence%';
51fb726d48Sopenharmony_ci  static signaledList: Array<LtpoStruct> = [];
52fb726d48Sopenharmony_ci  constructor(trace: SpSystemTrace) {
53fb726d48Sopenharmony_ci    SpLtpoChart.trace = trace;
54fb726d48Sopenharmony_ci  }
55fb726d48Sopenharmony_ci
56fb726d48Sopenharmony_ci  async init() {
57fb726d48Sopenharmony_ci    let loadLtpo: boolean = FlagsConfig.getFlagsConfigEnableStatus('LTPO');
58fb726d48Sopenharmony_ci    if (!loadLtpo) {
59fb726d48Sopenharmony_ci      return;
60fb726d48Sopenharmony_ci    }
61fb726d48Sopenharmony_ci    SpLtpoChart.ltpoDataArr = [];
62fb726d48Sopenharmony_ci    SpLtpoChart.fanceNameList = await queryFanceNameList();
63fb726d48Sopenharmony_ci    SpLtpoChart.fpsnameList = await queryFpsNameList();
64fb726d48Sopenharmony_ci    SpLtpoChart.realFpsList = await queryRealFpsList();
65fb726d48Sopenharmony_ci    SpLtpoChart.rsNowTimeList = await queryRSNowTimeList();
66fb726d48Sopenharmony_ci    SpLtpoChart.skipDataList = await querySkipDataList();
67fb726d48Sopenharmony_ci    SpLtpoChart.signaledList = await querySignaledList();
68fb726d48Sopenharmony_ci    this.initFenceName();
69fb726d48Sopenharmony_ci    this.initFpsName();
70fb726d48Sopenharmony_ci    if (SpLtpoChart.realFpsList.length > 0) {
71fb726d48Sopenharmony_ci      this.initRealFps();
72fb726d48Sopenharmony_ci    }
73fb726d48Sopenharmony_ci    this.initRsNowTime();
74fb726d48Sopenharmony_ci    //特殊情况:当前trace的RSHardwareThrea泳道最前面多一个单独的fence
75fb726d48Sopenharmony_ci    if (SpLtpoChart.fpsnameList.length > 0 && SpLtpoChart.fanceNameList.length - SpLtpoChart.fpsnameList.length === 1) {
76fb726d48Sopenharmony_ci      if (Number(SpLtpoChart.fanceNameList[0].ts) < Number(SpLtpoChart.fpsnameList[0].ts)) {
77fb726d48Sopenharmony_ci        SpLtpoChart.fanceNameList.splice(0, 1);
78fb726d48Sopenharmony_ci      }
79fb726d48Sopenharmony_ci    }
80fb726d48Sopenharmony_ci    if (SpLtpoChart.fanceNameList!.length && SpLtpoChart.fpsnameList.length !== SpLtpoChart.fanceNameList.length) {
81fb726d48Sopenharmony_ci      let fpsIndex = 0;
82fb726d48Sopenharmony_ci      let fanceIndex = 0;
83fb726d48Sopenharmony_ci      while (fpsIndex < SpLtpoChart.fpsnameList!.length) {
84fb726d48Sopenharmony_ci        if (SpLtpoChart.fanceNameList[fanceIndex] && SpLtpoChart.fpsnameList[fpsIndex]) {
85fb726d48Sopenharmony_ci          if (
86fb726d48Sopenharmony_ci            SpLtpoChart.fanceNameList[fanceIndex].ts! > SpLtpoChart.fpsnameList[fpsIndex].ts! &&
87fb726d48Sopenharmony_ci            SpLtpoChart.fanceNameList[fanceIndex].ts! <
88fb726d48Sopenharmony_ci            SpLtpoChart.fpsnameList[fpsIndex].ts! + SpLtpoChart.fpsnameList[fpsIndex].dur!
89fb726d48Sopenharmony_ci          ) {
90fb726d48Sopenharmony_ci            fpsIndex++;
91fb726d48Sopenharmony_ci            fanceIndex++;
92fb726d48Sopenharmony_ci          } else if (SpLtpoChart.fanceNameList[fanceIndex].ts! < SpLtpoChart.fpsnameList[fpsIndex].ts!) {
93fb726d48Sopenharmony_ci            SpLtpoChart.fanceNameList.splice(fanceIndex, 1);
94fb726d48Sopenharmony_ci          } else if (
95fb726d48Sopenharmony_ci            SpLtpoChart.fanceNameList[fanceIndex].ts! >
96fb726d48Sopenharmony_ci            SpLtpoChart.fpsnameList[fpsIndex].ts! + SpLtpoChart.fpsnameList[fpsIndex].dur!
97fb726d48Sopenharmony_ci          ) {
98fb726d48Sopenharmony_ci            SpLtpoChart.fpsnameList.splice(fpsIndex, 1);
99fb726d48Sopenharmony_ci          }
100fb726d48Sopenharmony_ci        } else if (SpLtpoChart.fanceNameList[fanceIndex] && !SpLtpoChart.fpsnameList[fpsIndex]) {
101fb726d48Sopenharmony_ci          SpLtpoChart.fanceNameList.splice(fanceIndex);
102fb726d48Sopenharmony_ci        } else if (!SpLtpoChart.fanceNameList[fanceIndex] && SpLtpoChart.fpsnameList[fpsIndex]) {
103fb726d48Sopenharmony_ci          SpLtpoChart.fpsnameList.splice(fpsIndex);
104fb726d48Sopenharmony_ci        } else {
105fb726d48Sopenharmony_ci          return;
106fb726d48Sopenharmony_ci        }
107fb726d48Sopenharmony_ci      }
108fb726d48Sopenharmony_ci    }
109fb726d48Sopenharmony_ci    if (SpLtpoChart.fanceNameList!.length && SpLtpoChart.fpsnameList.length === SpLtpoChart.fanceNameList.length) {
110fb726d48Sopenharmony_ci      for (let i = 0; i < SpLtpoChart.fanceNameList.length; i++) {
111fb726d48Sopenharmony_ci        let tmpFps = SpLtpoChart.fpsnameList[i]!.fps ? Number(SpLtpoChart.fpsnameList[i]!.fps) : 60;
112fb726d48Sopenharmony_ci        let signaled = Number(SpLtpoChart.fanceNameList[i]!.signaled);
113fb726d48Sopenharmony_ci        let startTime = Number(SpLtpoChart.fanceNameList[i]!.ts);
114fb726d48Sopenharmony_ci        let durtaion = Number(SpLtpoChart.fanceNameList[i]!.dur);
115fb726d48Sopenharmony_ci        if (SpLtpoChart.fanceNameList[i]!.signaled) {
116fb726d48Sopenharmony_ci          this.pushLtpoData(
117fb726d48Sopenharmony_ci            SpLtpoChart.ltpoDataArr,
118fb726d48Sopenharmony_ci            SpLtpoChart.fanceNameList[i]!.fanceId!,
119fb726d48Sopenharmony_ci            tmpFps,
120fb726d48Sopenharmony_ci            signaled,
121fb726d48Sopenharmony_ci            startTime,
122fb726d48Sopenharmony_ci            durtaion,
123fb726d48Sopenharmony_ci            0,
124fb726d48Sopenharmony_ci            0
125fb726d48Sopenharmony_ci          );
126fb726d48Sopenharmony_ci        } else {
127fb726d48Sopenharmony_ci          this.pushLtpoData(SpLtpoChart.ltpoDataArr, SpLtpoChart.fanceNameList[i]!.fanceId!, tmpFps, 0, 0, 0, 0, 0);
128fb726d48Sopenharmony_ci        }
129fb726d48Sopenharmony_ci      }
130fb726d48Sopenharmony_ci    } else {
131fb726d48Sopenharmony_ci      return;
132fb726d48Sopenharmony_ci    }
133fb726d48Sopenharmony_ci    this.fenceToFps();
134fb726d48Sopenharmony_ci    this.fpsToRenderService();
135fb726d48Sopenharmony_ci    this.filterNowTime();
136fb726d48Sopenharmony_ci    if (SpLtpoChart.fanceNameList && SpLtpoChart.fanceNameList.length) {
137fb726d48Sopenharmony_ci      await this.initFolder();
138fb726d48Sopenharmony_ci      await this.initHitchTime();
139fb726d48Sopenharmony_ci    }
140fb726d48Sopenharmony_ci  }
141fb726d48Sopenharmony_ci  //提取FenceId
142fb726d48Sopenharmony_ci  initFenceName(): void {
143fb726d48Sopenharmony_ci    SpLtpoChart.fanceNameList.map((item) => {
144fb726d48Sopenharmony_ci      let cutFanceNameArr = item.name!.split(' ');
145fb726d48Sopenharmony_ci      if (cutFanceNameArr[cutFanceNameArr.length - 1] === 'signaled') {
146fb726d48Sopenharmony_ci        item.fanceId = Number(cutFanceNameArr[2]);
147fb726d48Sopenharmony_ci        item.signaled = 1;
148fb726d48Sopenharmony_ci        SpLtpoChart.signaledFence.push(item);
149fb726d48Sopenharmony_ci      } else {
150fb726d48Sopenharmony_ci        item.fanceId = Number(cutFanceNameArr[cutFanceNameArr.length - 1]);
151fb726d48Sopenharmony_ci      }
152fb726d48Sopenharmony_ci    });
153fb726d48Sopenharmony_ci  }
154fb726d48Sopenharmony_ci  //从数据库中查询的name中提取fps
155fb726d48Sopenharmony_ci  initFpsName(): void {
156fb726d48Sopenharmony_ci    SpLtpoChart.fpsnameList.map((item) => {
157fb726d48Sopenharmony_ci      if (item.name!.indexOf('=') === -1) {
158fb726d48Sopenharmony_ci        let cutFpsNameArr = item.name!.split(',')[0].split(':');
159fb726d48Sopenharmony_ci        let cutFpsNameTimeArr = item.name!.split(',')[1].split(':');
160fb726d48Sopenharmony_ci        item.fps = Number(cutFpsNameArr[cutFpsNameArr.length - 1]);
161fb726d48Sopenharmony_ci        item.nowTime = Number(cutFpsNameTimeArr[cutFpsNameTimeArr.length - 1]);
162fb726d48Sopenharmony_ci      } else {
163fb726d48Sopenharmony_ci        let cutFpsNameArr = item.name!.split('=');
164fb726d48Sopenharmony_ci        item.fps = Number(cutFpsNameArr[cutFpsNameArr.length - 1]);
165fb726d48Sopenharmony_ci      }
166fb726d48Sopenharmony_ci    });
167fb726d48Sopenharmony_ci  }
168fb726d48Sopenharmony_ci  //如果存在切帧,提取fps
169fb726d48Sopenharmony_ci  initRealFps(): void {
170fb726d48Sopenharmony_ci    SpLtpoChart.realFpsList.map((item) => {
171fb726d48Sopenharmony_ci      let cutRealFpsArr = item.name!.split(' ');
172fb726d48Sopenharmony_ci      item.fps = Number(cutRealFpsArr[cutRealFpsArr.length - 1]);
173fb726d48Sopenharmony_ci    });
174fb726d48Sopenharmony_ci    this.setRealFps();
175fb726d48Sopenharmony_ci  }
176fb726d48Sopenharmony_ci  //从render_service中获取nowTime
177fb726d48Sopenharmony_ci  initRsNowTime(): void {
178fb726d48Sopenharmony_ci    SpLtpoChart.rsNowTimeList.map((item) => {
179fb726d48Sopenharmony_ci      let cutRsNameArr = item.name!.split(' ')[2].split(':');
180fb726d48Sopenharmony_ci      item.nowTime = Number(cutRsNameArr[cutRsNameArr.length - 1]);
181fb726d48Sopenharmony_ci    });
182fb726d48Sopenharmony_ci  }
183fb726d48Sopenharmony_ci  //处理fps
184fb726d48Sopenharmony_ci  setRealFps(): void {
185fb726d48Sopenharmony_ci    let moreIndex = 0;
186fb726d48Sopenharmony_ci    let reallIndex = 0;
187fb726d48Sopenharmony_ci    while (moreIndex < SpLtpoChart.fpsnameList.length) {
188fb726d48Sopenharmony_ci      let itemMoreEndTs =
189fb726d48Sopenharmony_ci        Number(SpLtpoChart.fpsnameList[moreIndex].ts) + Number(SpLtpoChart.fpsnameList[moreIndex].dur);
190fb726d48Sopenharmony_ci      if (Number(SpLtpoChart.realFpsList[reallIndex].ts) < itemMoreEndTs) {
191fb726d48Sopenharmony_ci        //此时这一帧包含了两个fps,将真实的fps赋给SpLtpoChart.fpsnameList
192fb726d48Sopenharmony_ci        SpLtpoChart.fpsnameList[moreIndex].fps = SpLtpoChart.realFpsList[reallIndex].fps;
193fb726d48Sopenharmony_ci        moreIndex++;
194fb726d48Sopenharmony_ci        if (reallIndex < SpLtpoChart.realFpsList.length - 1) {
195fb726d48Sopenharmony_ci          //判断SpLtpoChart.realFpsList有没有遍历完,没有就继续
196fb726d48Sopenharmony_ci          reallIndex++;
197fb726d48Sopenharmony_ci        } else {
198fb726d48Sopenharmony_ci          //否则跳出
199fb726d48Sopenharmony_ci          return;
200fb726d48Sopenharmony_ci        }
201fb726d48Sopenharmony_ci      } else {
202fb726d48Sopenharmony_ci        //如果不满足的话,SpLtpoChart.fpsnameList数组往下走,而reallIndex不变
203fb726d48Sopenharmony_ci        moreIndex++;
204fb726d48Sopenharmony_ci      }
205fb726d48Sopenharmony_ci    }
206fb726d48Sopenharmony_ci  }
207fb726d48Sopenharmony_ci  //RSHardwareThread泳道的fps数组集成FenceId数组中的FenceId和signaled
208fb726d48Sopenharmony_ci  fenceToFps() {
209fb726d48Sopenharmony_ci    if (SpLtpoChart.fanceNameList.length === SpLtpoChart.fpsnameList.length) {
210fb726d48Sopenharmony_ci      let fenceIndex = 0;
211fb726d48Sopenharmony_ci      let fpsIndex = 0;
212fb726d48Sopenharmony_ci      while (fpsIndex < SpLtpoChart.fpsnameList.length) {
213fb726d48Sopenharmony_ci        if (SpLtpoChart.fpsnameList[fpsIndex] && SpLtpoChart.fanceNameList[fenceIndex]) {
214fb726d48Sopenharmony_ci          if (
215fb726d48Sopenharmony_ci            SpLtpoChart.fanceNameList[fenceIndex].ts! > SpLtpoChart.fpsnameList[fpsIndex].ts! &&
216fb726d48Sopenharmony_ci            SpLtpoChart.fanceNameList[fenceIndex].ts! <
217fb726d48Sopenharmony_ci            SpLtpoChart.fpsnameList[fpsIndex].ts! + SpLtpoChart.fpsnameList[fpsIndex].dur!
218fb726d48Sopenharmony_ci          ) {
219fb726d48Sopenharmony_ci            SpLtpoChart.fpsnameList[fpsIndex].fanceId = SpLtpoChart.fanceNameList[fenceIndex].fanceId;
220fb726d48Sopenharmony_ci            if (SpLtpoChart.fanceNameList[fenceIndex].signaled) {
221fb726d48Sopenharmony_ci              SpLtpoChart.fpsnameList[fpsIndex].signaled = SpLtpoChart.fanceNameList[fenceIndex].signaled;
222fb726d48Sopenharmony_ci            }
223fb726d48Sopenharmony_ci            fenceIndex++;
224fb726d48Sopenharmony_ci            fpsIndex++;
225fb726d48Sopenharmony_ci          } else if (SpLtpoChart.fanceNameList[fenceIndex].ts! < SpLtpoChart.fpsnameList[fpsIndex].ts!) {
226fb726d48Sopenharmony_ci            fenceIndex++;
227fb726d48Sopenharmony_ci          } else if (
228fb726d48Sopenharmony_ci            SpLtpoChart.fanceNameList[fenceIndex].ts! >
229fb726d48Sopenharmony_ci            SpLtpoChart.fpsnameList[fpsIndex].ts! + SpLtpoChart.fpsnameList[fpsIndex].dur!
230fb726d48Sopenharmony_ci          ) {
231fb726d48Sopenharmony_ci            fpsIndex++;
232fb726d48Sopenharmony_ci          }
233fb726d48Sopenharmony_ci        } else {
234fb726d48Sopenharmony_ci          return;
235fb726d48Sopenharmony_ci        }
236fb726d48Sopenharmony_ci      }
237fb726d48Sopenharmony_ci    }
238fb726d48Sopenharmony_ci  }
239fb726d48Sopenharmony_ci  //render_service的nowTime 集成RSHardThread泳道Fps数组的FenceId和Signaled
240fb726d48Sopenharmony_ci  fpsToRenderService(): void {
241fb726d48Sopenharmony_ci    let rsIndex = 0;
242fb726d48Sopenharmony_ci    let hardIndex = 0;
243fb726d48Sopenharmony_ci    while (rsIndex < SpLtpoChart.rsNowTimeList.length) {
244fb726d48Sopenharmony_ci      if (SpLtpoChart.fpsnameList[hardIndex] && SpLtpoChart.rsNowTimeList[rsIndex]) {
245fb726d48Sopenharmony_ci        if (SpLtpoChart.rsNowTimeList[rsIndex].nowTime! > SpLtpoChart.fpsnameList[hardIndex].nowTime!) {
246fb726d48Sopenharmony_ci          //处理nowTime不一致的情况
247fb726d48Sopenharmony_ci          hardIndex++;
248fb726d48Sopenharmony_ci        } else if (SpLtpoChart.rsNowTimeList[rsIndex].nowTime! < SpLtpoChart.fpsnameList[hardIndex].nowTime!) {
249fb726d48Sopenharmony_ci          rsIndex++;
250fb726d48Sopenharmony_ci        } else {
251fb726d48Sopenharmony_ci          SpLtpoChart.rsNowTimeList[rsIndex].fanceId = SpLtpoChart.fpsnameList[hardIndex].fanceId;
252fb726d48Sopenharmony_ci          SpLtpoChart.rsNowTimeList[rsIndex].fps = SpLtpoChart.fpsnameList[hardIndex].fps;
253fb726d48Sopenharmony_ci          if (SpLtpoChart.fpsnameList[hardIndex].signaled) {
254fb726d48Sopenharmony_ci            SpLtpoChart.rsNowTimeList[rsIndex].signaled = SpLtpoChart.fpsnameList[hardIndex].signaled;
255fb726d48Sopenharmony_ci          }
256fb726d48Sopenharmony_ci          hardIndex++;
257fb726d48Sopenharmony_ci          rsIndex++;
258fb726d48Sopenharmony_ci        }
259fb726d48Sopenharmony_ci      } else {
260fb726d48Sopenharmony_ci        return;
261fb726d48Sopenharmony_ci      }
262fb726d48Sopenharmony_ci    }
263fb726d48Sopenharmony_ci  }
264fb726d48Sopenharmony_ci  //render_service中找出skip和signaled,将需要从上平时间减去的时间计算出来存在对应的nowTime的item中
265fb726d48Sopenharmony_ci  filterNowTime(): void {
266fb726d48Sopenharmony_ci    let skipIndex = 0;
267fb726d48Sopenharmony_ci    let nowTimeIndex = 0;
268fb726d48Sopenharmony_ci    let cutTimeSum = 0;
269fb726d48Sopenharmony_ci    let tempFps = 0; //如果中间出现signaled,记录一下fps;
270fb726d48Sopenharmony_ci    //将render_service中的nowTime数组中的skip去除掉
271fb726d48Sopenharmony_ci    SpLtpoChart.tempRsNowTimeList = SpLtpoChart.rsNowTimeList.filter((item) => item.fps);
272fb726d48Sopenharmony_ci    while (skipIndex < SpLtpoChart.skipDataList.length) {
273fb726d48Sopenharmony_ci      if (SpLtpoChart.skipDataList[skipIndex] && SpLtpoChart.tempRsNowTimeList[nowTimeIndex]) {
274fb726d48Sopenharmony_ci        if (SpLtpoChart.skipDataList[skipIndex].ts! > SpLtpoChart.tempRsNowTimeList[nowTimeIndex].ts!) {
275fb726d48Sopenharmony_ci          if (cutTimeSum > 0 && nowTimeIndex > 0) {
276fb726d48Sopenharmony_ci            SpLtpoChart.tempRsNowTimeList[nowTimeIndex - 1].cutTime = cutTimeSum;
277fb726d48Sopenharmony_ci            if (!SpLtpoChart.tempRsNowTimeList[nowTimeIndex].signaled) {
278fb726d48Sopenharmony_ci              cutTimeSum = 0;
279fb726d48Sopenharmony_ci            }
280fb726d48Sopenharmony_ci          }
281fb726d48Sopenharmony_ci          if (SpLtpoChart.tempRsNowTimeList[nowTimeIndex].signaled && nowTimeIndex > 0) {
282fb726d48Sopenharmony_ci            //两帧之间初心signaled
283fb726d48Sopenharmony_ci            tempFps = SpLtpoChart.tempRsNowTimeList[nowTimeIndex].fps!;
284fb726d48Sopenharmony_ci            cutTimeSum += 1000 / tempFps;
285fb726d48Sopenharmony_ci            SpLtpoChart.tempRsNowTimeList[nowTimeIndex - 1].cutTime = cutTimeSum;
286fb726d48Sopenharmony_ci            SpLtpoChart.tempRsNowTimeList.splice(nowTimeIndex, 1);
287fb726d48Sopenharmony_ci          } else {
288fb726d48Sopenharmony_ci            nowTimeIndex++;
289fb726d48Sopenharmony_ci            cutTimeSum = 0;
290fb726d48Sopenharmony_ci            tempFps = 0;
291fb726d48Sopenharmony_ci          }
292fb726d48Sopenharmony_ci        } else if (SpLtpoChart.skipDataList[skipIndex].ts! <= SpLtpoChart.tempRsNowTimeList[nowTimeIndex].ts!) {
293fb726d48Sopenharmony_ci          if (nowTimeIndex > 0) {
294fb726d48Sopenharmony_ci            cutTimeSum += tempFps ? 1000 / tempFps : 1000 / SpLtpoChart.tempRsNowTimeList[nowTimeIndex - 1].fps!;
295fb726d48Sopenharmony_ci          }
296fb726d48Sopenharmony_ci          skipIndex++;
297fb726d48Sopenharmony_ci        }
298fb726d48Sopenharmony_ci      } else {
299fb726d48Sopenharmony_ci        return;
300fb726d48Sopenharmony_ci      }
301fb726d48Sopenharmony_ci    }
302fb726d48Sopenharmony_ci  }
303fb726d48Sopenharmony_ci  pushLtpoData(
304fb726d48Sopenharmony_ci    lptoArr: unknown[] | undefined,
305fb726d48Sopenharmony_ci    fanceId: Number,
306fb726d48Sopenharmony_ci    fps: Number,
307fb726d48Sopenharmony_ci    signaled: Number,
308fb726d48Sopenharmony_ci    startTs: Number,
309fb726d48Sopenharmony_ci    dur: Number,
310fb726d48Sopenharmony_ci    nextStartTs: Number,
311fb726d48Sopenharmony_ci    nextDur: number
312fb726d48Sopenharmony_ci  ): void {
313fb726d48Sopenharmony_ci    lptoArr?.push({
314fb726d48Sopenharmony_ci      fanceId: fanceId,
315fb726d48Sopenharmony_ci      fps: fps,
316fb726d48Sopenharmony_ci      signaled: signaled,
317fb726d48Sopenharmony_ci      startTs: startTs,
318fb726d48Sopenharmony_ci      dur: dur,
319fb726d48Sopenharmony_ci      nextStartTs: nextStartTs,
320fb726d48Sopenharmony_ci      nextDur: nextDur,
321fb726d48Sopenharmony_ci    });
322fb726d48Sopenharmony_ci  }
323fb726d48Sopenharmony_ci  sendDataHandle(presentArr: LtpoStruct[], ltpoDataArr: LtpoStruct[]): Array<LtpoStruct> {
324fb726d48Sopenharmony_ci    let sendDataArr: LtpoStruct[] = [];
325fb726d48Sopenharmony_ci    let ltpoDataIndex = 0;
326fb726d48Sopenharmony_ci    let tempRsNowTimeIndex = 0;
327fb726d48Sopenharmony_ci    let presentIndex = 0;
328fb726d48Sopenharmony_ci    let ltpoIndex = 0;
329fb726d48Sopenharmony_ci    //当有present缺失时:
330fb726d48Sopenharmony_ci    this.deleteUselessFence(presentArr, ltpoDataArr);
331fb726d48Sopenharmony_ci    while (presentIndex < presentArr.length) {
332fb726d48Sopenharmony_ci      if (presentArr[presentIndex] && ltpoDataArr[ltpoIndex]) {
333fb726d48Sopenharmony_ci        if (
334fb726d48Sopenharmony_ci          // @ts-ignore
335fb726d48Sopenharmony_ci          presentArr[presentIndex].startTime! + presentArr[presentIndex].dur! - (window as unknown).recordStartNS ===
336fb726d48Sopenharmony_ci          TraceRow.range!.totalNS
337fb726d48Sopenharmony_ci        ) {
338fb726d48Sopenharmony_ci          presentArr.splice(presentIndex, 1);
339fb726d48Sopenharmony_ci        }
340fb726d48Sopenharmony_ci        if (presentArr[presentIndex].presentId === ltpoDataArr[ltpoIndex].fanceId) {
341fb726d48Sopenharmony_ci          // @ts-ignore
342fb726d48Sopenharmony_ci          ltpoDataArr[ltpoIndex].startTs = Number(presentArr[presentIndex].startTime) - (window as unknown).recordStartNS;
343fb726d48Sopenharmony_ci          ltpoDataArr[ltpoIndex].dur = presentArr[presentIndex].dur;
344fb726d48Sopenharmony_ci          ltpoDataArr[ltpoIndex].nextStartTs = presentArr[presentIndex + 1]
345fb726d48Sopenharmony_ci            // @ts-ignore
346fb726d48Sopenharmony_ci            ? Number(presentArr[presentIndex + 1].startTime) - (window as unknown).recordStartNS
347fb726d48Sopenharmony_ci            : '';
348fb726d48Sopenharmony_ci          ltpoDataArr[ltpoIndex].nextDur = presentArr[presentIndex + 1] ? presentArr[presentIndex + 1].dur : 0;
349fb726d48Sopenharmony_ci          presentIndex++;
350fb726d48Sopenharmony_ci          ltpoIndex++;
351fb726d48Sopenharmony_ci        } else if (presentArr[presentIndex].presentId! < ltpoDataArr[ltpoIndex].fanceId!) {
352fb726d48Sopenharmony_ci          presentArr.splice(presentIndex, 1);
353fb726d48Sopenharmony_ci        } else if (presentArr[presentIndex].presentId! > ltpoDataArr[ltpoIndex].fanceId!) {
354fb726d48Sopenharmony_ci          ltpoDataArr.splice(ltpoIndex, 1);
355fb726d48Sopenharmony_ci        }
356fb726d48Sopenharmony_ci      } else {
357fb726d48Sopenharmony_ci        break;
358fb726d48Sopenharmony_ci      }
359fb726d48Sopenharmony_ci    }
360fb726d48Sopenharmony_ci    while (ltpoDataIndex < ltpoDataArr.length) {
361fb726d48Sopenharmony_ci      let sendStartTs: number | undefined = 0;
362fb726d48Sopenharmony_ci      let sendDur: number | undefined = 0;
363fb726d48Sopenharmony_ci      let cutSendDur: number | undefined = 0;
364fb726d48Sopenharmony_ci      if (ltpoDataArr[ltpoDataIndex] && SpLtpoChart.tempRsNowTimeList[tempRsNowTimeIndex]) {
365fb726d48Sopenharmony_ci        if (ltpoDataArr[ltpoDataIndex].fanceId! < SpLtpoChart.tempRsNowTimeList[tempRsNowTimeIndex].fanceId!) {
366fb726d48Sopenharmony_ci          if (ltpoDataArr[ltpoDataIndex].fanceId !== -1 && ltpoDataArr[ltpoDataIndex].nextDur) {
367fb726d48Sopenharmony_ci            sendStartTs = Number(ltpoDataArr[ltpoDataIndex].startTs) + Number(ltpoDataArr[ltpoDataIndex].dur);
368fb726d48Sopenharmony_ci            sendDur =
369fb726d48Sopenharmony_ci              Number(ltpoDataArr[ltpoDataIndex].nextStartTs) + Number(ltpoDataArr[ltpoDataIndex].nextDur) - sendStartTs;
370fb726d48Sopenharmony_ci          }
371fb726d48Sopenharmony_ci          let tmpDur = cutSendDur ? Math.ceil(cutSendDur / 100000) / 10 : Math.ceil(sendDur / 100000) / 10;
372fb726d48Sopenharmony_ci          if (tmpDur < 170) {
373fb726d48Sopenharmony_ci            sendDataArr.push({
374fb726d48Sopenharmony_ci              dur: sendDur,
375fb726d48Sopenharmony_ci              cutSendDur: cutSendDur,
376fb726d48Sopenharmony_ci              value: 0,
377fb726d48Sopenharmony_ci              startTs: sendStartTs,
378fb726d48Sopenharmony_ci              pid: ltpoDataArr[ltpoDataIndex].fanceId,
379fb726d48Sopenharmony_ci              itid: ltpoDataArr[ltpoDataIndex].fanceId,
380fb726d48Sopenharmony_ci              name: undefined,
381fb726d48Sopenharmony_ci              presentId: ltpoDataArr[ltpoDataIndex].fanceId,
382fb726d48Sopenharmony_ci              ts: undefined,
383fb726d48Sopenharmony_ci              fanceId: ltpoDataArr[ltpoDataIndex].fanceId,
384fb726d48Sopenharmony_ci              fps: ltpoDataArr[ltpoDataIndex].fps,
385fb726d48Sopenharmony_ci              nextStartTs: ltpoDataArr[ltpoDataIndex].nextStartTs,
386fb726d48Sopenharmony_ci              nextDur: ltpoDataArr[ltpoDataIndex].nextDur,
387fb726d48Sopenharmony_ci              translateY: undefined,
388fb726d48Sopenharmony_ci              isHover: false,
389fb726d48Sopenharmony_ci              startTime: undefined,
390fb726d48Sopenharmony_ci              signaled: undefined,
391fb726d48Sopenharmony_ci              nowTime: undefined,
392fb726d48Sopenharmony_ci              cutTime: undefined,
393fb726d48Sopenharmony_ci              frame: undefined,
394fb726d48Sopenharmony_ci            });
395fb726d48Sopenharmony_ci          }
396fb726d48Sopenharmony_ci          ltpoDataIndex++;
397fb726d48Sopenharmony_ci        } else if (ltpoDataArr[ltpoDataIndex].fanceId! > SpLtpoChart.tempRsNowTimeList[tempRsNowTimeIndex].fanceId!) {
398fb726d48Sopenharmony_ci          tempRsNowTimeIndex++;
399fb726d48Sopenharmony_ci        } else {
400fb726d48Sopenharmony_ci          if (SpLtpoChart.tempRsNowTimeList[tempRsNowTimeIndex].cutTime) {
401fb726d48Sopenharmony_ci            cutSendDur = sendDur - SpLtpoChart.tempRsNowTimeList[tempRsNowTimeIndex].cutTime! * 1000000;
402fb726d48Sopenharmony_ci            cutSendDur = cutSendDur < 0 ? 0 : cutSendDur;
403fb726d48Sopenharmony_ci          }
404fb726d48Sopenharmony_ci          if (ltpoDataArr[ltpoDataIndex].fanceId !== -1 && ltpoDataArr[ltpoDataIndex].nextDur) {
405fb726d48Sopenharmony_ci            sendStartTs = Number(ltpoDataArr[ltpoDataIndex].startTs) + Number(ltpoDataArr[ltpoDataIndex].dur);
406fb726d48Sopenharmony_ci            sendDur =
407fb726d48Sopenharmony_ci              Number(ltpoDataArr[ltpoDataIndex].nextStartTs) + Number(ltpoDataArr[ltpoDataIndex].nextDur) - sendStartTs;
408fb726d48Sopenharmony_ci          }
409fb726d48Sopenharmony_ci          let tmpDur = cutSendDur ? Math.ceil(cutSendDur / 100000) / 10 : Math.ceil(sendDur / 100000) / 10;
410fb726d48Sopenharmony_ci          if (tmpDur < 170) {
411fb726d48Sopenharmony_ci            sendDataArr.push({
412fb726d48Sopenharmony_ci              dur: sendDur,
413fb726d48Sopenharmony_ci              cutSendDur: cutSendDur,
414fb726d48Sopenharmony_ci              value: 0,
415fb726d48Sopenharmony_ci              startTs: sendStartTs,
416fb726d48Sopenharmony_ci              pid: ltpoDataArr[ltpoDataIndex].fanceId,
417fb726d48Sopenharmony_ci              itid: ltpoDataArr[ltpoDataIndex].fanceId,
418fb726d48Sopenharmony_ci              name: undefined,
419fb726d48Sopenharmony_ci              presentId: ltpoDataArr[ltpoDataIndex].fanceId,
420fb726d48Sopenharmony_ci              ts: undefined,
421fb726d48Sopenharmony_ci              fanceId: ltpoDataArr[ltpoDataIndex].fanceId,
422fb726d48Sopenharmony_ci              fps: ltpoDataArr[ltpoDataIndex].fps,
423fb726d48Sopenharmony_ci              nextStartTs: ltpoDataArr[ltpoDataIndex].nextStartTs,
424fb726d48Sopenharmony_ci              nextDur: ltpoDataArr[ltpoDataIndex].nextDur,
425fb726d48Sopenharmony_ci              translateY: undefined,
426fb726d48Sopenharmony_ci              isHover: false,
427fb726d48Sopenharmony_ci              startTime: undefined,
428fb726d48Sopenharmony_ci              signaled: undefined,
429fb726d48Sopenharmony_ci              nowTime: undefined,
430fb726d48Sopenharmony_ci              cutTime: undefined,
431fb726d48Sopenharmony_ci              frame: undefined,
432fb726d48Sopenharmony_ci            });
433fb726d48Sopenharmony_ci          }
434fb726d48Sopenharmony_ci          ltpoDataIndex++;
435fb726d48Sopenharmony_ci          tempRsNowTimeIndex++;
436fb726d48Sopenharmony_ci        }
437fb726d48Sopenharmony_ci      } else {
438fb726d48Sopenharmony_ci        break;
439fb726d48Sopenharmony_ci      }
440fb726d48Sopenharmony_ci    }
441fb726d48Sopenharmony_ci    return sendDataArr;
442fb726d48Sopenharmony_ci  }
443fb726d48Sopenharmony_ci  deleteUselessFence(presentArr: LtpoStruct[], ltpoDataArr: LtpoStruct[]) {
444fb726d48Sopenharmony_ci    //当有present缺失时:
445fb726d48Sopenharmony_ci    let presentIndex = 0;
446fb726d48Sopenharmony_ci    let fpsIndex = 0;
447fb726d48Sopenharmony_ci    while (fpsIndex < ltpoDataArr.length) {
448fb726d48Sopenharmony_ci      //遍历present,把ltpoDataArr中不包含present中presentFance的item舍弃掉
449fb726d48Sopenharmony_ci      if (presentArr[presentIndex] && ltpoDataArr[fpsIndex]) {
450fb726d48Sopenharmony_ci        if (Number(presentArr[presentIndex].presentId) < Number(ltpoDataArr[fpsIndex].fanceId)) {
451fb726d48Sopenharmony_ci          presentArr.splice(presentIndex, 1);
452fb726d48Sopenharmony_ci        } else if (Number(presentArr[presentIndex].presentId) > Number(ltpoDataArr[fpsIndex].fanceId)) {
453fb726d48Sopenharmony_ci          ltpoDataArr.splice(fpsIndex, 1);
454fb726d48Sopenharmony_ci        } else {
455fb726d48Sopenharmony_ci          if (presentIndex === presentArr.length - 1 && fpsIndex < ltpoDataArr.length - 1) {
456fb726d48Sopenharmony_ci            //此时present已经遍历到最后一项,如果ltpoDataArr还没有遍历到最后一项,就把后面的舍弃掉
457fb726d48Sopenharmony_ci            ltpoDataArr.splice(fpsIndex);
458fb726d48Sopenharmony_ci          }
459fb726d48Sopenharmony_ci          presentIndex++;
460fb726d48Sopenharmony_ci          fpsIndex++;
461fb726d48Sopenharmony_ci        }
462fb726d48Sopenharmony_ci      } else {
463fb726d48Sopenharmony_ci        return;
464fb726d48Sopenharmony_ci      }
465fb726d48Sopenharmony_ci    }
466fb726d48Sopenharmony_ci  }
467fb726d48Sopenharmony_ci  //六舍七入
468fb726d48Sopenharmony_ci  specialValue(num: number) {
469fb726d48Sopenharmony_ci    if (num < 0.7) {
470fb726d48Sopenharmony_ci      return 0;
471fb726d48Sopenharmony_ci    } else {
472fb726d48Sopenharmony_ci      if (!num.toString().split('.')[1]) {
473fb726d48Sopenharmony_ci        return num;
474fb726d48Sopenharmony_ci      } else {
475fb726d48Sopenharmony_ci        let tempNum = Number(num.toString().split('.')[1].charAt(0));
476fb726d48Sopenharmony_ci        if (tempNum > 6) {
477fb726d48Sopenharmony_ci          return Math.ceil(num);
478fb726d48Sopenharmony_ci        } else {
479fb726d48Sopenharmony_ci          return Math.floor(num);
480fb726d48Sopenharmony_ci        }
481fb726d48Sopenharmony_ci      }
482fb726d48Sopenharmony_ci    }
483fb726d48Sopenharmony_ci  }
484fb726d48Sopenharmony_ci
485fb726d48Sopenharmony_ci  async initFolder() {
486fb726d48Sopenharmony_ci    SpLtpoChart.presentArr = [];
487fb726d48Sopenharmony_ci    let row: TraceRow<LtpoStruct> = TraceRow.skeleton<LtpoStruct>();
488fb726d48Sopenharmony_ci    row.rowId = SpLtpoChart.fanceNameList!.length ? `LTPO ${SpLtpoChart.fanceNameList[0].fanceId}` : '';
489fb726d48Sopenharmony_ci    row.rowParentId = '';
490fb726d48Sopenharmony_ci    row.rowType = TraceRow.ROW_TYPE_LTPO;
491fb726d48Sopenharmony_ci    row.folder = false;
492fb726d48Sopenharmony_ci    row.style.height = '40px';
493fb726d48Sopenharmony_ci    row.name = `Lost Frames`;
494fb726d48Sopenharmony_ci    row.favoriteChangeHandler = SpLtpoChart.trace.favoriteChangeHandler;
495fb726d48Sopenharmony_ci    row.selectChangeHandler = SpLtpoChart.trace.selectChangeHandler;
496fb726d48Sopenharmony_ci    row.supplierFrame = () => {
497fb726d48Sopenharmony_ci      return lostFrameSender(SpLtpoChart.threadName, SpLtpoChart.funName, row).then((res) => {
498fb726d48Sopenharmony_ci        SpLtpoChart.presentArr = res;
499fb726d48Sopenharmony_ci        SpLtpoChart.sendLTPODataArr = this.sendDataHandle(SpLtpoChart.presentArr, SpLtpoChart.ltpoDataArr);
500fb726d48Sopenharmony_ci        for (let i = 0; i < SpLtpoChart.sendLTPODataArr.length; i++) {
501fb726d48Sopenharmony_ci          let tmpDur = SpLtpoChart.sendLTPODataArr[i].cutSendDur
502fb726d48Sopenharmony_ci            ? SpLtpoChart.sendLTPODataArr[i].cutSendDur! / 1000000
503fb726d48Sopenharmony_ci            : SpLtpoChart.sendLTPODataArr[i].dur! / 1000000;
504fb726d48Sopenharmony_ci          let mathValue = (tmpDur * Number(SpLtpoChart.sendLTPODataArr[i].fps)) / 1000 - 1;
505fb726d48Sopenharmony_ci          SpLtpoChart.sendLTPODataArr[i].value = this.specialValue(mathValue);
506fb726d48Sopenharmony_ci        }
507fb726d48Sopenharmony_ci        return SpLtpoChart.sendLTPODataArr;
508fb726d48Sopenharmony_ci      });
509fb726d48Sopenharmony_ci    };
510fb726d48Sopenharmony_ci    row.focusHandler = () => {
511fb726d48Sopenharmony_ci      SpLtpoChart.trace?.displayTip(
512fb726d48Sopenharmony_ci        row!,
513fb726d48Sopenharmony_ci        LtpoStruct.hoverLtpoStruct,
514fb726d48Sopenharmony_ci        `<span>${LtpoStruct.hoverLtpoStruct?.value!}</span>`
515fb726d48Sopenharmony_ci      );
516fb726d48Sopenharmony_ci    };
517fb726d48Sopenharmony_ci    row.findHoverStruct = (): void => {
518fb726d48Sopenharmony_ci      LtpoStruct.hoverLtpoStruct = row.getHoverStruct(true, false, 'value');
519fb726d48Sopenharmony_ci    };
520fb726d48Sopenharmony_ci    row.onThreadHandler = (useCache): void => {
521fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
522fb726d48Sopenharmony_ci      if (row.currentContext) {
523fb726d48Sopenharmony_ci        context = row.currentContext;
524fb726d48Sopenharmony_ci      } else {
525fb726d48Sopenharmony_ci        context = row.collect ? SpLtpoChart.trace.canvasFavoritePanelCtx! : SpLtpoChart.trace.canvasPanelCtx!;
526fb726d48Sopenharmony_ci      }
527fb726d48Sopenharmony_ci      row.canvasSave(context);
528fb726d48Sopenharmony_ci      (renders['ltpo-present'] as LtpoRender).renderMainThread(
529fb726d48Sopenharmony_ci        {
530fb726d48Sopenharmony_ci          ltpoContext: context,
531fb726d48Sopenharmony_ci          useCache: useCache,
532fb726d48Sopenharmony_ci          type: `ltpo-present ${row.rowId}`,
533fb726d48Sopenharmony_ci        },
534fb726d48Sopenharmony_ci        row
535fb726d48Sopenharmony_ci      );
536fb726d48Sopenharmony_ci      row.canvasRestore(context);
537fb726d48Sopenharmony_ci    };
538fb726d48Sopenharmony_ci    SpLtpoChart.trace.rowsEL?.appendChild(row);
539fb726d48Sopenharmony_ci  }
540fb726d48Sopenharmony_ci  async initHitchTime() {
541fb726d48Sopenharmony_ci    SpLtpoChart.presentArr = [];
542fb726d48Sopenharmony_ci    let row: TraceRow<HitchTimeStruct> = TraceRow.skeleton<HitchTimeStruct>();
543fb726d48Sopenharmony_ci    this.takeStaticArg(row);
544fb726d48Sopenharmony_ci    row.supplierFrame = () => {
545fb726d48Sopenharmony_ci      return lostFrameSender(SpLtpoChart.threadName, SpLtpoChart.funName, row).then((res) => {
546fb726d48Sopenharmony_ci        SpLtpoChart.presentArr = res;
547fb726d48Sopenharmony_ci        SpLtpoChart.sendHitchDataArr = this.sendDataHandle(SpLtpoChart.presentArr, SpLtpoChart.ltpoDataArr);
548fb726d48Sopenharmony_ci        for (let i = 0; i < SpLtpoChart.sendHitchDataArr.length; i++) {
549fb726d48Sopenharmony_ci          let tmpVale = 0;
550fb726d48Sopenharmony_ci          let tmpDur = 0;
551fb726d48Sopenharmony_ci          if (SpLtpoChart.sendHitchDataArr[i].cutSendDur) {
552fb726d48Sopenharmony_ci            tmpVale =
553fb726d48Sopenharmony_ci              SpLtpoChart.sendHitchDataArr[i].cutSendDur! / 1000000 - 1000 / SpLtpoChart.sendHitchDataArr[i].fps!;
554fb726d48Sopenharmony_ci            tmpDur = SpLtpoChart.sendHitchDataArr[i].cutSendDur! / 1000000;
555fb726d48Sopenharmony_ci          } else {
556fb726d48Sopenharmony_ci            tmpVale = SpLtpoChart.sendHitchDataArr[i].dur! / 1000000 - 1000 / SpLtpoChart.sendHitchDataArr[i].fps!;
557fb726d48Sopenharmony_ci            tmpDur = SpLtpoChart.sendHitchDataArr[i].dur! / 1000000;
558fb726d48Sopenharmony_ci          }
559fb726d48Sopenharmony_ci
560fb726d48Sopenharmony_ci          let mathValue = (tmpDur * Number(SpLtpoChart.sendHitchDataArr[i].fps)) / 1000 - 1;
561fb726d48Sopenharmony_ci          let finalValue = (tmpVale! / (1000 / SpLtpoChart.sendHitchDataArr[i].fps!)) < 0.7 ? 0 : tmpVale;
562fb726d48Sopenharmony_ci          SpLtpoChart.sendHitchDataArr[i].value = Number(finalValue.toFixed(1));
563fb726d48Sopenharmony_ci          SpLtpoChart.sendHitchDataArr[i].name = this.specialValue(mathValue)!.toString();
564fb726d48Sopenharmony_ci        }
565fb726d48Sopenharmony_ci        return SpLtpoChart.sendHitchDataArr;
566fb726d48Sopenharmony_ci      });
567fb726d48Sopenharmony_ci    };
568fb726d48Sopenharmony_ci    row.focusHandler = () => {
569fb726d48Sopenharmony_ci      SpLtpoChart.trace?.displayTip(
570fb726d48Sopenharmony_ci        row!,
571fb726d48Sopenharmony_ci        HitchTimeStruct.hoverHitchTimeStruct,
572fb726d48Sopenharmony_ci        `<span>${HitchTimeStruct.hoverHitchTimeStruct?.value!}</span>`
573fb726d48Sopenharmony_ci      );
574fb726d48Sopenharmony_ci    };
575fb726d48Sopenharmony_ci    row.findHoverStruct = (): void => {
576fb726d48Sopenharmony_ci      HitchTimeStruct.hoverHitchTimeStruct = row.getHoverStruct(true, false, 'value');
577fb726d48Sopenharmony_ci    };
578fb726d48Sopenharmony_ci    row.onThreadHandler = (useCache): void => {
579fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
580fb726d48Sopenharmony_ci      if (row.currentContext) {
581fb726d48Sopenharmony_ci        context = row.currentContext;
582fb726d48Sopenharmony_ci      } else {
583fb726d48Sopenharmony_ci        context = row.collect ? SpLtpoChart.trace.canvasFavoritePanelCtx! : SpLtpoChart.trace.canvasPanelCtx!;
584fb726d48Sopenharmony_ci      }
585fb726d48Sopenharmony_ci      row.canvasSave(context);
586fb726d48Sopenharmony_ci      (renders['hitch'] as hitchTimeRender).renderMainThread(
587fb726d48Sopenharmony_ci        {
588fb726d48Sopenharmony_ci          hitchTimeContext: context,
589fb726d48Sopenharmony_ci          useCache: useCache,
590fb726d48Sopenharmony_ci          type: `hitch ${row.rowId}`,
591fb726d48Sopenharmony_ci        },
592fb726d48Sopenharmony_ci        row
593fb726d48Sopenharmony_ci      );
594fb726d48Sopenharmony_ci      row.canvasRestore(context);
595fb726d48Sopenharmony_ci    };
596fb726d48Sopenharmony_ci    SpLtpoChart.trace.rowsEL?.appendChild(row);
597fb726d48Sopenharmony_ci  }
598fb726d48Sopenharmony_ci  takeStaticArg(row: TraceRow<HitchTimeStruct>) {
599fb726d48Sopenharmony_ci    row.rowId = SpLtpoChart.fanceNameList!.length ? `hitch-time ${SpLtpoChart.fanceNameList[0].fanceId}` : '';
600fb726d48Sopenharmony_ci    row.rowParentId = '';
601fb726d48Sopenharmony_ci    row.rowType = TraceRow.ROW_TYPE_HITCH_TIME;
602fb726d48Sopenharmony_ci    row.folder = false;
603fb726d48Sopenharmony_ci    row.style.height = '40px';
604fb726d48Sopenharmony_ci    row.name = `Hitch Time`;
605fb726d48Sopenharmony_ci    row.favoriteChangeHandler = SpLtpoChart.trace.favoriteChangeHandler;
606fb726d48Sopenharmony_ci    row.selectChangeHandler = SpLtpoChart.trace.selectChangeHandler;
607fb726d48Sopenharmony_ci  }
608fb726d48Sopenharmony_ci}
609