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 { xpowerWifiList } from '../utils/AllMemoryCache'; 16import { Args } from '../CommonArgs'; 17 18export const chartXpowerWifiMemoryDataSql = (args: Args): string => { 19 if (args.xpowerName === 'WIFIPackets') { 20 return ` 21 SELECT start_time - start_ts as startTime, 22 ifnull(tx_packets, 0) as tx, 23 ifnull(rx_packets, 0) as rx 24 FROM xpower_app_detail_wifi, trace_range`; 25 } else { 26 return ` 27 SELECT start_time - start_ts as startTime, 28 ifnull(tx_bytes, 0) as tx, 29 ifnull(rx_bytes, 0) as rx 30 FROM xpower_app_detail_wifi, trace_range`; 31 } 32}; 33 34export const chartXpowerStatisticDataSql = (args: Args): string => { 35 if (args.xpowerName === 'WIFIPackets') { 36 return ` 37 SELECT start_time - start_ts as startTime, 38 ifnull(tx_packets, 0) as tx, 39 ifnull(rx_packets, 0) as rx 40 FROM xpower_app_detail_wifi, trace_range`; 41 } else { 42 return ` 43 SELECT start_time - start_ts as startTime, 44 ifnull(tx_bytes, 0) as tx, 45 ifnull(rx_bytes, 0) as rx 46 FROM xpower_app_detail_wifi, trace_range`; 47 } 48}; 49 50export function xpowerWifiDataReceiver(data: unknown, proc: Function): void { 51 // @ts-ignore 52 if (data.params.trafic === TraficEnum.Memory) { 53 let list: unknown[]; 54 // @ts-ignore 55 if (!xpowerWifiList.has(data.params.xpowerName)) { 56 // @ts-ignore 57 list = proc(chartXpowerWifiMemoryDataSql(data.params)); 58 // @ts-ignore 59 xpowerWifiList.set(data.params.xpowerName, list); 60 } else { 61 // @ts-ignore 62 list = xpowerWifiList.get(data.params.xpowerName) || []; 63 } 64 // @ts-ignore 65 if (data.params.queryAll) { 66 list = (list || []).filter( 67 // @ts-ignore 68 (it) => it.startTime + 3000000000 >= data.params.selectStartNS && it.startTime <= data.params.selectEndNS 69 ); 70 } 71 arrayBufferHandler(data, list, true); 72 } else { 73 // @ts-ignore 74 let sql = chartXpowerStatisticDataSql(data.params); 75 let res = proc(sql); 76 // @ts-ignore 77 arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 78 } 79} 80 81function arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void { 82 // @ts-ignore 83 let startTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); 84 // @ts-ignore 85 let tx = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTime); 86 // @ts-ignore 87 let rx = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.energy); 88 res.forEach((it, i) => { 89 // @ts-ignore 90 data.params.trafic === TraficEnum.ProtoBuffer && (it = it.xpowerWifiData); 91 // @ts-ignore 92 startTime[i] = it.startTime; 93 // @ts-ignore 94 tx[i] = it.tx; 95 // @ts-ignore 96 rx[i] = it.rx; 97 }); 98 99 (self as unknown as Worker).postMessage( 100 { 101 // @ts-ignore 102 id: data.id, 103 // @ts-ignore 104 action: data.action, 105 results: transfer 106 ? { 107 startTime: startTime.buffer, 108 tx: tx.buffer, 109 rx: rx.buffer, 110 } 111 : {}, 112 len: res.length, 113 transfer: transfer, 114 }, 115 transfer ? [startTime.buffer, tx.buffer, rx.buffer] : [] 116 ); 117} 118