1// Copyright (c) 2021 Huawei Device Co., Ltd. 2// Licensed under the Apache License, Version 2.0 (the "License"); 3// you may not use this file except in compliance with the License. 4// You may obtain a copy of the License at 5// 6// http://www.apache.org/licenses/LICENSE-2.0 7// 8// Unless required by applicable law or agreed to in writing, software 9// distributed under the License is distributed on an "AS IS" BASIS, 10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11// See the License for the specific language governing permissions and 12// limitations under the License. 13 14import { TraficEnum } from './utils/QueryEnum'; 15import { filterDataByGroup } from './utils/DataFilter'; 16import { xpowerList } from './utils/AllMemoryCache'; 17import { Args } from './CommonArgs'; 18 19export const chartXpowerDataSql = (args: Args): string => { 20 return ` 21 select 22 xm.filter_id, 23 mf.name, 24 xm.ts - ${args.recordStartNS} as startNs, 25 xm.dur, 26 xm.value, 27 xm.type 28 from 29 xpower_measure xm 30 left join 31 measure_filter mf 32 on 33 mf.id = xm.filter_id 34 left join 35 trace_range r 36 where 37 name = '${args.xpowerName}' 38 order by 39 startNs 40 `; 41}; 42 43export function xpowerDataReceiver(data: unknown, proc: Function): void { 44 // @ts-ignore 45 if (data.params.trafic === TraficEnum.Memory) { 46 let res: unknown[]; 47 let list: unknown[]; 48 // @ts-ignore 49 if (!xpowerList.has(data.params.xpowerName)) { 50 // @ts-ignore 51 list = proc(chartXpowerDataSql(data.params)); 52 for (let j = 0; j < list.length; j++) { 53 // @ts-ignore 54 if (list[j].name === 'ThermalReport.ShellTemp') { 55 // @ts-ignore 56 list[j].value = list[j].value / 1000; 57 } 58 if (j === list.length - 1) { 59 // @ts-ignore 60 list[j].dur = (data.params.totalNS || 0) - (list[j].startNs || 0); 61 } else { 62 // @ts-ignore 63 list[j].dur = (list[j + 1].startNs || 0) - (list[j].startNs || 0); 64 } 65 } 66 // @ts-ignore 67 xpowerList.set(data.params.xpowerName, list); 68 } else { 69 // @ts-ignore 70 list = xpowerList.get(data.params.xpowerName) || []; 71 } 72 // @ts-ignore 73 if (data.params.queryAll) { 74 //框选时候取数据,只需要根据时间过滤数据 75 res = (list || []).filter( 76 // @ts-ignore 77 (it) => it.startNs + it.dur >= data.params.selectStartNS && it.startNs <= data.params.selectEndNS 78 ); 79 } else { 80 res = filterDataByGroup( 81 list || [], 82 'startNs', 83 'dur', 84 // @ts-ignore 85 data.params.startNS, 86 // @ts-ignore 87 data.params.endNS, 88 // @ts-ignore 89 data.params.width, 90 'value' 91 ); 92 } 93 arrayBufferHandler(data, res, true); 94 } else { 95 // @ts-ignore 96 let sql = chartXpowerDataSql(data.params); 97 let res = proc(sql); 98 // @ts-ignore 99 arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 100 } 101} 102 103function arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void { 104 // @ts-ignore 105 let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); 106 // @ts-ignore 107 let startNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNS); 108 // @ts-ignore 109 let value = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.value); 110 // @ts-ignore 111 let filterId = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.filterId); 112 res.forEach((it, i) => { 113 // @ts-ignore 114 data.params.trafic === TraficEnum.ProtoBuffer && (it = it.xpowerData); 115 // @ts-ignore 116 dur[i] = it.dur; 117 // @ts-ignore 118 startNS[i] = it.startNs; 119 // @ts-ignore 120 filterId[i] = it.filterId; 121 // @ts-ignore 122 value[i] = it.value; 123 }); 124 125 (self as unknown as Worker).postMessage( 126 { 127 // @ts-ignore 128 id: data.id, 129 // @ts-ignore 130 action: data.action, 131 results: transfer 132 ? { 133 dur: dur.buffer, 134 startNS: startNS.buffer, 135 value: value.buffer, 136 filterId: filterId.buffer, 137 } 138 : {}, 139 len: res.length, 140 transfer: transfer, 141 }, 142 transfer ? [dur.buffer, startNS.buffer, value.buffer, filterId.buffer] : [] 143 ); 144} 145