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