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_ci 19fb726d48Sopenharmony_ciimport { BaseStruct } from '../../bean/BaseStruct'; 20fb726d48Sopenharmony_ciimport { CounterStruct, SdkCounterRender } from '../../database/ui-worker/ProduceWorkerSdkCounter'; 21fb726d48Sopenharmony_ciimport { renders } from '../../database/ui-worker/ProcedureWorker'; 22fb726d48Sopenharmony_ciimport { SdkSliceRender, SdkSliceStruct } from '../../database/ui-worker/ProduceWorkerSdkSlice'; 23fb726d48Sopenharmony_ciimport { EmptyRender } from '../../database/ui-worker/cpu/ProcedureWorkerCPU'; 24fb726d48Sopenharmony_ciimport { TabUtil } from '../trace/sheet/sdk/TabUtil'; 25fb726d48Sopenharmony_ciimport { queryCounterMax, querySdkCount, querySdkCounterData, querySdkSliceData } from '../../database/sql/Sdk.sql'; 26fb726d48Sopenharmony_ciimport { queryStartTime } from '../../database/sql/SqlLite.sql'; 27fb726d48Sopenharmony_ciimport { NUM_7 } from '../../bean/NumBean'; 28fb726d48Sopenharmony_ci 29fb726d48Sopenharmony_ciexport class SpSdkChart { 30fb726d48Sopenharmony_ci trace: SpSystemTrace; 31fb726d48Sopenharmony_ci private pluginName = 'dubai-plugin'; 32fb726d48Sopenharmony_ci 33fb726d48Sopenharmony_ci constructor(trace: SpSystemTrace) { 34fb726d48Sopenharmony_ci this.trace = trace; 35fb726d48Sopenharmony_ci } 36fb726d48Sopenharmony_ci 37fb726d48Sopenharmony_ci private parseJsonByCounterType(startTime: number, showType: unknown, configObj: unknown, table: unknown): void { 38fb726d48Sopenharmony_ci let chartSql = this.createSql( 39fb726d48Sopenharmony_ci startTime, //@ts-ignore 40fb726d48Sopenharmony_ci showType.tableName, //@ts-ignore 41fb726d48Sopenharmony_ci showType.columns, 42fb726d48Sopenharmony_ci 'where counter_id' + ' = $counter_id' 43fb726d48Sopenharmony_ci ); //@ts-ignore 44fb726d48Sopenharmony_ci let maxValue = this.createMaxValueSql(showType.tableName, 'where counter_id = $counter_id'); //@ts-ignore 45fb726d48Sopenharmony_ci let innerTable = showType.inner; 46fb726d48Sopenharmony_ci let countSql = this.createSql(startTime, innerTable.tableName, innerTable.columns); //@ts-ignore 47fb726d48Sopenharmony_ci table.push({ 48fb726d48Sopenharmony_ci countSql: countSql, 49fb726d48Sopenharmony_ci chartSql: chartSql, 50fb726d48Sopenharmony_ci maxSql: maxValue, 51fb726d48Sopenharmony_ci type: 'counter', //@ts-ignore 52fb726d48Sopenharmony_ci name: configObj.disPlayName, //@ts-ignore 53fb726d48Sopenharmony_ci pluginName: configObj.pluginName, 54fb726d48Sopenharmony_ci }); 55fb726d48Sopenharmony_ci } 56fb726d48Sopenharmony_ci 57fb726d48Sopenharmony_ci private parseJsonBySliceType(startTime: number, showType: unknown, configObj: unknown, table: unknown[]): void { 58fb726d48Sopenharmony_ci let chartSql = this.createSliceSql( 59fb726d48Sopenharmony_ci startTime, //@ts-ignore 60fb726d48Sopenharmony_ci showType.tableName, //@ts-ignore 61fb726d48Sopenharmony_ci showType.columns, 62fb726d48Sopenharmony_ci 'where' + ` slice_id = $column_id and (start_ts - ${startTime}) between $startNS and $endNS;` 63fb726d48Sopenharmony_ci ); //@ts-ignore 64fb726d48Sopenharmony_ci let innerTable = showType.inner; 65fb726d48Sopenharmony_ci let countSql; 66fb726d48Sopenharmony_ci let countOtherSql = ''; //@ts-ignore 67fb726d48Sopenharmony_ci if (configObj.pluginName === this.pluginName) { 68fb726d48Sopenharmony_ci countSql = this.createSql(startTime, innerTable.tableName, innerTable.columns, 'where slice_name like $suffix'); 69fb726d48Sopenharmony_ci countOtherSql = this.createSql( 70fb726d48Sopenharmony_ci startTime, 71fb726d48Sopenharmony_ci innerTable.tableName, 72fb726d48Sopenharmony_ci innerTable.columns, 73fb726d48Sopenharmony_ci '' + 74fb726d48Sopenharmony_ci "where slice_name not like '%_cpu' and slice_name not like '%_display' and " + 75fb726d48Sopenharmony_ci "slice_name not like '%_gpu' and slice_name not like '%_System_idle' and " + 76fb726d48Sopenharmony_ci "slice_name not like '%_wifi_data' and slice_name not like '%_sensor' and " + 77fb726d48Sopenharmony_ci "slice_name not like '%_audio' " 78fb726d48Sopenharmony_ci ); 79fb726d48Sopenharmony_ci } else { 80fb726d48Sopenharmony_ci countSql = this.createSql(startTime, innerTable.tableName, innerTable.columns); 81fb726d48Sopenharmony_ci } 82fb726d48Sopenharmony_ci table.push({ 83fb726d48Sopenharmony_ci countSql: countSql, 84fb726d48Sopenharmony_ci chartSql: chartSql, 85fb726d48Sopenharmony_ci type: 'slice', //@ts-ignore 86fb726d48Sopenharmony_ci name: configObj.disPlayName, //@ts-ignore 87fb726d48Sopenharmony_ci pluginName: configObj.pluginName, 88fb726d48Sopenharmony_ci countOtherSql: countOtherSql, 89fb726d48Sopenharmony_ci }); 90fb726d48Sopenharmony_ci } 91fb726d48Sopenharmony_ci 92fb726d48Sopenharmony_ci parseJson(startTime: number, map: Map<number, string>): Map<number, unknown> { 93fb726d48Sopenharmony_ci let tablesMap = new Map(); 94fb726d48Sopenharmony_ci let keys = map.keys(); 95fb726d48Sopenharmony_ci for (let key of keys) { 96fb726d48Sopenharmony_ci let table: unknown[] = []; 97fb726d48Sopenharmony_ci let configObj: unknown = map.get(key); 98fb726d48Sopenharmony_ci if (configObj !== undefined) { 99fb726d48Sopenharmony_ci //@ts-ignore 100fb726d48Sopenharmony_ci let configStr = configObj.jsonConfig; 101fb726d48Sopenharmony_ci let json = JSON.parse(configStr); 102fb726d48Sopenharmony_ci let tableConfig = json.tableConfig; 103fb726d48Sopenharmony_ci if (tableConfig !== null) { 104fb726d48Sopenharmony_ci let showTypes = tableConfig.showType; 105fb726d48Sopenharmony_ci for (let i = 0; i < showTypes.length; i++) { 106fb726d48Sopenharmony_ci let showType = showTypes[i]; 107fb726d48Sopenharmony_ci let type = TabUtil.getTableType(showType); 108fb726d48Sopenharmony_ci if (type === 'counter') { 109fb726d48Sopenharmony_ci this.parseJsonByCounterType(startTime, showType, configObj, table); 110fb726d48Sopenharmony_ci } else if (type === 'slice') { 111fb726d48Sopenharmony_ci this.parseJsonBySliceType(startTime, showType, configObj, table); 112fb726d48Sopenharmony_ci } 113fb726d48Sopenharmony_ci } 114fb726d48Sopenharmony_ci tablesMap.set(key, table); 115fb726d48Sopenharmony_ci } 116fb726d48Sopenharmony_ci } 117fb726d48Sopenharmony_ci } 118fb726d48Sopenharmony_ci return tablesMap; 119fb726d48Sopenharmony_ci } 120fb726d48Sopenharmony_ci 121fb726d48Sopenharmony_ci private createSliceSql(startTime: number, tableName: string, columns: Array<unknown>, where?: string): string { 122fb726d48Sopenharmony_ci let sliceSelectSql = 'select '; 123fb726d48Sopenharmony_ci for (let i = 0; i < columns.length; i++) { 124fb726d48Sopenharmony_ci let column = columns[i]; //@ts-ignore 125fb726d48Sopenharmony_ci if (column.column === 'start_ts') { 126fb726d48Sopenharmony_ci //@ts-ignore 127fb726d48Sopenharmony_ci column.column = `(start_ts - ${startTime}) AS start_ts`; 128fb726d48Sopenharmony_ci } //@ts-ignore 129fb726d48Sopenharmony_ci if (column.column === 'end_ts') { 130fb726d48Sopenharmony_ci //@ts-ignore 131fb726d48Sopenharmony_ci column.column = `(end_ts - ${startTime}) AS end_ts`; 132fb726d48Sopenharmony_ci } 133fb726d48Sopenharmony_ci if (i === columns.length - 1) { 134fb726d48Sopenharmony_ci //@ts-ignore 135fb726d48Sopenharmony_ci sliceSelectSql = `${sliceSelectSql + column.column} `; 136fb726d48Sopenharmony_ci } else { 137fb726d48Sopenharmony_ci //@ts-ignore 138fb726d48Sopenharmony_ci sliceSelectSql = `${sliceSelectSql + column.column}, `; 139fb726d48Sopenharmony_ci } 140fb726d48Sopenharmony_ci } 141fb726d48Sopenharmony_ci sliceSelectSql = `${sliceSelectSql}from ${tableName}`; 142fb726d48Sopenharmony_ci if (where !== undefined) { 143fb726d48Sopenharmony_ci sliceSelectSql = `${sliceSelectSql} ${where}`; 144fb726d48Sopenharmony_ci } 145fb726d48Sopenharmony_ci return sliceSelectSql; 146fb726d48Sopenharmony_ci } 147fb726d48Sopenharmony_ci 148fb726d48Sopenharmony_ci private createMaxValueSql(tableName: string, where?: string): string { 149fb726d48Sopenharmony_ci let selectSql = `select max(value) as max_value from ${tableName}`; 150fb726d48Sopenharmony_ci if (where !== undefined) { 151fb726d48Sopenharmony_ci selectSql = `${selectSql} ${where}`; 152fb726d48Sopenharmony_ci } 153fb726d48Sopenharmony_ci return selectSql; 154fb726d48Sopenharmony_ci } 155fb726d48Sopenharmony_ci 156fb726d48Sopenharmony_ci private createSql(startTime: number, tableName: string, columns: Array<unknown>, where?: string): string { 157fb726d48Sopenharmony_ci let selectSql = 'select '; 158fb726d48Sopenharmony_ci for (let i = 0; i < columns.length; i++) { 159fb726d48Sopenharmony_ci let column = columns[i]; //@ts-ignore 160fb726d48Sopenharmony_ci if (column.column === 'ts') { 161fb726d48Sopenharmony_ci //@ts-ignore 162fb726d48Sopenharmony_ci column.column = `ts - ${startTime} AS ts`; 163fb726d48Sopenharmony_ci } 164fb726d48Sopenharmony_ci if (i === columns.length - 1) { 165fb726d48Sopenharmony_ci //@ts-ignore 166fb726d48Sopenharmony_ci selectSql = `${selectSql + column.column} `; 167fb726d48Sopenharmony_ci } else { 168fb726d48Sopenharmony_ci //@ts-ignore 169fb726d48Sopenharmony_ci selectSql = `${selectSql + column.column}, `; 170fb726d48Sopenharmony_ci } 171fb726d48Sopenharmony_ci } 172fb726d48Sopenharmony_ci selectSql = `${selectSql}from ${tableName}`; 173fb726d48Sopenharmony_ci if (where !== undefined) { 174fb726d48Sopenharmony_ci selectSql = `${selectSql} ${where}`; 175fb726d48Sopenharmony_ci } 176fb726d48Sopenharmony_ci return selectSql; 177fb726d48Sopenharmony_ci } 178fb726d48Sopenharmony_ci 179fb726d48Sopenharmony_ci async init(): Promise<void> { 180fb726d48Sopenharmony_ci let configMap = SpSystemTrace.SDK_CONFIG_MAP; 181fb726d48Sopenharmony_ci if (configMap === undefined) { 182fb726d48Sopenharmony_ci return; 183fb726d48Sopenharmony_ci } 184fb726d48Sopenharmony_ci let res = await queryStartTime(); 185fb726d48Sopenharmony_ci //@ts-ignore 186fb726d48Sopenharmony_ci let startTime = res[0].start_ts; 187fb726d48Sopenharmony_ci // @ts-ignore 188fb726d48Sopenharmony_ci let tablesMap = this.parseJson(startTime, configMap); 189fb726d48Sopenharmony_ci let tableKeys = tablesMap.keys(); 190fb726d48Sopenharmony_ci for (let componentId of tableKeys) { 191fb726d48Sopenharmony_ci let table = tablesMap.get(componentId); 192fb726d48Sopenharmony_ci if (table !== null) { 193fb726d48Sopenharmony_ci //@ts-ignore 194fb726d48Sopenharmony_ci let nodeRow = this.initNodeRow(componentId, table[0].name); //@ts-ignore 195fb726d48Sopenharmony_ci for (let index = 0; index < table.length; index++) { 196fb726d48Sopenharmony_ci //@ts-ignore 197fb726d48Sopenharmony_ci let sqlMap = table[index]; 198fb726d48Sopenharmony_ci if (sqlMap.type === 'counter') { 199fb726d48Sopenharmony_ci let result = await querySdkCount(sqlMap.countSql, componentId); 200fb726d48Sopenharmony_ci for (let i = 0; i < result.length; i++) { 201fb726d48Sopenharmony_ci await this.initCounter(nodeRow, i, result[i], sqlMap, componentId); 202fb726d48Sopenharmony_ci } 203fb726d48Sopenharmony_ci } else if (sqlMap.type === 'slice' && sqlMap.pluginName === this.pluginName) { 204fb726d48Sopenharmony_ci let suffixList = ['cpu', 'display', 'gpu', 'System_idle', 'wifi_data', 'sensor', 'audio']; 205fb726d48Sopenharmony_ci for (let i = 0; i < suffixList.length; i++) { 206fb726d48Sopenharmony_ci let result = await querySdkCount(sqlMap.countSql, componentId, { $suffix: `%${suffixList[i]}` }); 207fb726d48Sopenharmony_ci if (result.length > 0) { 208fb726d48Sopenharmony_ci let groupNodeRow = await this.initSecondaryRow(nodeRow, i, suffixList[i]); 209fb726d48Sopenharmony_ci for (let i = 0; i < result.length; i++) { 210fb726d48Sopenharmony_ci await this.initSlice(groupNodeRow, i, result[i], sqlMap, componentId); 211fb726d48Sopenharmony_ci } 212fb726d48Sopenharmony_ci } 213fb726d48Sopenharmony_ci } 214fb726d48Sopenharmony_ci let result = await querySdkCount(sqlMap.countOtherSql, componentId); 215fb726d48Sopenharmony_ci if (result.length > 0) { 216fb726d48Sopenharmony_ci let groupNodeRow = await this.initSecondaryRow(nodeRow, NUM_7, 'other'); 217fb726d48Sopenharmony_ci for (let i = 0; i < result.length; i++) { 218fb726d48Sopenharmony_ci await this.initSlice(groupNodeRow, i, result[i], sqlMap, componentId); 219fb726d48Sopenharmony_ci } 220fb726d48Sopenharmony_ci } 221fb726d48Sopenharmony_ci } else if (sqlMap.type === 'slice') { 222fb726d48Sopenharmony_ci let result = await querySdkCount(sqlMap.countSql, componentId, {}); 223fb726d48Sopenharmony_ci for (let i = 0; i < result.length; i++) { 224fb726d48Sopenharmony_ci await this.initSlice(nodeRow, i, result[i], sqlMap, componentId); 225fb726d48Sopenharmony_ci } 226fb726d48Sopenharmony_ci } 227fb726d48Sopenharmony_ci } 228fb726d48Sopenharmony_ci } 229fb726d48Sopenharmony_ci } 230fb726d48Sopenharmony_ci } 231fb726d48Sopenharmony_ci 232fb726d48Sopenharmony_ci private initCounterChartRow( 233fb726d48Sopenharmony_ci componentId: number, 234fb726d48Sopenharmony_ci expansion: boolean, 235fb726d48Sopenharmony_ci counterId: string, 236fb726d48Sopenharmony_ci counterName: string 237fb726d48Sopenharmony_ci ): TraceRow<CounterStruct> { 238fb726d48Sopenharmony_ci let traceRow = TraceRow.skeleton<CounterStruct>(); 239fb726d48Sopenharmony_ci traceRow.rowParentId = `Sdk-${componentId}`; 240fb726d48Sopenharmony_ci traceRow.rowHidden = !expansion; 241fb726d48Sopenharmony_ci traceRow.rowId = `${counterId}-${componentId}`; 242fb726d48Sopenharmony_ci traceRow.rowType = TraceRow.ROW_TYPE_SDK_COUNTER; 243fb726d48Sopenharmony_ci traceRow.folderPaddingLeft = 30; 244fb726d48Sopenharmony_ci traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 245fb726d48Sopenharmony_ci traceRow.selectChangeHandler = this.trace.selectChangeHandler; 246fb726d48Sopenharmony_ci traceRow.style.height = '40px'; 247fb726d48Sopenharmony_ci traceRow.style.width = '100%'; 248fb726d48Sopenharmony_ci traceRow.setAttribute('children', ''); 249fb726d48Sopenharmony_ci traceRow.name = `${counterName}`; 250fb726d48Sopenharmony_ci return traceRow; 251fb726d48Sopenharmony_ci } 252fb726d48Sopenharmony_ci 253fb726d48Sopenharmony_ci private initCounter = async ( 254fb726d48Sopenharmony_ci nodeRow: TraceRow<BaseStruct>, 255fb726d48Sopenharmony_ci index: number, 256fb726d48Sopenharmony_ci result: unknown, 257fb726d48Sopenharmony_ci sqlMap: unknown, 258fb726d48Sopenharmony_ci componentId: number 259fb726d48Sopenharmony_ci ): Promise<void> => { 260fb726d48Sopenharmony_ci //@ts-ignore 261fb726d48Sopenharmony_ci let traceRow = this.initCounterChartRow(componentId, nodeRow.expansion, result.counter_id, result.counter_name); 262fb726d48Sopenharmony_ci traceRow.supplier = async (): Promise<CounterStruct[]> => //@ts-ignore 263fb726d48Sopenharmony_ci querySdkCounterData(sqlMap.chartSql, result.counter_id, componentId); 264fb726d48Sopenharmony_ci traceRow.focusHandler = (): void => { 265fb726d48Sopenharmony_ci this.trace?.displayTip( 266fb726d48Sopenharmony_ci traceRow, 267fb726d48Sopenharmony_ci CounterStruct.hoverCounterStruct, 268fb726d48Sopenharmony_ci `<span>${CounterStruct.hoverCounterStruct?.value?.toFixed(2)}</span>` 269fb726d48Sopenharmony_ci ); 270fb726d48Sopenharmony_ci }; 271fb726d48Sopenharmony_ci traceRow.findHoverStruct = (): void => { 272fb726d48Sopenharmony_ci CounterStruct.hoverCounterStruct = traceRow.getHoverStruct(); 273fb726d48Sopenharmony_ci }; //@ts-ignore 274fb726d48Sopenharmony_ci let maxList = await queryCounterMax(sqlMap.maxSql, result.counter_id, componentId); 275fb726d48Sopenharmony_ci //@ts-ignore 276fb726d48Sopenharmony_ci let maxCounter = maxList[0].max_value; 277fb726d48Sopenharmony_ci traceRow.onThreadHandler = (useCache: boolean): void => { 278fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 279fb726d48Sopenharmony_ci if (traceRow.currentContext) { 280fb726d48Sopenharmony_ci context = traceRow.currentContext; 281fb726d48Sopenharmony_ci } else { 282fb726d48Sopenharmony_ci context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 283fb726d48Sopenharmony_ci } 284fb726d48Sopenharmony_ci traceRow.canvasSave(context); 285fb726d48Sopenharmony_ci //@ts-ignore 286fb726d48Sopenharmony_ci (renders[TraceRow.ROW_TYPE_SDK_COUNTER] as SdkCounterRender).renderMainThread( 287fb726d48Sopenharmony_ci { 288fb726d48Sopenharmony_ci context: context, 289fb726d48Sopenharmony_ci useCache: useCache, 290fb726d48Sopenharmony_ci type: `sdk-counter-${index}`, 291fb726d48Sopenharmony_ci maxName: `${maxCounter}`, 292fb726d48Sopenharmony_ci maxValue: maxCounter, 293fb726d48Sopenharmony_ci }, 294fb726d48Sopenharmony_ci traceRow 295fb726d48Sopenharmony_ci ); 296fb726d48Sopenharmony_ci traceRow.canvasRestore(context, this.trace); 297fb726d48Sopenharmony_ci }; 298fb726d48Sopenharmony_ci nodeRow.addChildTraceRow(traceRow); 299fb726d48Sopenharmony_ci }; 300fb726d48Sopenharmony_ci 301fb726d48Sopenharmony_ci private initNodeRow = (index: number, name: string): TraceRow<BaseStruct> => { 302fb726d48Sopenharmony_ci let sdkFolder = TraceRow.skeleton(); 303fb726d48Sopenharmony_ci sdkFolder.rowId = `Sdk-${index}`; 304fb726d48Sopenharmony_ci sdkFolder.index = index; 305fb726d48Sopenharmony_ci sdkFolder.rowType = TraceRow.ROW_TYPE_SDK; 306fb726d48Sopenharmony_ci sdkFolder.rowParentId = ''; 307fb726d48Sopenharmony_ci sdkFolder.style.height = '40px'; 308fb726d48Sopenharmony_ci sdkFolder.folder = true; 309fb726d48Sopenharmony_ci sdkFolder.name = `${name}`; 310fb726d48Sopenharmony_ci sdkFolder.favoriteChangeHandler = this.trace.favoriteChangeHandler; 311fb726d48Sopenharmony_ci sdkFolder.selectChangeHandler = this.trace.selectChangeHandler; 312fb726d48Sopenharmony_ci sdkFolder.supplier = async (): Promise<BaseStruct[]> => new Promise<[]>((resolve) => resolve([])); 313fb726d48Sopenharmony_ci sdkFolder.onThreadHandler = (useCache: boolean): void => { 314fb726d48Sopenharmony_ci sdkFolder.canvasSave(this.trace.canvasPanelCtx!); 315fb726d48Sopenharmony_ci if (sdkFolder.expansion) { 316fb726d48Sopenharmony_ci // @ts-ignore 317fb726d48Sopenharmony_ci this.trace.canvasPanelCtx?.clearRect(0, 0, sdkFolder.frame.width, sdkFolder.frame.height); 318fb726d48Sopenharmony_ci } else { 319fb726d48Sopenharmony_ci (renders.empty as EmptyRender).renderMainThread( 320fb726d48Sopenharmony_ci { 321fb726d48Sopenharmony_ci context: this.trace.canvasPanelCtx, 322fb726d48Sopenharmony_ci useCache: useCache, 323fb726d48Sopenharmony_ci type: '', 324fb726d48Sopenharmony_ci }, 325fb726d48Sopenharmony_ci // @ts-ignore 326fb726d48Sopenharmony_ci sdkFolder 327fb726d48Sopenharmony_ci ); 328fb726d48Sopenharmony_ci } 329fb726d48Sopenharmony_ci sdkFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace); 330fb726d48Sopenharmony_ci }; 331fb726d48Sopenharmony_ci this.trace.rowsEL?.appendChild(sdkFolder); 332fb726d48Sopenharmony_ci return sdkFolder; 333fb726d48Sopenharmony_ci }; 334fb726d48Sopenharmony_ci 335fb726d48Sopenharmony_ci private initSecondaryRow = async ( 336fb726d48Sopenharmony_ci nodeRow: TraceRow<BaseStruct>, 337fb726d48Sopenharmony_ci index: number, 338fb726d48Sopenharmony_ci name: string 339fb726d48Sopenharmony_ci ): Promise<TraceRow<BaseStruct>> => { 340fb726d48Sopenharmony_ci let sdkSecondFolder = TraceRow.skeleton(); 341fb726d48Sopenharmony_ci sdkSecondFolder.rowId = `Sdk-${name}-${index}`; 342fb726d48Sopenharmony_ci sdkSecondFolder.index = index; 343fb726d48Sopenharmony_ci sdkSecondFolder.rowType = TraceRow.ROW_TYPE_SDK; 344fb726d48Sopenharmony_ci sdkSecondFolder.rowParentId = nodeRow.rowId; 345fb726d48Sopenharmony_ci sdkSecondFolder.rowHidden = !nodeRow.expansion; 346fb726d48Sopenharmony_ci sdkSecondFolder.style.height = '40px'; 347fb726d48Sopenharmony_ci sdkSecondFolder.folder = true; 348fb726d48Sopenharmony_ci sdkSecondFolder.folderPaddingLeft = 30; 349fb726d48Sopenharmony_ci sdkSecondFolder.name = `${name}`; 350fb726d48Sopenharmony_ci sdkSecondFolder.favoriteChangeHandler = this.trace.favoriteChangeHandler; 351fb726d48Sopenharmony_ci sdkSecondFolder.selectChangeHandler = this.trace.selectChangeHandler; 352fb726d48Sopenharmony_ci sdkSecondFolder.supplier = async (): Promise<BaseStruct[]> => new Promise<[]>((resolve) => resolve([])); 353fb726d48Sopenharmony_ci sdkSecondFolder.onThreadHandler = (useCache: boolean): void => { 354fb726d48Sopenharmony_ci sdkSecondFolder.canvasSave(this.trace.canvasPanelCtx!); 355fb726d48Sopenharmony_ci if (sdkSecondFolder.expansion) { 356fb726d48Sopenharmony_ci // @ts-ignore 357fb726d48Sopenharmony_ci this.trace.canvasPanelCtx?.clearRect(0, 0, sdkSecondFolder.frame.width, sdkSecondFolder.frame.height); 358fb726d48Sopenharmony_ci } else { 359fb726d48Sopenharmony_ci (renders.empty as EmptyRender).renderMainThread( 360fb726d48Sopenharmony_ci { 361fb726d48Sopenharmony_ci context: this.trace.canvasPanelCtx, 362fb726d48Sopenharmony_ci useCache: useCache, 363fb726d48Sopenharmony_ci type: '', 364fb726d48Sopenharmony_ci }, 365fb726d48Sopenharmony_ci // @ts-ignore 366fb726d48Sopenharmony_ci sdkSecondFolder 367fb726d48Sopenharmony_ci ); 368fb726d48Sopenharmony_ci } 369fb726d48Sopenharmony_ci sdkSecondFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace); 370fb726d48Sopenharmony_ci }; 371fb726d48Sopenharmony_ci this.trace.rowsEL?.appendChild(sdkSecondFolder); 372fb726d48Sopenharmony_ci return sdkSecondFolder; 373fb726d48Sopenharmony_ci }; 374fb726d48Sopenharmony_ci 375fb726d48Sopenharmony_ci private initSliceChartRow( 376fb726d48Sopenharmony_ci expansion: boolean, 377fb726d48Sopenharmony_ci rowId: string, 378fb726d48Sopenharmony_ci sliceId: string, 379fb726d48Sopenharmony_ci sliceName: string, 380fb726d48Sopenharmony_ci componentId: number 381fb726d48Sopenharmony_ci ): TraceRow<SdkSliceStruct> { 382fb726d48Sopenharmony_ci let traceRow = TraceRow.skeleton<SdkSliceStruct>(); 383fb726d48Sopenharmony_ci traceRow.rowType = TraceRow.ROW_TYPE_SDK_SLICE; 384fb726d48Sopenharmony_ci traceRow.rowHidden = !expansion; 385fb726d48Sopenharmony_ci traceRow.rowParentId = rowId; 386fb726d48Sopenharmony_ci traceRow.folderPaddingLeft = 30; 387fb726d48Sopenharmony_ci traceRow.style.height = '40px'; 388fb726d48Sopenharmony_ci traceRow.style.width = '100%'; 389fb726d48Sopenharmony_ci traceRow.name = `${sliceName}`; 390fb726d48Sopenharmony_ci traceRow.setAttribute('children', ''); 391fb726d48Sopenharmony_ci traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 392fb726d48Sopenharmony_ci traceRow.selectChangeHandler = this.trace.selectChangeHandler; 393fb726d48Sopenharmony_ci traceRow.rowId = `${sliceId}-${componentId}`; 394fb726d48Sopenharmony_ci return traceRow; 395fb726d48Sopenharmony_ci } 396fb726d48Sopenharmony_ci 397fb726d48Sopenharmony_ci private initSlice = async ( 398fb726d48Sopenharmony_ci nodeRow: TraceRow<BaseStruct>, 399fb726d48Sopenharmony_ci index: number, 400fb726d48Sopenharmony_ci result: unknown, 401fb726d48Sopenharmony_ci sqlMap: unknown, 402fb726d48Sopenharmony_ci componentId: number 403fb726d48Sopenharmony_ci ): Promise<void> => { 404fb726d48Sopenharmony_ci let traceRow = this.initSliceChartRow( 405fb726d48Sopenharmony_ci nodeRow.expansion, 406fb726d48Sopenharmony_ci nodeRow.rowId!, //@ts-ignore 407fb726d48Sopenharmony_ci result.slice_id, //@ts-ignore 408fb726d48Sopenharmony_ci result.slice_name, 409fb726d48Sopenharmony_ci componentId 410fb726d48Sopenharmony_ci ); 411fb726d48Sopenharmony_ci traceRow.supplier = async (): Promise<SdkSliceStruct[]> => 412fb726d48Sopenharmony_ci querySdkSliceData( 413fb726d48Sopenharmony_ci //@ts-ignore 414fb726d48Sopenharmony_ci sqlMap.chartSql, //@ts-ignore 415fb726d48Sopenharmony_ci result.slice_id, 416fb726d48Sopenharmony_ci TraceRow.range?.startNS || 0, 417fb726d48Sopenharmony_ci TraceRow.range?.endNS || 0, 418fb726d48Sopenharmony_ci componentId 419fb726d48Sopenharmony_ci ); 420fb726d48Sopenharmony_ci traceRow.focusHandler = (): void => { 421fb726d48Sopenharmony_ci this.trace?.displayTip( 422fb726d48Sopenharmony_ci traceRow, 423fb726d48Sopenharmony_ci SdkSliceStruct.hoverSdkSliceStruct, 424fb726d48Sopenharmony_ci `<span>${SdkSliceStruct.hoverSdkSliceStruct?.value}</span>` 425fb726d48Sopenharmony_ci ); 426fb726d48Sopenharmony_ci }; 427fb726d48Sopenharmony_ci traceRow.findHoverStruct = (): void => { 428fb726d48Sopenharmony_ci SdkSliceStruct.hoverSdkSliceStruct = traceRow.getHoverStruct(); 429fb726d48Sopenharmony_ci }; 430fb726d48Sopenharmony_ci traceRow.onThreadHandler = (useCache: boolean): void => { 431fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 432fb726d48Sopenharmony_ci if (traceRow.currentContext) { 433fb726d48Sopenharmony_ci context = traceRow.currentContext; 434fb726d48Sopenharmony_ci } else { 435fb726d48Sopenharmony_ci context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 436fb726d48Sopenharmony_ci } 437fb726d48Sopenharmony_ci traceRow.canvasSave(context); 438fb726d48Sopenharmony_ci //@ts-ignore 439fb726d48Sopenharmony_ci (renders[TraceRow.ROW_TYPE_SDK_SLICE] as SdkSliceRender).renderMainThread( 440fb726d48Sopenharmony_ci { 441fb726d48Sopenharmony_ci context: context, 442fb726d48Sopenharmony_ci useCache: useCache, 443fb726d48Sopenharmony_ci type: `sdk-slice-${index}`, 444fb726d48Sopenharmony_ci maxName: '', 445fb726d48Sopenharmony_ci maxValue: 0, 446fb726d48Sopenharmony_ci }, 447fb726d48Sopenharmony_ci traceRow 448fb726d48Sopenharmony_ci ); 449fb726d48Sopenharmony_ci traceRow.canvasRestore(context, this.trace); 450fb726d48Sopenharmony_ci }; 451fb726d48Sopenharmony_ci nodeRow.addChildTraceRow(traceRow); 452fb726d48Sopenharmony_ci }; 453fb726d48Sopenharmony_ci} 454