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 { info } from '../../../log/Log';
19fb726d48Sopenharmony_ciimport { renders } from '../../database/ui-worker/ProcedureWorker';
20fb726d48Sopenharmony_ciimport { EmptyRender } from '../../database/ui-worker/cpu/ProcedureWorkerCPU';
21fb726d48Sopenharmony_ciimport { IrqRender, IrqStruct } from '../../database/ui-worker/ProcedureWorkerIrq';
22fb726d48Sopenharmony_ciimport { irqDataSender } from '../../database/data-trafic/IrqDataSender';
23fb726d48Sopenharmony_ciimport { queryAllIrqNames, queryIrqList } from '../../database/sql/Irq.sql';
24fb726d48Sopenharmony_ciimport { rowThreadHandler } from './SpChartManager';
25fb726d48Sopenharmony_ciimport { BaseStruct } from '../../bean/BaseStruct';
26fb726d48Sopenharmony_ci
27fb726d48Sopenharmony_ciexport class SpIrqChart {
28fb726d48Sopenharmony_ci  private readonly trace: SpSystemTrace;
29fb726d48Sopenharmony_ci
30fb726d48Sopenharmony_ci  constructor(trace: SpSystemTrace) {
31fb726d48Sopenharmony_ci    this.trace = trace;
32fb726d48Sopenharmony_ci  }
33fb726d48Sopenharmony_ci
34fb726d48Sopenharmony_ci  async init(parentRow?: TraceRow<BaseStruct>, traceId?: string): Promise<void> {
35fb726d48Sopenharmony_ci    let irqStartTime = new Date().getTime();
36fb726d48Sopenharmony_ci    let irqList = await queryIrqList(traceId);
37fb726d48Sopenharmony_ci    if (irqList.length === 0) {
38fb726d48Sopenharmony_ci      return;
39fb726d48Sopenharmony_ci    }
40fb726d48Sopenharmony_ci    let folder = await this.initFolder(traceId);
41fb726d48Sopenharmony_ci    parentRow?.addChildTraceRow(folder);
42fb726d48Sopenharmony_ci    await this.initData(folder, irqStartTime, irqList, traceId);
43fb726d48Sopenharmony_ci  }
44fb726d48Sopenharmony_ci
45fb726d48Sopenharmony_ci  async initData(
46fb726d48Sopenharmony_ci    folder: TraceRow<BaseStruct>,
47fb726d48Sopenharmony_ci    irqStartTime: number,
48fb726d48Sopenharmony_ci    irqList: Array<{ name: string; cpu: number }>,
49fb726d48Sopenharmony_ci    traceId?: string,
50fb726d48Sopenharmony_ci  ): Promise<void> {
51fb726d48Sopenharmony_ci    //加载irq table所有id和name数据
52fb726d48Sopenharmony_ci    let irqNamesArray = await queryAllIrqNames(traceId);
53fb726d48Sopenharmony_ci    let irqNameMap: Map<number, string> = new Map();
54fb726d48Sopenharmony_ci    irqNamesArray.forEach((it) => {
55fb726d48Sopenharmony_ci      irqNameMap.set(it.id, it.ipiName);
56fb726d48Sopenharmony_ci    });
57fb726d48Sopenharmony_ci    info('irqList data size is: ', irqList!.length);
58fb726d48Sopenharmony_ci    if (!traceId) {
59fb726d48Sopenharmony_ci      this.trace.rowsEL?.appendChild(folder);
60fb726d48Sopenharmony_ci    }
61fb726d48Sopenharmony_ci    for (let i = 0; i < irqList.length; i++) {
62fb726d48Sopenharmony_ci      const it = irqList[i];
63fb726d48Sopenharmony_ci      this.addIrqRow(it, i, folder, irqNameMap, traceId);
64fb726d48Sopenharmony_ci    }
65fb726d48Sopenharmony_ci    let durTime = new Date().getTime() - irqStartTime;
66fb726d48Sopenharmony_ci    info('The time to load the ClockData is: ', durTime);
67fb726d48Sopenharmony_ci  }
68fb726d48Sopenharmony_ci
69fb726d48Sopenharmony_ci  addIrqRow(
70fb726d48Sopenharmony_ci    it: { name: string; cpu: number },
71fb726d48Sopenharmony_ci    index: number,
72fb726d48Sopenharmony_ci    folder: TraceRow<BaseStruct>,
73fb726d48Sopenharmony_ci    irqNameMap: Map<number, string>,
74fb726d48Sopenharmony_ci    traceId?: string,
75fb726d48Sopenharmony_ci  ): void {
76fb726d48Sopenharmony_ci    let traceRow = TraceRow.skeleton<IrqStruct>(traceId);
77fb726d48Sopenharmony_ci    traceRow.rowId = it.name + it.cpu;
78fb726d48Sopenharmony_ci    traceRow.rowType = TraceRow.ROW_TYPE_IRQ;
79fb726d48Sopenharmony_ci    traceRow.rowParentId = folder.rowId;
80fb726d48Sopenharmony_ci    traceRow.style.height = '40px';
81fb726d48Sopenharmony_ci    traceRow.name = `${it.name} Cpu ${it.cpu}`;
82fb726d48Sopenharmony_ci    traceRow.rowHidden = !folder.expansion;
83fb726d48Sopenharmony_ci    traceRow.setAttribute('children', '');
84fb726d48Sopenharmony_ci    traceRow.setAttribute('callId', `${it.cpu}`);
85fb726d48Sopenharmony_ci    traceRow.setAttribute('cat', `${it.name}`);
86fb726d48Sopenharmony_ci    traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
87fb726d48Sopenharmony_ci    traceRow.selectChangeHandler = this.trace.selectChangeHandler;
88fb726d48Sopenharmony_ci    traceRow.supplierFrame = (): Promise<IrqStruct[]> => {
89fb726d48Sopenharmony_ci      return irqDataSender(it.cpu, it.name, traceRow).then((irqs) => {
90fb726d48Sopenharmony_ci        irqs.forEach((irq): void => {
91fb726d48Sopenharmony_ci          let irqName = irqNameMap.get(irq.id!);
92fb726d48Sopenharmony_ci          irq.name = irqName || '';
93fb726d48Sopenharmony_ci        });
94fb726d48Sopenharmony_ci        return irqs;
95fb726d48Sopenharmony_ci      });
96fb726d48Sopenharmony_ci    };
97fb726d48Sopenharmony_ci    traceRow.focusHandler = (): void => {
98fb726d48Sopenharmony_ci      this.trace?.displayTip(
99fb726d48Sopenharmony_ci        traceRow,
100fb726d48Sopenharmony_ci        IrqStruct.hoverIrqStruct,
101fb726d48Sopenharmony_ci        `<span>${IrqStruct.hoverIrqStruct?.name || ''}</span>`
102fb726d48Sopenharmony_ci      );
103fb726d48Sopenharmony_ci    };
104fb726d48Sopenharmony_ci    traceRow.findHoverStruct = (): void => {
105fb726d48Sopenharmony_ci      IrqStruct.hoverIrqStruct = traceRow.getHoverStruct();
106fb726d48Sopenharmony_ci    };
107fb726d48Sopenharmony_ci    traceRow.onThreadHandler = rowThreadHandler<IrqRender>(
108fb726d48Sopenharmony_ci      'irq',
109fb726d48Sopenharmony_ci      'context',
110fb726d48Sopenharmony_ci      {
111fb726d48Sopenharmony_ci        type: it.name,
112fb726d48Sopenharmony_ci        index: index,
113fb726d48Sopenharmony_ci      },
114fb726d48Sopenharmony_ci      traceRow,
115fb726d48Sopenharmony_ci      this.trace
116fb726d48Sopenharmony_ci    );
117fb726d48Sopenharmony_ci    folder.addChildTraceRow(traceRow);
118fb726d48Sopenharmony_ci  }
119fb726d48Sopenharmony_ci
120fb726d48Sopenharmony_ci  async initFolder(traceId?: string): Promise<TraceRow<BaseStruct>> {
121fb726d48Sopenharmony_ci    let irqFolder = TraceRow.skeleton(traceId);
122fb726d48Sopenharmony_ci    irqFolder.rowId = 'Irqs';
123fb726d48Sopenharmony_ci    irqFolder.index = 0;
124fb726d48Sopenharmony_ci    irqFolder.rowType = TraceRow.ROW_TYPE_IRQ_GROUP;
125fb726d48Sopenharmony_ci    irqFolder.rowParentId = '';
126fb726d48Sopenharmony_ci    irqFolder.style.height = '40px';
127fb726d48Sopenharmony_ci    irqFolder.folder = true;
128fb726d48Sopenharmony_ci    irqFolder.name = 'Irqs'; /* & I/O Latency */
129fb726d48Sopenharmony_ci    irqFolder.favoriteChangeHandler = this.trace.favoriteChangeHandler;
130fb726d48Sopenharmony_ci    irqFolder.selectChangeHandler = this.trace.selectChangeHandler;
131fb726d48Sopenharmony_ci    irqFolder.supplier = (): Promise<Array<BaseStruct>> => new Promise<Array<BaseStruct>>((resolve) => resolve([]));
132fb726d48Sopenharmony_ci    irqFolder.onThreadHandler = (useCache): void => {
133fb726d48Sopenharmony_ci      irqFolder.canvasSave(this.trace.canvasPanelCtx!);
134fb726d48Sopenharmony_ci      if (irqFolder.expansion) {
135fb726d48Sopenharmony_ci        this.trace.canvasPanelCtx?.clearRect(0, 0, irqFolder.frame.width, irqFolder.frame.height);
136fb726d48Sopenharmony_ci      } else {
137fb726d48Sopenharmony_ci        (renders.empty as EmptyRender).renderMainThread(
138fb726d48Sopenharmony_ci          {
139fb726d48Sopenharmony_ci            context: this.trace.canvasPanelCtx,
140fb726d48Sopenharmony_ci            useCache: useCache,
141fb726d48Sopenharmony_ci            type: '',
142fb726d48Sopenharmony_ci          },
143fb726d48Sopenharmony_ci          irqFolder
144fb726d48Sopenharmony_ci        );
145fb726d48Sopenharmony_ci      }
146fb726d48Sopenharmony_ci      irqFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace);
147fb726d48Sopenharmony_ci    };
148fb726d48Sopenharmony_ci    return irqFolder;
149fb726d48Sopenharmony_ci  }
150fb726d48Sopenharmony_ci}
151