diff --git a/FA/electronic_compass/.idea/.deveco/module/entry.cache.json b/FA/electronic_compass/.idea/.deveco/module/entry.cache.json new file mode 100644 index 0000000000000000000000000000000000000000..1b5bc0c4e6b01530cee904f5d6a8b26d283f7937 --- /dev/null +++ b/FA/electronic_compass/.idea/.deveco/module/entry.cache.json @@ -0,0 +1,14 @@ +{ + "BuildOptions":{ + "SELECT_BUILD_TARGET":"default", + "BUILD_PATH":{ + "OUTPUT_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\compass\\entry\\build\\default\\outputs\\default", + "RES_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\compass\\entry\\build\\default\\intermediates\\res\\default", + "ETS_SUPER_VISUAL_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\compass\\entry\\build\\default\\cache\\default\\CompileETS", + "JS_ASSETS_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\compass\\entry\\build\\default\\intermediates\\assets\\default", + "RES_PROFILE_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\compass\\entry\\build\\default\\intermediates\\res\\default\\resources\\base\\profile", + "WORKER_LOADER":"C:\\Users\\china\\DevEcoStudioProjects\\compass\\entry\\build\\default\\intermediates\\loader\\default\\loader.json", + "MANIFEST_JSON":"C:\\Users\\china\\DevEcoStudioProjects\\compass\\entry\\build\\default\\intermediates\\manifest\\default" + } + } +} \ No newline at end of file diff --git a/FA/electronic_compass/.idea/.deveco/project.cache.json b/FA/electronic_compass/.idea/.deveco/project.cache.json new file mode 100644 index 0000000000000000000000000000000000000000..115660200405f03ace11ae3451a31d0537ac8fe7 --- /dev/null +++ b/FA/electronic_compass/.idea/.deveco/project.cache.json @@ -0,0 +1,12 @@ +{ + "BuildOptions":{ + "BUNDLE_NAME":"", + "BUILD_PATH":{ + "OUTPUT_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\compass\\build\\outputs\\default" + }, + "SELECT_BUILD_PRODUCT":"default" + }, + "CommonInfo":{ + "project.ide.version":"3.0.0.900" + } +} \ No newline at end of file diff --git a/FA/electronic_compass/.idea/.gitignore b/FA/electronic_compass/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..26d33521af10bcc7fd8cea344038eaaeb78d0ef5 --- /dev/null +++ b/FA/electronic_compass/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/FA/electronic_compass/.idea/compass.iml b/FA/electronic_compass/.idea/compass.iml new file mode 100644 index 0000000000000000000000000000000000000000..f07b3d69143c43eaefd1d68df67e0ce1fcc75cdc --- /dev/null +++ b/FA/electronic_compass/.idea/compass.iml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FA/electronic_compass/.idea/configurationModuleSettings.xml b/FA/electronic_compass/.idea/configurationModuleSettings.xml new file mode 100644 index 0000000000000000000000000000000000000000..d5d7057972a2b26e2ee5f1c9df6d3d2e1be0e2b9 --- /dev/null +++ b/FA/electronic_compass/.idea/configurationModuleSettings.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/FA/electronic_compass/.idea/modules.xml b/FA/electronic_compass/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f54efe1c45f1fcf781565f6a18b9e0e9601d297 --- /dev/null +++ b/FA/electronic_compass/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/FA/electronic_compass/build-profile.json5 b/FA/electronic_compass/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..f355b8f4f9da376ca7b481cf2aa825717bcf912f --- /dev/null +++ b/FA/electronic_compass/build-profile.json5 @@ -0,0 +1,26 @@ +{ + "app": { + "compileSdkVersion": 8, + "compatibleSdkVersion": 8, + "products": [ + { + "name": "default", + "signingConfig": "default" + } + ], + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/FA/electronic_compass/entry/.gitignore b/FA/electronic_compass/entry/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..4f9a973815d0b5e49bc8547681a6b4bc7a178d12 --- /dev/null +++ b/FA/electronic_compass/entry/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.preview +/build \ No newline at end of file diff --git a/FA/electronic_compass/entry/build-profile.json5 b/FA/electronic_compass/entry/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..09fbaf41fa38c8543903a0e47561a25e6d983cba --- /dev/null +++ b/FA/electronic_compass/entry/build-profile.json5 @@ -0,0 +1,10 @@ +{ + "apiType": 'faMode', + "buildOption": { + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/FA/electronic_compass/entry/hvigorfile.js b/FA/electronic_compass/entry/hvigorfile.js new file mode 100644 index 0000000000000000000000000000000000000000..bcec4c99653062cbf17702c40a2dd2a7b809b81a --- /dev/null +++ b/FA/electronic_compass/entry/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').legacyHapTasks diff --git a/FA/electronic_compass/entry/package-lock.json b/FA/electronic_compass/entry/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..15bc7145be1490029883067847743ea7134cf545 --- /dev/null +++ b/FA/electronic_compass/entry/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "entry", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/FA/electronic_compass/entry/package.json b/FA/electronic_compass/entry/package.json new file mode 100644 index 0000000000000000000000000000000000000000..992c771b9e6be8904ce4204f075df58a9b0902cc --- /dev/null +++ b/FA/electronic_compass/entry/package.json @@ -0,0 +1,14 @@ +{ + "license":"ISC", + "devDependencies":{}, + "name":"entry", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "description":"example description", + "repository":{}, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/FA/electronic_compass/entry/src/main/config.json b/FA/electronic_compass/entry/src/main/config.json new file mode 100644 index 0000000000000000000000000000000000000000..47631839c13f318077384190cbdf77820f85e976 --- /dev/null +++ b/FA/electronic_compass/entry/src/main/config.json @@ -0,0 +1,63 @@ +{ + "app": { + "vendor": "example", + "bundleName": "com.example.compass", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "mainAbility": ".MainAbility", + "deviceType": [ + "phone" + ], + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "orientation": "unspecified", + "visible": true, + "srcPath": "MainAbility", + "name": ".MainAbility", + "srcLanguage": "js", + "icon": "$media:icon", + "description": "$string:MainAbility_desc", + "formsEnabled": false, + "label": "$string:MainAbility_label", + "type": "page", + "launchType": "standard" + } + ], + "distro": { + "moduleType": "entry", + "installationFree": false, + "deliveryWithInstall": true, + "moduleName": "entry" + }, + "package": "com.example.entry", + "srcPath": "", + "name": ".entry", + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": ".MainAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} \ No newline at end of file diff --git a/FA/electronic_compass/entry/src/main/js/MainAbility/app.js b/FA/electronic_compass/entry/src/main/js/MainAbility/app.js new file mode 100644 index 0000000000000000000000000000000000000000..0c00d4cf5fed9332a54f1d76b97bc4dd9fdf5b90 --- /dev/null +++ b/FA/electronic_compass/entry/src/main/js/MainAbility/app.js @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License,Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import tcpserverapi from '@ohos.tcpserverapi' + +export default { + onCreate() { + console.info("Application onCreate"); + tcpserverapi.initServer() + }, + onInit(){ + + }, + onDestroy() { + console.info("Application onDestroy"); + } +}; + diff --git a/FA/electronic_compass/entry/src/main/js/MainAbility/i18n/en-US.json b/FA/electronic_compass/entry/src/main/js/MainAbility/i18n/en-US.json new file mode 100644 index 0000000000000000000000000000000000000000..55561b83737c3c31d082fbfa11e5fc987a351104 --- /dev/null +++ b/FA/electronic_compass/entry/src/main/js/MainAbility/i18n/en-US.json @@ -0,0 +1,8 @@ +{ + "strings": { + "hello": "Hello", + "world": "World" + }, + "Files": { + } +} \ No newline at end of file diff --git a/FA/electronic_compass/entry/src/main/js/MainAbility/i18n/zh-CN.json b/FA/electronic_compass/entry/src/main/js/MainAbility/i18n/zh-CN.json new file mode 100644 index 0000000000000000000000000000000000000000..cce1af06761a42add0cac1a0567aa3237eda8cb4 --- /dev/null +++ b/FA/electronic_compass/entry/src/main/js/MainAbility/i18n/zh-CN.json @@ -0,0 +1,8 @@ +{ + "strings": { + "hello": "您好", + "world": "世界" + }, + "Files": { + } +} \ No newline at end of file diff --git a/FA/electronic_compass/entry/src/main/js/MainAbility/pages/index/index.css b/FA/electronic_compass/entry/src/main/js/MainAbility/pages/index/index.css new file mode 100644 index 0000000000000000000000000000000000000000..ed15e1262e7c40c93526ec367480510e2aeb30ac --- /dev/null +++ b/FA/electronic_compass/entry/src/main/js/MainAbility/pages/index/index.css @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License,Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.container { + width:100%; + height: 100%; + margin-top: 80px; + flex-direction: column; + align-items: center; + justify-content: flex-start; +} + +.text-style{ + font-size: 60px; +} + +.canvas-style { + width:100%; + height: 100%; + margin-top: 50px; +} + +.compass-canvas { + width:100%; + height: 100%; +} + +.line-canvas { + width: 100%; + height:100%; + position: absolute; +} diff --git a/FA/electronic_compass/entry/src/main/js/MainAbility/pages/index/index.hml b/FA/electronic_compass/entry/src/main/js/MainAbility/pages/index/index.hml new file mode 100644 index 0000000000000000000000000000000000000000..5a912fd02f0fdb1fcdee593901b01b35cb4fc4e7 --- /dev/null +++ b/FA/electronic_compass/entry/src/main/js/MainAbility/pages/index/index.hml @@ -0,0 +1,22 @@ + + +
+ {{ position }}° +
+ + +
+
\ No newline at end of file diff --git a/FA/electronic_compass/entry/src/main/js/MainAbility/pages/index/index.js b/FA/electronic_compass/entry/src/main/js/MainAbility/pages/index/index.js new file mode 100644 index 0000000000000000000000000000000000000000..d34e00e96782239c07a01d383000fc6b6d5ff4c0 --- /dev/null +++ b/FA/electronic_compass/entry/src/main/js/MainAbility/pages/index/index.js @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License,Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import tcpserverapi from '@ohos.tcpserverapi' + +var compass_canvas = null; +var compass_context = null; +var line_canvas = null; +var line_context = null; + +export default { + data: { + width: 700, + height: 700, + outsideRadius: 0, + insideRadius: 0, + positionTextSize: '', + angleNumberSize: '', + isFirstShowFlag: true, + positionTexts: ["北", "东", "南", "西"], + angleNumbers: ['0', '30', '60', '90', '120', '150', '180', '210', '240', '270', '300', '330'], + angle: 0, + position: '北 0', + intervalID: 0 + }, + onInit() { + }, + onAttached() { + this.getCompassMsg(); + }, + onShow() { + this.getWindowSize(); + this.initCanvas(); + }, + initCanvas() { + compass_canvas = this.$refs.compassCanvas; + compass_context = compass_canvas.getContext('2d', { + antialias: true + }); + + line_canvas = this.$refs.lineCanvas; + line_context = line_canvas.getContext('2d', { + antialias: true + }); + if (this.isFirstShowFlag) { + compass_context.translate(this.width / 2, this.height / 2); //移动当前坐标系的原点。 + line_context.translate(this.width / 2, this.height / 2); //移动当前坐标系的原点。 + this.drawCircle(this.outsideRadius, '#F9F9F9'); //外圆,传入外圆半径和颜色 + this.drawCircle(this.insideRadius, '#FFFFFF'); //内圆,传入内圆半径和颜色 + this.drawAngleNumber(); // 外围数字角度绘制 + this.drawPositionText(); // 内部东西南北方位文字绘制 + this.drawAngleLine(); // 刻度盘竖线绘制 + this.drawPositionLine(); //指示线绘制 + } + this.isFirstShowFlag = false; + }, + getWindowSize() { + this.outsideRadius = this.width / 2 - this.width / 7; // 计算外圆半径 + this.insideRadius = this.outsideRadius - this.width / 8; // 计算内圆半径 + }, + drawCircle(radius, color) { + compass_context.beginPath(); //创建一个新的绘制路径。 + compass_context.fillStyle = color; // 指定绘制的填充色。 + compass_context.strokeStyle = color;//设置描边的颜色。 + compass_context.arc(0, 0, radius, 0, 6.28); //绘制弧线路径。 + compass_context.fill();//对封闭路径进行填充。 + }, + drawPositionText() { + compass_context.beginPath(); + this.positionTextSize = this.width / 20; + compass_context.font = this.positionTextSize + 'px' + ' sans-serif'; + for (let i = 0; i < this.positionTexts.length; i++) { + if (i == 0) { + compass_context.fillStyle = '#FF00000'; + this.drawTriangle(); + } else { + compass_context.fillStyle = '#0000000'; + } + let positionText = this.positionTexts[i]; + compass_context.fillText(positionText, -this.width / 40, -this.width / 9); + compass_context.stroke(); + compass_context.rotate(90 * Math.PI / 180); + } + }, + drawTriangle() { + compass_context.beginPath(); + compass_context.fillStyle = '#FF00000'; + compass_context.moveTo(0, -this.width / 5); + compass_context.lineTo(this.width / 40, -this.width / 5 + this.width / 35); + compass_context.lineTo(-this.width / 40, -this.width / 5 + this.width / 35); + compass_context.closePath(); + compass_context.fill(); + }, + drawAngleNumber() { + compass_context.beginPath(); // 创建一个新的绘制路径。 + this.angleNumberSize = this.width / 30; // 角度数字文字大小。 + compass_context.font = this.angleNumberSize + 'px' + ' sans-serif'; // 角度数字文字大小转换。 + for (var i = 0; i < this.angleNumbers.length; i++) { + if (i == 0) { // 判断是0 设备颜色为红色,其他为灰黑色。 + compass_context.fillStyle = '#FF00000'; + } else { + compass_context.fillStyle = '#AF000000'; + } + let number = this.angleNumbers[i]; // 获取数组对象里面的数字内容。 + compass_context.fillText(number, -this.width / 85, -this.width / 2.45); // 绘制填充类文本。 + compass_context.rotate(30 * Math.PI / 180); // 设置当前坐标轴进行顺时针旋转,成圆形排列 + } + }, + drawAngleLine() { + compass_context.strokeStyle = '#000000'; //设置描边的颜色。 + // 总共有60 个刻度,按5的倍数进行线条加粗。 + for (var i = 0; i < 60; i++) { + if (i == 0 || i == 5 || i == 10 || i == 15 || i == 20 || i == 25 || i == 30 || i == 35 || i == 40 || i == 45 || i == 50 || i == 55) { + compass_context.lineWidth = 3; + compass_context.beginPath(); // 创建一个新的绘制路径。 + compass_context.moveTo(0, this.insideRadius + (this.outsideRadius - this.insideRadius) / 4); // 当前点移动到指定点。 + compass_context.lineTo(0, this.outsideRadius - this.width / 30); // 从当前点到指定点进行路径连接 + + } else { + compass_context.lineWidth = 0.5; + compass_context.beginPath(); + compass_context.moveTo(0, this.insideRadius + (this.outsideRadius - this.insideRadius) / 4); + compass_context.lineTo(0, this.outsideRadius - this.width / 30); + } + compass_context.stroke(); + compass_context.rotate(15 * Math.PI / 450); + } + }, + drawPositionLine() { + line_context.strokeStyle = '#000000'; + line_context.lineWidth = 6; + line_context.lineCap = 'round'; // 线端点以圆形结束。 + line_context.moveTo(0, -this.outsideRadius + this.width / 15); + line_context.lineTo(0, -this.outsideRadius - this.width / 28); + line_context.stroke(); // 进行边框绘制操作。 + }, + getCompassMsg() { + this.intervalID = setInterval(() => { + //NAPI调用 + tcpserverapi.recvMsg().then((result) => { + var resultAngle = result.message; + if (resultAngle.match("angle:")) { + var info = parseInt(resultAngle.slice(6)); + if (this.angle != info) { + this.angle = info; + console.info("===========" + this.angle) + if (this.angle >= 0 && this.angle < 23) { + this.position = '北 ' + this.angle; + } + else if (this.angle >= 23 && this.angle < 68) { + this.position = '东北 ' + this.angle; + } + else if (this.angle >= 68 && this.angle < 113) { + this.position = '东 ' + this.angle; + } + else if (this.angle >= 113 && this.angle < 158) { + this.position = '东南 ' + this.angle; + } + else if (this.angle >= 158 && this.angle < 203) { + this.position = '南 ' + this.angle; + } + else if (this.angle >= 203 && this.angle < 248) { + this.position = '西南 ' + this.angle; + } + else if (this.angle >= 248 && this.angle < 293) { + this.position = '西 ' + this.angle; + } + else if (this.angle >= 293 && this.angle < 338) { + this.position = '西北 ' + this.angle; + } + else if (this.angle >= 338 && this.angle < 360) { + this.position = '北 ' + this.angle; + } + } + } + }); + + }, 100); + }, + onDestroy() { + clearInterval(this.intervalID); + } +} \ No newline at end of file diff --git a/FA/electronic_compass/entry/src/main/resources/base/element/string.json b/FA/electronic_compass/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..bf83d61e9a5151180d132bde8e4344f9a41b40ad --- /dev/null +++ b/FA/electronic_compass/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "entry_desc", + "value": "description" + }, + { + "name": "MainAbility_desc", + "value": "description" + }, + { + "name": "MainAbility_label", + "value": "指南针" + } + ] +} \ No newline at end of file diff --git a/FA/electronic_compass/entry/src/main/resources/base/media/icon.png b/FA/electronic_compass/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..debb51735c8d840d072d4cc43401635c963d0b46 Binary files /dev/null and b/FA/electronic_compass/entry/src/main/resources/base/media/icon.png differ diff --git a/FA/electronic_compass/hvigorfile.js b/FA/electronic_compass/hvigorfile.js new file mode 100644 index 0000000000000000000000000000000000000000..cff9f0dfcf8cb00cca34e7f50d61380cf5496868 --- /dev/null +++ b/FA/electronic_compass/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').legacyAppTasks \ No newline at end of file diff --git a/FA/electronic_compass/package-lock.json b/FA/electronic_compass/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..b508423c46e4cd1ca72cfbe7d381b02f2a2c7040 --- /dev/null +++ b/FA/electronic_compass/package-lock.json @@ -0,0 +1,1657 @@ +{ + "name": "compass", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/hvigor": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.0.6.tgz", + "integrity": "sha512-jjp7vpvUOMW1Nf7TdyhOtonwWHoSyBJLUiZTQqIx/GJV4UJyIqsiURUOqFwncQ4L7PDdeHuWly4uEelknYeWhg==", + "requires": { + "@ohos/hvigor-base": "1.0.6", + "interpret": "1.4.0", + "liftoff": "4.0.0", + "mute-stdout": "1.0.0", + "pretty-hrtime": "1.0.0", + "v8flags": "3.2.0", + "yargs": "7.1.0" + } + }, + "@ohos/hvigor-base": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.0.6.tgz", + "integrity": "sha512-cRDnWICTxmpNiFb9clIioqP5Oik1seLCICztXVhZqultrHuxwTheCRUZrHwlpyWdkSB2Al+FFBqmSwzIgZX4IQ==", + "requires": { + "json5": "2.2.0", + "log4js": "6.4.1", + "undertaker": "1.2.1" + } + }, + "@ohos/hvigor-ohos-plugin": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.0.6.tgz", + "integrity": "sha512-MAAi8uJxMzODUoSSNfBr+fU4HQ20dfQtkje9I+X4asc7qY2kAplW/q9f5XS8IOvv8zhC8OcSgsAXOAJuLMstOQ==", + "requires": { + "@ohos/hvigor-base": "1.0.6", + "@ohos/sdkmanager-common": "1.1.3", + "ajv": "8.10.0", + "archiver": "5.3.0", + "execa": "5.1.1", + "fs-extra": "10.0.0", + "glob": "7.2.0", + "iconv-lite": "0.6.3", + "json5": "2.2.0", + "lodash": "4.17.21", + "pretty-hrtime": "1.0.3", + "resolve-package-path": "4.0.3" + }, + "dependencies": { + "fs-extra": { + "version": "10.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + } + } + }, + "@ohos/sdkmanager-common": { + "version": "1.1.3", + "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-1.1.3.tgz", + "integrity": "sha512-d2uhVauDDJZIUvyyaWWoavG4N/jLyfF5IH5kEXKV6R8HNf3606H1zDQzA+UZtOfwwJFXhD9djRjnVFNB8xc7aw==" + }, + "ajv": { + "version": "8.10.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "archiver": { + "version": "5.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/archiver/-/archiver-5.3.0.tgz", + "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.0", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "requires": { + "is-number": "^4.0.0" + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "async": { + "version": "3.2.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "requires": { + "async-done": "^1.2.2" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://repo.huaweicloud.com/repository/npm/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://repo.huaweicloud.com/repository/npm/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "crc-32": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/crc-32/-/crc-32-1.2.1.tgz", + "integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.3.1" + } + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "date-format": { + "version": "4.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/date-format/-/date-format-4.0.6.tgz", + "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.59", + "resolved": "https://repo.huaweicloud.com/repository/npm/es5-ext/-/es5-ext-0.10.59.tgz", + "integrity": "sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "5.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + } + }, + "flagged-respawn": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==" + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "hypium": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/hypium/-/hypium-1.0.0.tgz", + "integrity": "sha512-nl+RQVv2AU/5FvFRhsXyWO5wh+2huhdqRZ3bszBWZzW+kpNI3AT4ydvVRYIfaQbYwV4UlX/rSc7BtFjLAezhow==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://repo.huaweicloud.com/repository/npm/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "4.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "liftoff": { + "version": "4.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "requires": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "object.map": "^1.0.1", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "log4js": { + "version": "6.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "requires": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stdout": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=" + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "requires": { + "once": "^1.3.2" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pretty-hrtime": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz", + "integrity": "sha1-9ualItPmBwRSK/Db5oVu0g515Nw=" + }, + "printj": { + "version": "1.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/printj/-/printj-1.3.1.tgz", + "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-glob": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "requires": { + "resolve": "^1.20.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-package-path": { + "version": "4.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-package-path/-/resolve-package-path-4.0.3.tgz", + "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==", + "requires": { + "path-root": "^0.1.1" + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" + }, + "streamroller": { + "version": "3.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/streamroller/-/streamroller-3.0.6.tgz", + "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "requires": { + "date-format": "^4.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + }, + "dependencies": { + "is-number": { + "version": "7.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + } + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + } + } + } +} diff --git a/FA/electronic_compass/package.json b/FA/electronic_compass/package.json new file mode 100644 index 0000000000000000000000000000000000000000..0192a372d11bd3d7ec4f632ecec4c72c2e25575e --- /dev/null +++ b/FA/electronic_compass/package.json @@ -0,0 +1,18 @@ +{ + "license":"ISC", + "devDependencies":{}, + "name":"compass", + "ohos":{ + "org":"huawei", + "directoryLevel":"project", + "buildTool":"hvigor" + }, + "description":"example description", + "repository":{}, + "version":"1.0.0", + "dependencies":{ + "@ohos/hvigor-ohos-plugin":"1.0.6", + "hypium":"^1.0.0", + "@ohos/hvigor":"1.0.6" + } +} \ No newline at end of file diff --git a/FA/metal_detection/.idea/.deveco/module/entry.cache.json b/FA/metal_detection/.idea/.deveco/module/entry.cache.json new file mode 100644 index 0000000000000000000000000000000000000000..7508fdc8739ed0ae103fcebbb687e030fb65c25a --- /dev/null +++ b/FA/metal_detection/.idea/.deveco/module/entry.cache.json @@ -0,0 +1,14 @@ +{ + "BuildOptions":{ + "SELECT_BUILD_TARGET":"default", + "BUILD_PATH":{ + "OUTPUT_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\metalDetection\\entry\\build\\default\\outputs\\default", + "RES_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\metalDetection\\entry\\build\\default\\intermediates\\res\\default", + "ETS_SUPER_VISUAL_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\metalDetection\\entry\\build\\default\\cache\\default\\CompileETS", + "JS_ASSETS_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\metalDetection\\entry\\build\\default\\intermediates\\assets\\default", + "RES_PROFILE_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\metalDetection\\entry\\build\\default\\intermediates\\res\\default\\resources\\base\\profile", + "WORKER_LOADER":"C:\\Users\\china\\DevEcoStudioProjects\\metalDetection\\entry\\build\\default\\intermediates\\loader\\default\\loader.json", + "MANIFEST_JSON":"C:\\Users\\china\\DevEcoStudioProjects\\metalDetection\\entry\\build\\default\\intermediates\\manifest\\default" + } + } +} \ No newline at end of file diff --git a/FA/metal_detection/.idea/.deveco/project.cache.json b/FA/metal_detection/.idea/.deveco/project.cache.json new file mode 100644 index 0000000000000000000000000000000000000000..6604fb60726761e185d4cd3868966f6a3b7c26f5 --- /dev/null +++ b/FA/metal_detection/.idea/.deveco/project.cache.json @@ -0,0 +1,12 @@ +{ + "BuildOptions":{ + "BUNDLE_NAME":"", + "BUILD_PATH":{ + "OUTPUT_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\metalDetection\\build\\outputs\\default" + }, + "SELECT_BUILD_PRODUCT":"default" + }, + "CommonInfo":{ + "project.ide.version":"3.0.0.900" + } +} \ No newline at end of file diff --git a/FA/metal_detection/.idea/.gitignore b/FA/metal_detection/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..26d33521af10bcc7fd8cea344038eaaeb78d0ef5 --- /dev/null +++ b/FA/metal_detection/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/FA/metal_detection/.idea/configurationModuleSettings.xml b/FA/metal_detection/.idea/configurationModuleSettings.xml new file mode 100644 index 0000000000000000000000000000000000000000..d5d7057972a2b26e2ee5f1c9df6d3d2e1be0e2b9 --- /dev/null +++ b/FA/metal_detection/.idea/configurationModuleSettings.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/FA/metal_detection/.idea/metalDetection.iml b/FA/metal_detection/.idea/metalDetection.iml new file mode 100644 index 0000000000000000000000000000000000000000..33f46c74235ca6c647fa77a3ac1c676c65c6c339 --- /dev/null +++ b/FA/metal_detection/.idea/metalDetection.iml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FA/metal_detection/.idea/modules.xml b/FA/metal_detection/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..7fda7c68c924dee27353b7be8606783b3cdf9a72 --- /dev/null +++ b/FA/metal_detection/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/FA/metal_detection/build-profile.json5 b/FA/metal_detection/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..16458969d0540e93e08edbc1bdc6664f930de7eb --- /dev/null +++ b/FA/metal_detection/build-profile.json5 @@ -0,0 +1,27 @@ +{ + "app": { + + "compileSdkVersion": 8, + "compatibleSdkVersion": 8, + "products": [ + { + "name": "default", + "signingConfig": "default", + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/FA/metal_detection/entry/.gitignore b/FA/metal_detection/entry/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..4f9a973815d0b5e49bc8547681a6b4bc7a178d12 --- /dev/null +++ b/FA/metal_detection/entry/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.preview +/build \ No newline at end of file diff --git a/FA/metal_detection/entry/build-profile.json5 b/FA/metal_detection/entry/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..ae58d1d0a70c602c9cfe1909b00dfec899ba1944 --- /dev/null +++ b/FA/metal_detection/entry/build-profile.json5 @@ -0,0 +1,13 @@ +{ + "apiType": 'faMode', + "buildOption": { + }, + "targets": [ + { + "name": "default", + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/FA/metal_detection/entry/hvigorfile.js b/FA/metal_detection/entry/hvigorfile.js new file mode 100644 index 0000000000000000000000000000000000000000..bcec4c99653062cbf17702c40a2dd2a7b809b81a --- /dev/null +++ b/FA/metal_detection/entry/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').legacyHapTasks diff --git a/FA/metal_detection/entry/package-lock.json b/FA/metal_detection/entry/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..15bc7145be1490029883067847743ea7134cf545 --- /dev/null +++ b/FA/metal_detection/entry/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "entry", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/FA/metal_detection/entry/package.json b/FA/metal_detection/entry/package.json new file mode 100644 index 0000000000000000000000000000000000000000..c7685ac4e7c0d79df04c96744f0d8f22cb4a9025 --- /dev/null +++ b/FA/metal_detection/entry/package.json @@ -0,0 +1,14 @@ +{ + "license": "ISC", + "devDependencies": {}, + "name": "entry", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "description": "example description", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} diff --git a/FA/metal_detection/entry/src/main/config.json b/FA/metal_detection/entry/src/main/config.json new file mode 100644 index 0000000000000000000000000000000000000000..c55aff6048e7cc249405b37d304fd10b888f95da --- /dev/null +++ b/FA/metal_detection/entry/src/main/config.json @@ -0,0 +1,67 @@ +{ + "app": { + "vendor": "example", + "bundleName": "com.example.metaldetection", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "mainAbility": ".MainAbility", + "deviceType": [ + "phone" + ], + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "orientation": "unspecified", + "visible": true, + "srcPath": "MainAbility", + "name": ".MainAbility", + "srcLanguage": "ets", + "icon": "$media:icon", + "description": "$string:MainAbility_desc", + "formsEnabled": false, + "label": "$string:MainAbility_label", + "type": "page", + "launchType": "standard" + } + ], + "distro": { + "moduleType": "entry", + "installationFree": false, + "deliveryWithInstall": true, + "moduleName": "entry" + }, + "package": "com.example.entry", + "srcPath": "", + "name": ".entry", + "js": [ + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "pages": [ + "pages/index" + ], + "name": ".MainAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} \ No newline at end of file diff --git a/FA/metal_detection/entry/src/main/ets/MainAbility/app.ets b/FA/metal_detection/entry/src/main/ets/MainAbility/app.ets new file mode 100644 index 0000000000000000000000000000000000000000..aa449b209d0336ed249d76fb235b91aca4979803 --- /dev/null +++ b/FA/metal_detection/entry/src/main/ets/MainAbility/app.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// @ts-ignore +import tcpserverapi from '@ohos.tcpserverapi' + +export default { + onCreate() { + console.info('Application onCreate') + tcpserverapi.initServer() + }, + onDestroy() { + console.info('Application onDestroy') + }, +} \ No newline at end of file diff --git a/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_1.png b/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..90d4d098c5af5df8fdf97a057c92418089f3740a Binary files /dev/null and b/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_1.png differ diff --git a/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_2.png b/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8547963be5fa0465477c281f725a96cdeec186a6 Binary files /dev/null and b/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_2.png differ diff --git a/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_3.png b/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d34796d597179910ac55ff0768bf29c500b6b6bb Binary files /dev/null and b/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_3.png differ diff --git a/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_4.png b/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ba34ac7925d2841114ae53a6c61512f48efa49f2 Binary files /dev/null and b/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_4.png differ diff --git a/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_5.png b/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_5.png new file mode 100644 index 0000000000000000000000000000000000000000..05facbbf4e178d081447161bcab43f23dec70dd9 Binary files /dev/null and b/FA/metal_detection/entry/src/main/ets/MainAbility/common/img_5.png differ diff --git a/FA/metal_detection/entry/src/main/ets/MainAbility/model/CommonLog.ets b/FA/metal_detection/entry/src/main/ets/MainAbility/model/CommonLog.ets new file mode 100644 index 0000000000000000000000000000000000000000..8df8eef15e00e13fb6baa7bb062adeb472cf48dd --- /dev/null +++ b/FA/metal_detection/entry/src/main/ets/MainAbility/model/CommonLog.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License,Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * 日志管理类 + */ +export default class CommonLog { + static module: string = "metalDetected" + + static info(log: string) { + console.info(CommonLog.module + " : " + log) + } + + static error(log: string) { + console.error(CommonLog.module + " : " + log) + } + + static debug(log: string) { + console.debug(CommonLog.module + " : " + log) + } +} \ No newline at end of file diff --git a/FA/metal_detection/entry/src/main/ets/MainAbility/model/PlayerManager.ets b/FA/metal_detection/entry/src/main/ets/MainAbility/model/PlayerManager.ets new file mode 100644 index 0000000000000000000000000000000000000000..02cbec02eeb80b4418cd0b882de16a7f49ba7f15 --- /dev/null +++ b/FA/metal_detection/entry/src/main/ets/MainAbility/model/PlayerManager.ets @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License,Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import CommonLog from "./CommonLog" +import media from '@ohos.multimedia.media' + +/** + * 音乐播放管理类 + */ +export class PlayerManager { + // 音乐列表 + private musicList: Music[] = [ + { + name: "metal", + url: "file://system/etc/metal.m4a", + }] + // 当前播放的音乐 + private currentMusicIndex: number = 0 + // 是否在播放 + private isPlaying: boolean = false + // 播放模式:循环播放,单曲播放,随机播放 + private playMode: number = 0 + + // 进度条定时器 + private progressIntervalID: number = 0 + + //当前播放时间 + private currentTimeMs: number = 0 + + //总播放时间 + private totalTimeMs: number = 0 + + // 进度回调方法 + private playingProgressListener + + // 状态回调方法 + private statusChangeListener + + // OH media对象 + private player = media.createAudioPlayer(); + + constructor() { + this.player.on('finish', () => { + this.playNextMusic() + }) + + this.player.on('error', (err) => { + CommonLog.info('Play music error = ' + JSON.stringify(err)) + }); + } + + getMusicList() { + CommonLog.info("getMusicList") + return this.musicList + } + + getCurrentMusic() { + return this.musicList[this.currentMusicIndex] + } + + getCurrentMusicIndex() { + return this.currentMusicIndex + } + + getCurrentTimeMs() { + return this.currentTimeMs + } + + play(seekTo) { + if (this.player.state == 'playing' && this.player.src == this.getCurrentMusic().url) { + return + } + + if (this.player.state == 'idle' || this.player.src != this.getCurrentMusic().url) { + CommonLog.info('Preload music url = ' + this.getCurrentMusic().url) + this.player.reset() + this.player.src = this.getCurrentMusic().url + this.player.on('dataLoad', () => { + CommonLog.info('dataLoad duration=' + this.player.duration) + this.totalTimeMs = this.player.duration + if (seekTo > this.player.duration) { + seekTo = -1 + } + this.player.on('play', () => { + if (seekTo > 0) { + this.player.seek(seekTo) + } + }) + + this.player.play() + if(this.statusChangeListener){ + this.statusChangeListener() + } + this.setProgressTimer() + this.isPlaying = true + }) + } + else { + if (seekTo > this.player.duration) { + seekTo = -1 + } + this.player.on('play', () => { + if (seekTo > 0) { + this.player.seek(seekTo) + } + }) + + this.player.play() + this.setProgressTimer() + this.isPlaying = true + } + } + + pause() { + CommonLog.info("pause music") + this.player.pause(); + this.cancelProgressTimer() + this.isPlaying = false + } + + changePlayMode() { + this.playMode = 1 - this.playMode + CommonLog.info("changePlayMode:" + this.playMode) + } + + setMusicProgress(progress: number) { + CommonLog.info("setMusicProgress:" + progress) + this.currentTimeMs = progress + } + + setOnPlayingProgressListener(callback) { + this.playingProgressListener = callback; + } + + setOnStatusChangeListener(callback) { + this.statusChangeListener = callback; + } + + /** + * 启动定时器,通过回调,设置进度条和时间信息 + */ + setProgressTimer() { + this.cancelProgressTimer() + + this.progressIntervalID = setInterval(() => { + if (typeof (this.playingProgressListener) != "undefined" && this.playingProgressListener != null) { + var timeMs = this.player.currentTime; + this.currentTimeMs = timeMs; + if (typeof (timeMs) === 'undefined') { + timeMs = 0; + } + this.playingProgressListener(timeMs) + } + }, 500) + } + + /** + * 取消定时器 + */ + cancelProgressTimer() { + if (typeof (this.progressIntervalID) != 'undefined') { + clearInterval(this.progressIntervalID); + this.progressIntervalID = undefined; + } + } + + /** + * 获取音乐总时间 + */ + getTotalTimeMs() { + return this.totalTimeMs + } + + /** + * 设置进度 + * @param ms 进度 + */ + seek(ms) { + this.currentTimeMs = ms; + + if (this.isPlaying) { + CommonLog.info('MusicPlayer[PlayerModel] player.seek ' + ms); + this.player.seek(ms); + } else { + CommonLog.info('MusicPlayer[PlayerModel] stash seekTo=' + ms); + } + } + + /** + * 播放下一首音乐 + */ + playNextMusic() { + if (this.currentMusicIndex + 1 == this.musicList.length) { + this.currentMusicIndex = 0 + } else { + this.currentMusicIndex++ + } + + this.play(-1) + } + + /** + * 播放指定音乐 + * @param index 序号 + */ + playSpecifyMusic(seekTo, index: number) { + this.currentMusicIndex = index + this.play(seekTo) + } + + /** + * 播放前一首音乐 + */ + playPreviousMusic() { + if (this.currentMusicIndex == 0) { + this.currentMusicIndex = this.musicList.length - 1 + } else { + this.currentMusicIndex-- + } + + this.play(-1) + } +} + +/** + * 音乐对象 + */ +export class Music { + name: string + url: string +} \ No newline at end of file diff --git a/FA/metal_detection/entry/src/main/ets/MainAbility/pages/index.ets b/FA/metal_detection/entry/src/main/ets/MainAbility/pages/index.ets new file mode 100644 index 0000000000000000000000000000000000000000..40c4b927db4aee5867614d4ea0169904e49045d0 --- /dev/null +++ b/FA/metal_detection/entry/src/main/ets/MainAbility/pages/index.ets @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// @ts-ignore +import tcpserverapi from '@ohos.tcpserverapi' +import {PlayerManager} from '../model/PlayerManager'; +import CommonLog from '../model/CommonLog'; + +@Component +struct TitleName { + build() { + Flex() { + Text('金属探测器') + .fontSize('36lpx') + .fontColor('#FFFFFF') + .margin({ left: '40lpx', top: '16lpx' }) + } + } +} + +@Component +struct detectionImage { + @State detectionState: string = '' + detection: Resource = $r("app.media.img_normal"); + metal: string = ''; + @State state: AnimationStatus = AnimationStatus.Initial + @State reverse: boolean = false + @State iterations: number = -1 + private playerManager: PlayerManager = new PlayerManager() + + + onPlayOrPauseMusic(isPause) { + if (isPause) { + CommonLog.info("Start to pause music") + this.playerManager.pause() + } + else { + CommonLog.info("Start to play music") + this.playerManager.play(-1) + } + } + + aboutToAppear() { + this.playerManager.setOnStatusChangeListener(() => { + CommonLog.info('setOnStatusChangeListener ' + this.playerManager.getCurrentMusic().url) + }) + + var intervalID = setInterval(() => { + //NAPI调用 + tcpserverapi.recvMsg().then((result) => { + CommonLog.info('result.clientNumber' + result.clientNumber) + if (result.clientNumber == 0) { + this.detectionState = ''; + this.detection = $r("app.media.img_normal"); + this.state = AnimationStatus.Stopped + // this.onPlayOrPauseMusic(true); + this.metal = '' + } else{ + var resultMetal = result.message; + if (resultMetal.match("metal:")) { + if(this.metal != resultMetal.slice(6)) { + this.metal = resultMetal.slice(6); + CommonLog.info('metal' + this.metal) + if (this.metal === 'Detected') { + this.detectionState = '发现金属'; + this.onPlayOrPauseMusic(false); + this.detection = $r("app.media.img_detected"); + this.state = AnimationStatus.Stopped + } + else if (this.metal === 'UnDetected' || this.metal === 'CalibrateOK') { + this.detectionState = '检测中'; + this.onPlayOrPauseMusic(true); + this.detection = $r("app.media.img_detecting"); + this.state = AnimationStatus.Running + } + } + } + } + }) + }, 200) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Stack() { + ImageAnimator() + .images([ + { + src: "/common/img_1.png", + duration: 500, + width: 500, + height: 500, + top: 0, + left: 0 + }, + { + src: "/common/img_2.png", + duration: 500, + width: 500, + height: 500, + top: 0, + left: 0 + }, + { + src: "/common/img_3.png", + duration: 500, + width: 500, + height: 500, + top: 0, + left: 0 + }, + { + src: "/common/img_4.png", + duration: 500, + width: 500, + height: 500, + top: 0, + left: 0 + }, + { + src: "/common/img_5.png", + duration: 500, + width: 500, + height: 500, + top: 0, + left: 0 + } + ]) + .state(this.state).reverse(this.reverse).fixedSize(false).preDecode(3) + .fillMode(FillMode.None).iterations(this.iterations).width(500).height(500) + Image(this.detection) + .width('532lpx') + .height('531lpx') + } + + Text(this.detectionState) + .margin({ top: "90lpx" }) + .fontSize('40lpx') + .fontColor('#FFFFFF') + + } + .width('100%') + .height('100%') + } +} + +@Entry +@Component +struct Index { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { + TitleName(); + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + detectionImage(); + } + } + .radialGradient({ + center: [360, 500], + radius: 580, + colors: [[0x102E5C, 0], [0x1D1E24, 1.0]] + }) + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/FA/metal_detection/entry/src/main/resources/base/element/string.json b/FA/metal_detection/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..9dc4d5af4886129ea90ce1d568a6d779b1cf77a9 --- /dev/null +++ b/FA/metal_detection/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "entry_desc", + "value": "description" + }, + { + "name": "MainAbility_desc", + "value": "description" + }, + { + "name": "MainAbility_label", + "value": "金属探测器" + } + ] +} \ No newline at end of file diff --git a/FA/metal_detection/entry/src/main/resources/base/media/icon.png b/FA/metal_detection/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..521b237b316569892588539f75dfd6c19e8cd41f Binary files /dev/null and b/FA/metal_detection/entry/src/main/resources/base/media/icon.png differ diff --git a/FA/metal_detection/entry/src/main/resources/base/media/img_detected.png b/FA/metal_detection/entry/src/main/resources/base/media/img_detected.png new file mode 100644 index 0000000000000000000000000000000000000000..8115c752d3ef279826c027220ddae23cc4ba3981 Binary files /dev/null and b/FA/metal_detection/entry/src/main/resources/base/media/img_detected.png differ diff --git a/FA/metal_detection/entry/src/main/resources/base/media/img_detecting.png b/FA/metal_detection/entry/src/main/resources/base/media/img_detecting.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb60f9269cd968e0d68fbcb8e2c73b200a49209 Binary files /dev/null and b/FA/metal_detection/entry/src/main/resources/base/media/img_detecting.png differ diff --git a/FA/metal_detection/entry/src/main/resources/base/media/img_normal.png b/FA/metal_detection/entry/src/main/resources/base/media/img_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..85f6cc7675290d307233dbb0e249b5a354f6fba3 Binary files /dev/null and b/FA/metal_detection/entry/src/main/resources/base/media/img_normal.png differ diff --git a/FA/metal_detection/hvigorfile.js b/FA/metal_detection/hvigorfile.js new file mode 100644 index 0000000000000000000000000000000000000000..cff9f0dfcf8cb00cca34e7f50d61380cf5496868 --- /dev/null +++ b/FA/metal_detection/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').legacyAppTasks \ No newline at end of file diff --git a/FA/metal_detection/package-lock.json b/FA/metal_detection/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..c5cb291ae76b51c2c6e4c1a905ad3e0ae3f86b4d --- /dev/null +++ b/FA/metal_detection/package-lock.json @@ -0,0 +1,1657 @@ +{ + "name": "metaldetection", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/hvigor": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.0.6.tgz", + "integrity": "sha512-jjp7vpvUOMW1Nf7TdyhOtonwWHoSyBJLUiZTQqIx/GJV4UJyIqsiURUOqFwncQ4L7PDdeHuWly4uEelknYeWhg==", + "requires": { + "@ohos/hvigor-base": "1.0.6", + "interpret": "1.4.0", + "liftoff": "4.0.0", + "mute-stdout": "1.0.0", + "pretty-hrtime": "1.0.0", + "v8flags": "3.2.0", + "yargs": "7.1.0" + } + }, + "@ohos/hvigor-base": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.0.6.tgz", + "integrity": "sha512-cRDnWICTxmpNiFb9clIioqP5Oik1seLCICztXVhZqultrHuxwTheCRUZrHwlpyWdkSB2Al+FFBqmSwzIgZX4IQ==", + "requires": { + "json5": "2.2.0", + "log4js": "6.4.1", + "undertaker": "1.2.1" + } + }, + "@ohos/hvigor-ohos-plugin": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.0.6.tgz", + "integrity": "sha512-MAAi8uJxMzODUoSSNfBr+fU4HQ20dfQtkje9I+X4asc7qY2kAplW/q9f5XS8IOvv8zhC8OcSgsAXOAJuLMstOQ==", + "requires": { + "@ohos/hvigor-base": "1.0.6", + "@ohos/sdkmanager-common": "1.1.3", + "ajv": "8.10.0", + "archiver": "5.3.0", + "execa": "5.1.1", + "fs-extra": "10.0.0", + "glob": "7.2.0", + "iconv-lite": "0.6.3", + "json5": "2.2.0", + "lodash": "4.17.21", + "pretty-hrtime": "1.0.3", + "resolve-package-path": "4.0.3" + }, + "dependencies": { + "fs-extra": { + "version": "10.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + } + } + }, + "@ohos/sdkmanager-common": { + "version": "1.1.3", + "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-1.1.3.tgz", + "integrity": "sha512-d2uhVauDDJZIUvyyaWWoavG4N/jLyfF5IH5kEXKV6R8HNf3606H1zDQzA+UZtOfwwJFXhD9djRjnVFNB8xc7aw==" + }, + "ajv": { + "version": "8.10.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "archiver": { + "version": "5.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/archiver/-/archiver-5.3.0.tgz", + "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.0", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "requires": { + "is-number": "^4.0.0" + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "async": { + "version": "3.2.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "requires": { + "async-done": "^1.2.2" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://repo.huaweicloud.com/repository/npm/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://repo.huaweicloud.com/repository/npm/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "crc-32": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/crc-32/-/crc-32-1.2.1.tgz", + "integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.3.1" + } + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "date-format": { + "version": "4.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/date-format/-/date-format-4.0.6.tgz", + "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.59", + "resolved": "https://repo.huaweicloud.com/repository/npm/es5-ext/-/es5-ext-0.10.59.tgz", + "integrity": "sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "5.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + } + }, + "flagged-respawn": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==" + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "hypium": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/hypium/-/hypium-1.0.0.tgz", + "integrity": "sha512-nl+RQVv2AU/5FvFRhsXyWO5wh+2huhdqRZ3bszBWZzW+kpNI3AT4ydvVRYIfaQbYwV4UlX/rSc7BtFjLAezhow==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://repo.huaweicloud.com/repository/npm/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "4.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "liftoff": { + "version": "4.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "requires": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "object.map": "^1.0.1", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "log4js": { + "version": "6.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "requires": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stdout": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=" + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "requires": { + "once": "^1.3.2" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pretty-hrtime": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz", + "integrity": "sha1-9ualItPmBwRSK/Db5oVu0g515Nw=" + }, + "printj": { + "version": "1.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/printj/-/printj-1.3.1.tgz", + "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-glob": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "requires": { + "resolve": "^1.20.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-package-path": { + "version": "4.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-package-path/-/resolve-package-path-4.0.3.tgz", + "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==", + "requires": { + "path-root": "^0.1.1" + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" + }, + "streamroller": { + "version": "3.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/streamroller/-/streamroller-3.0.6.tgz", + "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "requires": { + "date-format": "^4.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + }, + "dependencies": { + "is-number": { + "version": "7.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + } + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + } + } + } +} diff --git a/FA/metal_detection/package.json b/FA/metal_detection/package.json new file mode 100644 index 0000000000000000000000000000000000000000..71cb6b537b28dcba6ecd6c963ab40bb1fffedd8b --- /dev/null +++ b/FA/metal_detection/package.json @@ -0,0 +1,18 @@ +{ + "license":"ISC", + "devDependencies":{}, + "name":"metaldetection", + "ohos":{ + "org":"huawei", + "directoryLevel":"project", + "buildTool":"hvigor" + }, + "description":"example description", + "repository":{}, + "version":"1.0.0", + "dependencies":{ + "@ohos/hvigor-ohos-plugin":"1.0.6", + "hypium":"^1.0.0", + "@ohos/hvigor":"1.0.6" + } +} \ No newline at end of file diff --git a/FA/robot_dog/.idea/.deveco/module/entry.cache.json b/FA/robot_dog/.idea/.deveco/module/entry.cache.json new file mode 100644 index 0000000000000000000000000000000000000000..fcb3d640670ae51dd3f157a3c61386e88a174084 --- /dev/null +++ b/FA/robot_dog/.idea/.deveco/module/entry.cache.json @@ -0,0 +1,14 @@ +{ + "BuildOptions":{ + "SELECT_BUILD_TARGET":"default", + "BUILD_PATH":{ + "OUTPUT_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\robotDog\\entry\\build\\default\\outputs\\default", + "RES_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\robotDog\\entry\\build\\default\\intermediates\\res\\default", + "ETS_SUPER_VISUAL_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\robotDog\\entry\\build\\default\\cache\\default\\CompileETS", + "JS_ASSETS_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\robotDog\\entry\\build\\default\\intermediates\\assets\\default", + "RES_PROFILE_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\robotDog\\entry\\build\\default\\intermediates\\res\\default\\resources\\base\\profile", + "WORKER_LOADER":"C:\\Users\\china\\DevEcoStudioProjects\\robotDog\\entry\\build\\default\\intermediates\\loader\\default\\loader.json", + "MANIFEST_JSON":"C:\\Users\\china\\DevEcoStudioProjects\\robotDog\\entry\\build\\default\\intermediates\\manifest\\default" + } + } +} \ No newline at end of file diff --git a/FA/robot_dog/.idea/.deveco/project.cache.json b/FA/robot_dog/.idea/.deveco/project.cache.json new file mode 100644 index 0000000000000000000000000000000000000000..fabacc2608f4b3a7db4589c22353d9be40624b52 --- /dev/null +++ b/FA/robot_dog/.idea/.deveco/project.cache.json @@ -0,0 +1,12 @@ +{ + "BuildOptions":{ + "BUNDLE_NAME":"", + "BUILD_PATH":{ + "OUTPUT_PATH":"C:\\Users\\china\\DevEcoStudioProjects\\robotDog\\build\\outputs\\default" + }, + "SELECT_BUILD_PRODUCT":"default" + }, + "CommonInfo":{ + "project.ide.version":"3.0.0.900" + } +} \ No newline at end of file diff --git a/FA/robot_dog/.idea/.gitignore b/FA/robot_dog/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..26d33521af10bcc7fd8cea344038eaaeb78d0ef5 --- /dev/null +++ b/FA/robot_dog/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/FA/robot_dog/.idea/configurationModuleSettings.xml b/FA/robot_dog/.idea/configurationModuleSettings.xml new file mode 100644 index 0000000000000000000000000000000000000000..d5d7057972a2b26e2ee5f1c9df6d3d2e1be0e2b9 --- /dev/null +++ b/FA/robot_dog/.idea/configurationModuleSettings.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/FA/robot_dog/.idea/modules.xml b/FA/robot_dog/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..8ad7e5da53913ff8216161b3cced059861e41b9d --- /dev/null +++ b/FA/robot_dog/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/FA/robot_dog/.idea/robotDog.iml b/FA/robot_dog/.idea/robotDog.iml new file mode 100644 index 0000000000000000000000000000000000000000..33f46c74235ca6c647fa77a3ac1c676c65c6c339 --- /dev/null +++ b/FA/robot_dog/.idea/robotDog.iml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FA/robot_dog/build-profile.json5 b/FA/robot_dog/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..af956a732be8bd3e68aa9fcab3eb389c965043ad --- /dev/null +++ b/FA/robot_dog/build-profile.json5 @@ -0,0 +1,26 @@ +{ + "app": { + "compileSdkVersion": 8, + "compatibleSdkVersion": 8, + "products": [ + { + "name": "default", + "signingConfig": "default", + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/FA/robot_dog/entry/.gitignore b/FA/robot_dog/entry/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..4f9a973815d0b5e49bc8547681a6b4bc7a178d12 --- /dev/null +++ b/FA/robot_dog/entry/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.preview +/build \ No newline at end of file diff --git a/FA/robot_dog/entry/build-profile.json5 b/FA/robot_dog/entry/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..ae58d1d0a70c602c9cfe1909b00dfec899ba1944 --- /dev/null +++ b/FA/robot_dog/entry/build-profile.json5 @@ -0,0 +1,13 @@ +{ + "apiType": 'faMode', + "buildOption": { + }, + "targets": [ + { + "name": "default", + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/FA/robot_dog/entry/hvigorfile.js b/FA/robot_dog/entry/hvigorfile.js new file mode 100644 index 0000000000000000000000000000000000000000..bcec4c99653062cbf17702c40a2dd2a7b809b81a --- /dev/null +++ b/FA/robot_dog/entry/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').legacyHapTasks diff --git a/FA/robot_dog/entry/package-lock.json b/FA/robot_dog/entry/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..15bc7145be1490029883067847743ea7134cf545 --- /dev/null +++ b/FA/robot_dog/entry/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "entry", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/FA/robot_dog/entry/package.json b/FA/robot_dog/entry/package.json new file mode 100644 index 0000000000000000000000000000000000000000..992c771b9e6be8904ce4204f075df58a9b0902cc --- /dev/null +++ b/FA/robot_dog/entry/package.json @@ -0,0 +1,14 @@ +{ + "license":"ISC", + "devDependencies":{}, + "name":"entry", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "description":"example description", + "repository":{}, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/FA/robot_dog/entry/src/main/config.json b/FA/robot_dog/entry/src/main/config.json new file mode 100644 index 0000000000000000000000000000000000000000..b6451fd115e8d1e1a88be1fc308269daa40e1b58 --- /dev/null +++ b/FA/robot_dog/entry/src/main/config.json @@ -0,0 +1,67 @@ +{ + "app": { + "vendor": "example", + "bundleName": "com.example.robotdog", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "mainAbility": ".MainAbility", + "deviceType": [ + "phone" + ], + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "orientation": "unspecified", + "visible": true, + "srcPath": "MainAbility", + "name": ".MainAbility", + "srcLanguage": "ets", + "icon": "$media:icon", + "description": "$string:MainAbility_desc", + "formsEnabled": false, + "label": "$string:MainAbility_label", + "type": "page", + "launchType": "standard" + } + ], + "distro": { + "moduleType": "entry", + "installationFree": false, + "deliveryWithInstall": true, + "moduleName": "entry" + }, + "package": "com.example.entry", + "srcPath": "", + "name": ".entry", + "js": [ + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "pages": [ + "pages/index" + ], + "name": ".MainAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} \ No newline at end of file diff --git a/FA/robot_dog/entry/src/main/ets/MainAbility/app.ets b/FA/robot_dog/entry/src/main/ets/MainAbility/app.ets new file mode 100644 index 0000000000000000000000000000000000000000..aa449b209d0336ed249d76fb235b91aca4979803 --- /dev/null +++ b/FA/robot_dog/entry/src/main/ets/MainAbility/app.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// @ts-ignore +import tcpserverapi from '@ohos.tcpserverapi' + +export default { + onCreate() { + console.info('Application onCreate') + tcpserverapi.initServer() + }, + onDestroy() { + console.info('Application onDestroy') + }, +} \ No newline at end of file diff --git a/FA/robot_dog/entry/src/main/ets/MainAbility/model/CommonLog.ets b/FA/robot_dog/entry/src/main/ets/MainAbility/model/CommonLog.ets new file mode 100644 index 0000000000000000000000000000000000000000..f1de2ce6e28e763a795585efb8634eabdabc7deb --- /dev/null +++ b/FA/robot_dog/entry/src/main/ets/MainAbility/model/CommonLog.ets @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License,Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * 日志管理类 + */ + +export default class CommonLog { + static module: string = "robotDog" + + static info(log: string) { + console.info(CommonLog.module + " : " + log) + } + + static error(log: string) { + console.error(CommonLog.module + " : " + log) + } + + static debug(log: string) { + console.debug(CommonLog.module + " : " + log) + } +} \ No newline at end of file diff --git a/FA/robot_dog/entry/src/main/ets/MainAbility/model/comtrolData.ets b/FA/robot_dog/entry/src/main/ets/MainAbility/model/comtrolData.ets new file mode 100644 index 0000000000000000000000000000000000000000..bce63a6e3ff868e65c2514ecbb3c7928269a709e --- /dev/null +++ b/FA/robot_dog/entry/src/main/ets/MainAbility/model/comtrolData.ets @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License,Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import CommonLog from './CommonLog.ets'; + +let NextId = 0; +export class CommandData { + id: string; + imgSrc: string; + name: string; + commandName: string + + constructor(imgSrc: string, name: string, commandName: string) { + this.id = `${NextId++}`; + this.imgSrc = imgSrc; + this.name = name; + this.commandName = commandName; + } +} + +export function initializeOnStartup(Control: any[]): Array { + let CommandDataArray: Array = [] + Control.forEach(item => { + CommonLog.info(item.title); + CommandDataArray.push(new CommandData(item.imgSrc, item.name, item.commandName)); + }) + return CommandDataArray; +} + +//控制命令 +export const ControlData: any[] = [ + { + "imgSrc": $r("app.media.icon_pushUp"), + "name":'俯卧撑', + "commandName": '{pushUp}' + }, + { + "imgSrc": $r("app.media.icon_handshake"), + "name":'握手', + "commandName": '{handshake}' + }, + { + "imgSrc": $r("app.media.icon_dance"), + "name":'跳舞', + "commandName": '{dance}' + }, + { + "imgSrc": $r("app.media.icon_urine"), + "name":'小便', + "commandName": '{urine}' + } +] \ No newline at end of file diff --git a/FA/robot_dog/entry/src/main/ets/MainAbility/pages/index.ets b/FA/robot_dog/entry/src/main/ets/MainAbility/pages/index.ets new file mode 100644 index 0000000000000000000000000000000000000000..f7ae29559cf336d2c128d910a7f195af32aadb6e --- /dev/null +++ b/FA/robot_dog/entry/src/main/ets/MainAbility/pages/index.ets @@ -0,0 +1,166 @@ +import CommonLog from '../model/CommonLog.ets'; +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// @ts-ignore +import tcpserverapi from '@ohos.tcpserverapi' +import {CommandData, initializeOnStartup, ControlData} from '../model/comtrolData'; +import prompt from '@system.prompt'; + +@Component +struct TitleName { + build() { + Flex() { + Text('机器狗') + .fontSize('36lpx') + .fontColor('#FFFFFF') + .margin({ left: '40lpx', top: '16lpx' }) + } + } +} + +@Component +struct LogoImage { + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Image($r("app.media.icon_logo")) + .width('480lpx') + .height('320lpx') + } + .width('100%') + .height('372lpx') + } +} + + +@Component +struct ConnectState { + @Prop connectState:boolean + build() { + //连接状态 + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + if (this.connectState) { + Text('已连接') + .fontSize('36lpx') + .fontColor('#FFFFFF') + Image($r("app.media.icon_switch_on")) + .width('112lpx') + .height('112lpx') + } + else { + Text('未连接') + .fontSize('36lpx') + .fontColor('#FFFFFF') + Image($r("app.media.icon_switch_off")) + .width('112lpx') + .height('112lpx') + } + } + .linearGradient({ + angle: 180, + colors: [[0x363D4D, 0], [0x303644, 0.49], [0x22252F, 1.0]] + }) + .borderRadius('32lpx') + .width('672lpx') + .height('146lpx') + .padding({ left: '32lpx', right: '32lpx' }) + } +} + +@Component +struct CommandListItem { + //控制命令 + @State command: any[] = ControlData + @State commandItems: CommandData[] = initializeOnStartup(this.command) + @State name: string = '' + @Prop connectState:boolean + build() { + Flex({ wrap: FlexWrap.Wrap, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceEvenly }) { + ForEach(this.commandItems, item => { + Stack() { + Image(this.name == item.name ? $r("app.media.bg_select") : $r("app.media.bg_unselect")) + Flex({ + direction: FlexDirection.Column, + alignItems: ItemAlign.Center, + justifyContent: FlexAlign.SpaceEvenly + }) { + + Image(item.imgSrc) + .width('112lpx') + .height('112lpx') + Text(item.name) + .fontSize('36lpx') + .fontColor('#FFFFFF') + } + .onClick(() => { + if(this.connectState) + { + this.name = item.name; + tcpserverapi.sendRobotDogCommand(item.commandName); + } + else{ + prompt.showToast({ + message: 'Robot dog not connected', + duration: 2000, + }); + } + }) + } + .borderRadius('32lpx') + .width('324lpx') + .height('242lpx') + .margin({ bottom: '12lpx' }) + + }, item => item.id.toString()) + } + .width('100%') + .height('600lpx') + .margin({ top: '16lpx' }) + } +} + +@Entry +@Component +struct Index { + @State connectState: boolean = false + aboutToAppear() { + var intervalID = setInterval(() => { + //NAPI调用 + tcpserverapi.recvMsg().then((result) => { + CommonLog.info(result.clientNumber) + if (result.clientNumber > 0) { + this.connectState = true; + } + else{ + this.connectState = false; + } + }) + }, 1000) + } + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { + TitleName(); + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) { + LogoImage(); + ConnectState({connectState:this.connectState}); + CommandListItem({connectState:this.connectState}); + } + .height('90%') + } + .backgroundColor('#000000') + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/FA/robot_dog/entry/src/main/resources/base/element/string.json b/FA/robot_dog/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..30f9f321da2de77a5bc67d5b519d8a10f958afa2 --- /dev/null +++ b/FA/robot_dog/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "entry_desc", + "value": "description" + }, + { + "name": "MainAbility_desc", + "value": "description" + }, + { + "name": "MainAbility_label", + "value": "机器狗" + } + ] +} \ No newline at end of file diff --git a/FA/robot_dog/entry/src/main/resources/base/media/bg_select.png b/FA/robot_dog/entry/src/main/resources/base/media/bg_select.png new file mode 100644 index 0000000000000000000000000000000000000000..00a756a9145bfd1efab3ccd72c700b0d14a2e5b5 Binary files /dev/null and b/FA/robot_dog/entry/src/main/resources/base/media/bg_select.png differ diff --git a/FA/robot_dog/entry/src/main/resources/base/media/bg_unselect.png b/FA/robot_dog/entry/src/main/resources/base/media/bg_unselect.png new file mode 100644 index 0000000000000000000000000000000000000000..7a31328a7f7c13f5ed019dd17ea6cf85222ffe66 Binary files /dev/null and b/FA/robot_dog/entry/src/main/resources/base/media/bg_unselect.png differ diff --git a/FA/robot_dog/entry/src/main/resources/base/media/icon.png b/FA/robot_dog/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..60da8349535bf2d2cd37dca4beb9a7fd52a0947e Binary files /dev/null and b/FA/robot_dog/entry/src/main/resources/base/media/icon.png differ diff --git a/FA/robot_dog/entry/src/main/resources/base/media/icon_dance.png b/FA/robot_dog/entry/src/main/resources/base/media/icon_dance.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb48f414ba5338b76985e3dd772d4e2fd4c02cc Binary files /dev/null and b/FA/robot_dog/entry/src/main/resources/base/media/icon_dance.png differ diff --git a/FA/robot_dog/entry/src/main/resources/base/media/icon_handshake.png b/FA/robot_dog/entry/src/main/resources/base/media/icon_handshake.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc50a356e35cf1b22a4cf86efd4834c8c9640e1 Binary files /dev/null and b/FA/robot_dog/entry/src/main/resources/base/media/icon_handshake.png differ diff --git a/FA/robot_dog/entry/src/main/resources/base/media/icon_logo.png b/FA/robot_dog/entry/src/main/resources/base/media/icon_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4e21b77c12e880320c892e1b16289a34bf117bf5 Binary files /dev/null and b/FA/robot_dog/entry/src/main/resources/base/media/icon_logo.png differ diff --git a/FA/robot_dog/entry/src/main/resources/base/media/icon_pushUp.png b/FA/robot_dog/entry/src/main/resources/base/media/icon_pushUp.png new file mode 100644 index 0000000000000000000000000000000000000000..776fae56324162d89dd77654c81d1463b3f0545d Binary files /dev/null and b/FA/robot_dog/entry/src/main/resources/base/media/icon_pushUp.png differ diff --git a/FA/robot_dog/entry/src/main/resources/base/media/icon_switch_off.png b/FA/robot_dog/entry/src/main/resources/base/media/icon_switch_off.png new file mode 100644 index 0000000000000000000000000000000000000000..802a7d6186342f1c189b317bab18e08f0f3a4805 Binary files /dev/null and b/FA/robot_dog/entry/src/main/resources/base/media/icon_switch_off.png differ diff --git a/FA/robot_dog/entry/src/main/resources/base/media/icon_switch_on.png b/FA/robot_dog/entry/src/main/resources/base/media/icon_switch_on.png new file mode 100644 index 0000000000000000000000000000000000000000..9422b7b9ae2ba1c3d280f97196cb3256cfe895be Binary files /dev/null and b/FA/robot_dog/entry/src/main/resources/base/media/icon_switch_on.png differ diff --git a/FA/robot_dog/entry/src/main/resources/base/media/icon_urine.png b/FA/robot_dog/entry/src/main/resources/base/media/icon_urine.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca915af21effbac24a52929787707f0a5f3181f Binary files /dev/null and b/FA/robot_dog/entry/src/main/resources/base/media/icon_urine.png differ diff --git a/FA/robot_dog/hvigorfile.js b/FA/robot_dog/hvigorfile.js new file mode 100644 index 0000000000000000000000000000000000000000..cff9f0dfcf8cb00cca34e7f50d61380cf5496868 --- /dev/null +++ b/FA/robot_dog/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').legacyAppTasks \ No newline at end of file diff --git a/FA/robot_dog/package-lock.json b/FA/robot_dog/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..a976e8c3937c4f74f381829ff543abb43ea04aaa --- /dev/null +++ b/FA/robot_dog/package-lock.json @@ -0,0 +1,1657 @@ +{ + "name": "robotdog", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/hvigor": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.0.6.tgz", + "integrity": "sha512-jjp7vpvUOMW1Nf7TdyhOtonwWHoSyBJLUiZTQqIx/GJV4UJyIqsiURUOqFwncQ4L7PDdeHuWly4uEelknYeWhg==", + "requires": { + "@ohos/hvigor-base": "1.0.6", + "interpret": "1.4.0", + "liftoff": "4.0.0", + "mute-stdout": "1.0.0", + "pretty-hrtime": "1.0.0", + "v8flags": "3.2.0", + "yargs": "7.1.0" + } + }, + "@ohos/hvigor-base": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.0.6.tgz", + "integrity": "sha512-cRDnWICTxmpNiFb9clIioqP5Oik1seLCICztXVhZqultrHuxwTheCRUZrHwlpyWdkSB2Al+FFBqmSwzIgZX4IQ==", + "requires": { + "json5": "2.2.0", + "log4js": "6.4.1", + "undertaker": "1.2.1" + } + }, + "@ohos/hvigor-ohos-plugin": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.0.6.tgz", + "integrity": "sha512-MAAi8uJxMzODUoSSNfBr+fU4HQ20dfQtkje9I+X4asc7qY2kAplW/q9f5XS8IOvv8zhC8OcSgsAXOAJuLMstOQ==", + "requires": { + "@ohos/hvigor-base": "1.0.6", + "@ohos/sdkmanager-common": "1.1.3", + "ajv": "8.10.0", + "archiver": "5.3.0", + "execa": "5.1.1", + "fs-extra": "10.0.0", + "glob": "7.2.0", + "iconv-lite": "0.6.3", + "json5": "2.2.0", + "lodash": "4.17.21", + "pretty-hrtime": "1.0.3", + "resolve-package-path": "4.0.3" + }, + "dependencies": { + "fs-extra": { + "version": "10.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + } + } + }, + "@ohos/sdkmanager-common": { + "version": "1.1.3", + "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-1.1.3.tgz", + "integrity": "sha512-d2uhVauDDJZIUvyyaWWoavG4N/jLyfF5IH5kEXKV6R8HNf3606H1zDQzA+UZtOfwwJFXhD9djRjnVFNB8xc7aw==" + }, + "ajv": { + "version": "8.10.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "archiver": { + "version": "5.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/archiver/-/archiver-5.3.0.tgz", + "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.0", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "requires": { + "is-number": "^4.0.0" + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "async": { + "version": "3.2.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "requires": { + "async-done": "^1.2.2" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://repo.huaweicloud.com/repository/npm/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://repo.huaweicloud.com/repository/npm/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "crc-32": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/crc-32/-/crc-32-1.2.1.tgz", + "integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.3.1" + } + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "date-format": { + "version": "4.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/date-format/-/date-format-4.0.6.tgz", + "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.59", + "resolved": "https://repo.huaweicloud.com/repository/npm/es5-ext/-/es5-ext-0.10.59.tgz", + "integrity": "sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "5.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + } + }, + "flagged-respawn": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==" + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "hypium": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/hypium/-/hypium-1.0.0.tgz", + "integrity": "sha512-nl+RQVv2AU/5FvFRhsXyWO5wh+2huhdqRZ3bszBWZzW+kpNI3AT4ydvVRYIfaQbYwV4UlX/rSc7BtFjLAezhow==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://repo.huaweicloud.com/repository/npm/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "4.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "liftoff": { + "version": "4.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "requires": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "object.map": "^1.0.1", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "log4js": { + "version": "6.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "requires": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stdout": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=" + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "requires": { + "once": "^1.3.2" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pretty-hrtime": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz", + "integrity": "sha1-9ualItPmBwRSK/Db5oVu0g515Nw=" + }, + "printj": { + "version": "1.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/printj/-/printj-1.3.1.tgz", + "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-glob": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "requires": { + "resolve": "^1.20.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-package-path": { + "version": "4.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-package-path/-/resolve-package-path-4.0.3.tgz", + "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==", + "requires": { + "path-root": "^0.1.1" + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" + }, + "streamroller": { + "version": "3.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/streamroller/-/streamroller-3.0.6.tgz", + "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "requires": { + "date-format": "^4.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + }, + "dependencies": { + "is-number": { + "version": "7.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + } + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + } + } + } +} diff --git a/FA/robot_dog/package.json b/FA/robot_dog/package.json new file mode 100644 index 0000000000000000000000000000000000000000..f45a4949f44a354da4b69453a04280af208105e5 --- /dev/null +++ b/FA/robot_dog/package.json @@ -0,0 +1,18 @@ +{ + "license":"ISC", + "devDependencies":{}, + "name":"robotdog", + "ohos":{ + "org":"huawei", + "directoryLevel":"project", + "buildTool":"hvigor" + }, + "description":"example description", + "repository":{}, + "version":"1.0.0", + "dependencies":{ + "@ohos/hvigor-ohos-plugin":"1.0.6", + "hypium":"^1.0.0", + "@ohos/hvigor":"1.0.6" + } +} \ No newline at end of file diff --git a/README.md b/README.md index 8174072a093a7fd6663dd8c0998daeba790aa00e..6e8c10791dfc5ff35ea9fd62893bbd0745f1a717 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,19 @@ - [智能停车场_车牌识别器(OpenCV版本)](docs/GreyWolf_ImageRecognition_LocalAI/README.md) #### 标准系统应用 - [智能停车场_车辆管理中控台](docs/GreyWolf_ParkingManageSys_FA/README.md) + +## 运动控制场景 + +#### 简介 + +基于运动控制场景打造的样例,开发者可以体验OpenHarmony在运动控制、自动化、传感器等领域的应用。 + +### 样例汇总 + ++ [基于OpenHarmony的智能指南针](docs/electronic_compass/README.md) ++ [基于OpenHarmony的智能金属探测器](docs/metal_detection/README.md) ++ [OpenHarmony机器狗应用](docs/robot_dog/README.md) + ## 快速上手场景 #### 简介 diff --git a/dev/team_x/electronic_compass/main.c b/dev/team_x/electronic_compass/main.c new file mode 100644 index 0000000000000000000000000000000000000000..93504c666029578f6f8765ae29171baf6eeb466e --- /dev/null +++ b/dev/team_x/electronic_compass/main.c @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + ****************************************************************************** + * @file main.c + * @author GEEKROS, site:www.geekros.com + ****************************************************************************** +*/ + +#include "main.h" + +#define BAUD_115200 115200 + +#define STACK_SIZE_4K 4096 +#define STACK_SIZE_5K 5120 + +#define PRIOR_3 3 +#define PRIOR_4 4 +#define PRIOR_5 5 + +/******************************************************************* + * @ 函数? ? main + * @ 功能说明? 程序启动入口,主要初始化?些开发板的模块以及任? + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +int main(void) +{ + // 定义任务创建的返回?,默认为成? + UINT32 LiteOS_Status = LOS_OK; + + // LiteOS内核初始? + LiteOS_Status = LOS_KernelInit(); + if (LiteOS_Status != LOS_OK) { + // LiteOS内核初始化失? + return LOS_NOK; + } else { + //SystemClock_Config(); + + // 时钟初始? + Delay_Init(LOSCFG_BASE_CORE_TICK_PER_SECOND); + + // USB虚拟串口初始? + Usb_Init(); + + // CPU模块初始? + Cpu_Init(); + + // LED模块初始? + Led_Init(); + + // BUZZER模块初始? + Buzzer_Init(); + + // CAN模块初始? + Can_Init(); + + // POWER模块初始? + Power_Init(); + + // KEY模块初始? + Key_Init(); + + // ADC模块初始? + Adc_Init(); + + // PWM模块初始? + Pwm_Init(); + + // MPU模块初始? + Mpu_Init(); + + // wifi模块初始? + Wifi_Init(BAUD_115200); + + if(ESP8266_start_TCP() == -1) { + GREEN_LED_OFF(); + } else { + GREEN_LED_ON(); + } + + // 任务初始? + LiteOS_Status = Task_Init(); + // ?启LiteOS任务调度 + LOS_Start(); + } + while (1) { + ; + } +} + +/******************************************************************* + * @ 函数? ? Task_Init + * @ 功能说明? 任务初始化,为了方便管理,所有的任务创建函数都可以放在这个函数里? + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +static UINT32 Task_Init(void) +{ + + // 定义任务创建的返回?,默认为成? + UINT32 Status = LOS_OK; + + Status = Start_System_Task(); + if (Status != LOS_OK) { + // 任务启动失败 + return LOS_NOK; + } + + Status = Start_Serial_Task(); + if (Status != LOS_OK) { + // 任务启动失败 + return LOS_NOK; + } + + Status = Start_User_Task(); + if (Status != LOS_OK) { + // 任务启动失败 + return LOS_NOK; + } + + // ?有任务启动成功后播放?机音? + if(Status == LOS_OK) { + //Buzzer_Start_Music(); + RED_LED_ON(); //红色作为电源指示? + Usb_Write_Data("ALL OK\r\n"); + } + return Status; +} + +/******************************************************************* + * @ 函数? ? Start_System_Task + * @ 功能说明? 启动系统任务 + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +UINT32 System_Task_Handle; +static UINT32 Start_System_Task(void) +{ + + // 定义任务创建的返回?,默认为成? + UINT32 Task_Status = LOS_OK; + + TSK_INIT_PARAM_S task_init_param; + + // 任务优先级,数?越小,优先级越? + task_init_param.usTaskPrio = PRIOR_3; + + // 任务名称 + task_init_param.pcName = "System_Task"; + + // 任务函数入口 + task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)System_Task; + + // 任务堆栈大小 + task_init_param.uwStackSize = STACK_SIZE_4K; + + // 创建任务 + Task_Status = LOS_TaskCreate(&System_Task_Handle, &task_init_param); + + return Task_Status; +} + +/******************************************************************* + * @ 函数? ? Start_Serial_Task + * @ 功能说明? 启动串口任务 + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +UINT32 Serial_Task_Handle; +static UINT32 Start_Serial_Task(void) +{ + + // 定义任务创建的返回?,默认为成? + UINT32 Task_Status = LOS_OK; + + TSK_INIT_PARAM_S task_init_param; + + // 任务优先级,数?越小,优先级越? + task_init_param.usTaskPrio = PRIOR_4; + + // 任务名称 + task_init_param.pcName = "Serial_Task"; + + // 任务函数入口 + task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)Serial_Task; + + // 任务堆栈大小 + //task_init_param.uwStackSize = 4096; + task_init_param.uwStackSize = STACK_SIZE_5K; + // 创建任务 + Task_Status = LOS_TaskCreate(&Serial_Task_Handle, &task_init_param); + + return Task_Status; +} + +/******************************************************************* + * @ 函数? ? Start_User_Task + * @ 功能说明? 启动用户任务 + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +UINT32 User_Task_Handle; +static UINT32 Start_User_Task(void) +{ + + // 定义任务创建的返回?,默认为成? + UINT32 Task_Status = LOS_OK; + + TSK_INIT_PARAM_S task_init_param; + + // 任务优先级,数?越小,优先级越? + task_init_param.usTaskPrio = PRIOR_5; + + // 任务名称 + task_init_param.pcName = "User_Task"; + + // 任务函数入口 + task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)User_Task; + + // 任务堆栈大小 + task_init_param.uwStackSize = STACK_SIZE_4K; + + // 创建任务 + Task_Status = LOS_TaskCreate(&User_Task_Handle, &task_init_param); + + return Task_Status; +} diff --git a/dev/team_x/electronic_compass/serial_task.c b/dev/team_x/electronic_compass/serial_task.c new file mode 100644 index 0000000000000000000000000000000000000000..f78595ca255af928b4ca41ca2da45a59cb85e7fb Binary files /dev/null and b/dev/team_x/electronic_compass/serial_task.c differ diff --git a/dev/team_x/electronic_compass/wifi.c b/dev/team_x/electronic_compass/wifi.c new file mode 100644 index 0000000000000000000000000000000000000000..6f69629b7f6c9d849f256882625f2d1bb89d23c7 --- /dev/null +++ b/dev/team_x/electronic_compass/wifi.c @@ -0,0 +1,409 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/******************************************************************************* + * @file wifi.c + * @author GEEKROS, site:www.geekros.com + ****************************************************************************** +*/ +#include "wifi.h" +#include "led.h" + +/****************************************************************** + * @ 函数? ? Wifi_Init + * @ 功能说明? ESP8266WiFi模块初始化,UART2作为WiFi模块专用接口 + * @ 参数 ? int baud_rate 波特? + * @ 返回? ? NULL + *****************************************************************/ +void Wifi_Init(int baud_rate) +{ + USART_InitTypeDef USART_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); + + GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2); + GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2); + + GPIO_StructInit(&GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + + GPIO_Init(GPIOD, &GPIO_InitStructure); + + USART_DeInit(USART2); + USART_StructInit(&USART_InitStructure); + USART_InitStructure.USART_BaudRate = baud_rate; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + + USART_Init(USART2, &USART_InitStructure); + USART_ITConfig(USART2, USART_IT_RXNE|USART_IT_IDLE, ENABLE); + + USART_Cmd(USART2, ENABLE); + + NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + +} + +/****************************************************************** + * @ 函数? ? USART2_IRQHandler + * @ 功能说明? WiFi模块中断函数,接收UART2数据 + * @ 参数 ? NULL + * @ 返回? ? NULL + *****************************************************************/ +void USART2_IRQHandler(void) +{ + u8 ucCh; + + if(USART_GetITStatus( USART2, USART_IT_RXNE ) != RESET ) { + ucCh = USART_ReceiveData( USART2 ); + if(ESP8266_Fram_Record_Struct .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 )) { + ESP8266_Fram_Record_Struct .Data_RX_BUF[ ESP8266_Fram_Record_Struct .InfBit .FramLength ++ ] = ucCh; + } + } + + if( USART_GetITStatus( USART2, USART_IT_IDLE ) == SET ) { // 如果总线空闲 + ESP8266_Fram_Record_Struct .InfBit .FramFinishFlag = 1; + ucCh = USART_ReceiveData( USART2 ); // 由软件序列清除中断标志位(先读USART_SR,然后读USART_DR? + } +} + +/****************************************************************** + * @ 函数? ? Wifi_Parse_Json + * @ 功能说明? 解析JSON数据 + * @ 参数 ? const char *json JSON字符串数? + * @ 返回? ? NULL + *****************************************************************/ +void Wifi_Parse_Json(char* json) +{ + // 回调USB串口任务的JSON通讯协议解析与处理函? + Serial_Json_Handle(json); +} + +struct STRUCT_USART_Fram ESP8266_Fram_Record_Struct = { 0 }; // 定义了一个数据帧结构? +// 对ESP8266模块发?相关指? +// cmd 待发送的指令 +void ESP8266_Send_AT_Cmd(char *cmd,u32 time) +{ + ESP8266_Fram_Record_Struct .InfBit .FramLength = 0; // 重新接收新的数据? + memset(ESP8266_Fram_Record_Struct .Data_RX_BUF,0,sizeof(ESP8266_Fram_Record_Struct .Data_RX_BUF)); + ESP8266_USART("%s\r\n", cmd); + delay_ms(time); +} + +void ESP8266_send_at(void) +{ + char cStr [20]; + sprintf ( cStr, "AT"); + ESP8266_Send_AT_Cmd(cStr, 100); +} + +void ESP8266_set_sta_mode(void) +{ + char cStr [20]; + sprintf ( cStr, "AT+CWMODE=1"); + ESP8266_Send_AT_Cmd(cStr, 100); +} + +void ESP8266_connect_wifi(void) +{ + char cStr [64]; + sprintf ( cStr, "AT+CWJAP=%s,%s",WIFI_SSID,WIFI_PASSWORD); + Usb_Write_Data("SSID: %s PWD: %s\r\n",WIFI_SSID,WIFI_PASSWORD); + ESP8266_Send_AT_Cmd( cStr,5000); +} + +void ESP8266_TCP_connect(void) +{ + char cStr [64]; + sprintf ( cStr, "AT+CIPSTART=\"TCP\",%s,%d",TCP_SERVICE_IP,TCP_COM); + ESP8266_Send_AT_Cmd( cStr,1000); +} + +void ESP8266_start_send(unsigned int len) +{ + char cStr [20]; + sprintf ( cStr, "AT+CIPSEND=%d",len); + ESP8266_Send_AT_Cmd( cStr,50); +} + +void ESP8266_close_tcp_connect(void) +{ + char cStr [20]; + sprintf ( cStr, "AT+CIPCLOSE"); + ESP8266_Send_AT_Cmd( cStr,200); +} + +void ESP8266_send_data(char *dat,unsigned int len) +{ + ESP8266_start_send(len); // start send + + ESP8266_USART("%s\r\n", dat); +} + +// AT jiexi +static int ESP8266AckDataDeal(u8 *pdat, u16 length, u8 *err) +{ + const char *src = (const char *)pdat; + + if(ESP8266_Fram_Record_Struct .InfBit .FramFinishFlag==1) { + ESP8266_Fram_Record_Struct .InfBit .FramFinishFlag=0; + } else { + // ERR + } + + if(NULL != strstr(src, "+CIPSTART")) { + if(strstr(src, "OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit .Connect_flag = 1; + } else { + ESP8266_Fram_Record_Struct .StateFlagBit .Connect_flag = 0; + } + return 0; + } else if(NULL != strstr(src, "+CIPCLOSE")) { + if(strstr(src, "OK")) { + return 0; + } + } + else if(NULL != strstr(src, "+CWMODE")) { + if(strstr(src, "OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit.Sta_Mode = 1; + } + return 0; + } else if(NULL != strstr(src, "+CWJAP")) { + if(strstr(src, "CONNECTED")) { + ESP8266_Fram_Record_Struct .StateFlagBit.Get_Ip_flag = 1; + } else { + ESP8266_Fram_Record_Struct .StateFlagBit.Get_Ip_flag = 0; + } + return 0; + } else if(NULL != strstr(src, "+CIPMODE")) { + if(strstr(src, "OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit.Trans_Mode = 1; + } + return 0; + } else if(NULL != strstr(src, "+CIPSEND")) { + if(strstr(src, "SEND OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit.Send_OK_flag = 1; + } else { + ESP8266_Fram_Record_Struct .StateFlagBit.Send_OK_flag = 0; + } + return 0; + } else if(NULL != strstr(src, "OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit.ESP8266_Ready_flag = 1; + return 0; + } + return -1; +} + +signed char ESP8266_start_TCP(void) +{ + static unsigned char err = 0; + char cStr [128]; + unsigned char reconnect_cnt; + // AT + Usb_Write_Data("ESP2866 TEST\r\n"); + err = 0; + do { + ESP8266_send_at(); + ESP8266AckDataDeal(ESP8266_Fram_Record_Struct.Data_RX_BUF,ESP8266_Fram_Record_Struct .InfBit .FramLength,&err); + + if(err++ > 5) { + return -1; + } + GREEN_LED_TOGGLE(); + }while(!ESP8266_Fram_Record_Struct.StateFlagBit.ESP8266_Ready_flag); + + reconnect_cnt=0; + RECONNECT: + // AT+CIPCLOSE + Usb_Write_Data("close tcp connect\r\n"); + err = 0; + ESP8266_close_tcp_connect(); + + // AT+CWMODE set sta mode + Usb_Write_Data("set sta mode\r\n"); + err = 0; + do { + ESP8266_set_sta_mode(); + ESP8266AckDataDeal(ESP8266_Fram_Record_Struct.Data_RX_BUF,ESP8266_Fram_Record_Struct .InfBit .FramLength,&err); + if(err++ > 5) { + return -1; + } + GREEN_LED_TOGGLE(); + }while(!ESP8266_Fram_Record_Struct .StateFlagBit.Sta_Mode); + + // AT+CWJAP + Usb_Write_Data("connecting wifi......\r\n"); + err = 0; + ESP8266_Fram_Record_Struct.StateFlagBit.Get_Ip_flag=0; + do { + ESP8266_connect_wifi(); + ESP8266AckDataDeal(ESP8266_Fram_Record_Struct.Data_RX_BUF,ESP8266_Fram_Record_Struct .InfBit .FramLength,&err); + if(err++ > 5) { + return -1; + } + GREEN_LED_TOGGLE(); + }while(!ESP8266_Fram_Record_Struct.StateFlagBit.Get_Ip_flag); + + // AT+CIPSTART + Usb_Write_Data("building tcp connect......\r\n"); + err = 0; + ESP8266_Fram_Record_Struct.StateFlagBit.Connect_flag=0; + do { + ESP8266_TCP_connect(); + ESP8266AckDataDeal(ESP8266_Fram_Record_Struct.Data_RX_BUF,ESP8266_Fram_Record_Struct .InfBit .FramLength,&err); + if(err++ > 5) { + //return -1; + reconnect_cnt++; + Usb_Write_Data("reconnect_cnt = %d\r\n",reconnect_cnt); + if(reconnect_cnt<5) { + goto RECONNECT; + } else { + return -1; + } + } + GREEN_LED_TOGGLE(); + }while(!ESP8266_Fram_Record_Struct.StateFlagBit .Connect_flag); + + Usb_Write_Data("ESP8266 ok!!!\r\n"); + sprintf (cStr, "ESP8266 init success"); + Usb_Write_Data("cStr length: %d\r\n",strlen(cStr)); + ESP8266_send_data(cStr,strlen(cStr)); + + return 0; +} + + +static char *itoa( int value, char *string, int radix ) +{ + int i, d; + int flag = 0; + char *ptr = string; + + /* This implementation only works for decimal numbers. */ + if (radix != 10) { + *ptr = 0; + return string; + } + + if (!value) { + *ptr++ = 0x30; + *ptr = 0; + return string; + } + + /* if this is a negative value insert the minus sign. */ + if (value < 0) { + *ptr++ = '-'; + + /* Make the value positive. */ + value *= -1; + } + + for (i = 10000; i > 0; i /= 10) { + d = value / i; + + if (d || flag) { + *ptr++ = (char)(d + 0x30); + value -= (d * i); + flag = 1; + } + } + + /* Null terminate the string. */ + *ptr = 0; + + return string; + +} /* NCL_Itoa */ + +void USART_printf (USART_TypeDef *USARTx, char *Data, ...) +{ + const char *s; + int d; + char buf[16]; + va_list ap; + va_start(ap, Data); + + while ( * Data != 0 ) { // 判断数据是否到达结束? + + if ( * Data == 0x5c ) { //'\' + + switch ( *++Data ) { + case 'r': // 回车? + USART_SendData(USARTx, 0x0d); + Data ++; + break; + + case 'n': // 换行? + USART_SendData(USARTx, 0x0a); + Data ++; + break; + + default: + Data ++; + break; + } + } else if ( * Data == '%') { + switch (*++Data) + { + case 's': // 字符? + s = va_arg(ap, const char *); + for ( ; *s; s++) { + USART_SendData(USARTx,*s); + while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET ) { + ; + } + } + Data++; + break; + + case 'd': + d = va_arg(ap, int); // 十进刿 + itoa(d, buf, 10); + for (s = buf; *s; s++) { + USART_SendData(USARTx,*s); + while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET) { + ; + } + } + Data++; + break; + default: + Data++; + break; + } + } else { + USART_SendData(USARTx, *Data++); + while (USART_GetFlagStatus (USARTx, USART_FLAG_TXE) == RESET ) { + ; + } + } + + } +} diff --git a/dev/team_x/electronic_compass/wifi.h b/dev/team_x/electronic_compass/wifi.h new file mode 100644 index 0000000000000000000000000000000000000000..597757891a075cc4d5a351ab29984be2cf76fdc1 --- /dev/null +++ b/dev/team_x/electronic_compass/wifi.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef MODULAR_WIFI +#define MODULAR_WIFI + +#include +#include +#include +#include +#include +#include "stm32f4xx.h" +#include "serial_task.h" + +#define TCP_SERVICE_IP "\"192.168.1.106\"" // 丽红 +#define WIFI_SSID "\"YYYYYY\"" + +// #define TCP_SERVICE_IP "\"192.168.100.151\"" +#define TCP_COM 5000 +// #define WIFI_SSID "\"A_zoumin888\"" +#define WIFI_PASSWORD "\"66666666\"" + +#define WIFI_DATA_LEN 128 + +typedef struct { + char buffer[WIFI_DATA_LEN]; + int len; +}Wifi_Struct; + +// extern Wifi_Struct Wifi_Data; + +void Wifi_Init(int baud_rate); + +void Wifi_Parse_Json(char *json); + +#if defined ( __CC_ARM ) +#pragma anon_unions +#endif + +#define ESP8266_USART(fmt, ...) USART_printf (USART2, fmt, ##__VA_ARGS__) +#define PC_USART(fmt, ...) printf(fmt, ##__VA_ARGS__) + +#define RX_BUF_MAX_LEN 1024 // 接收最大字节数 +extern struct STRUCT_USART_Fram // 数据帧结构体 +{ + u8 Data_RX_BUF[RX_BUF_MAX_LEN]; + union { + __IO u16 InfAll; + struct { + __IO u16 FramLength : 15; // 14:0 + __IO u16 FramFinishFlag : 1; // 15 + }InfBit; + }; + + union { + __IO u16 State; + struct { + __IO u16 Connect_flag : 1; + __IO u16 Get_Ip_flag : 1; + __IO u16 ESP8266_Ready_flag : 1; + __IO u16 Trans_Mode : 1; + __IO u16 Send_OK_flag : 1; + __IO u16 Sta_Mode : 1; + __IO u16 res : 10; + }StateFlagBit; + }; + +}ESP8266_Fram_Record_Struct; + +// 初始化和TCP功能函数 +signed char ESP8266_start_TCP(void); +void Wifi_Init(int baud_rate); +void ESP8266_AT(void); +void ESP8266_Send_AT_Cmd(char *cmd,u32 time); +void USART_printf(USART_TypeDef *USARTx, char *Data, ...); + +#endif \ No newline at end of file diff --git a/dev/team_x/metal_detection/main.c b/dev/team_x/metal_detection/main.c new file mode 100644 index 0000000000000000000000000000000000000000..663009ac33aa0637f0fea8c136bbe5e8864f29e5 --- /dev/null +++ b/dev/team_x/metal_detection/main.c @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + ****************************************************************************** + * @file main.c + * @author GEEKROS, site:www.geekros.com + ****************************************************************************** +*/ +#include "main.h" + +/******************************************************************* + * @ 函数? ? main + * @ 功能说明? 程序启动入口,主要初始化?些开发板的模块以及任? + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +int main(void) +{ + // 定义任务创建的返回?,默认为成? + UINT32 LiteOS_Status = LOS_OK; + + + // LiteOS内核初始? + LiteOS_Status = LOS_KernelInit(); + if (LiteOS_Status != LOS_OK) { + // LiteOS内核初始化失? + return LOS_NOK; + } else { + // SystemClock_Config(); + + // 时钟初始? + Delay_Init(LOSCFG_BASE_CORE_TICK_PER_SECOND); + + // USB虚拟串口初始? + Usb_Init(); + + // CPU模块初始? + Cpu_Init(); + + // LED模块初始? + Led_Init(); + + // BUZZER模块初始? + Buzzer_Init(); + + // CAN模块初始? + Can_Init(); + + // POWER模块初始? + Power_Init(); + + // KEY模块初始? + Key_Init(); + + // ADC模块初始? + Adc_Init(); + + // PWM模块初始? + Pwm_Init(); + + // MPU模块初始? + Mpu_Init(); + + + // 任务初始? + LiteOS_Status = Task_Init(); + // ?启LiteOS任务调度 + LOS_Start(); + + } + // 正常情况不会执行到这? + while (1) { + ; + } +} + +/******************************************************************* + * @ 函数? ? Task_Init + * @ 功能说明? 任务初始化,为了方便管理,所有的任务创建函数都可以放在这个函数里? + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +static UINT32 Task_Init(void) +{ + // 定义任务创建的返回?,默认为成? + UINT32 Status = LOS_OK; + + Status = Start_System_Task(); + if (Status != LOS_OK) { + // 任务启动失败 + return LOS_NOK; + } + + Status = Start_Serial_Task(); + if (Status != LOS_OK) { + // 任务启动失败 + return LOS_NOK; + } + + Status = Start_User_Task(); + if (Status != LOS_OK) { + // 任务启动失败 + return LOS_NOK; + } + + // ?有任务启动成功后播放?机音? + if (Status == LOS_OK) { + //Buzzer_Start_Music(); + RED_LED_ON(); //红色作为电源指示? + Usb_Write_Data("ALL OK\r\n"); + } + + return Status; +} + +/******************************************************************* + * @ 函数? ? Start_System_Task + * @ 功能说明? 启动系统任务 + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +UINT32 System_Task_Handle; +static UINT32 Start_System_Task(void) +{ + + // 定义任务创建的返回?,默认为成? + UINT32 Task_Status = LOS_OK; + + TSK_INIT_PARAM_S task_init_param; + + // 任务优先级,数?越小,优先级越? + task_init_param.usTaskPrio = 3; + + // 任务名称 + task_init_param.pcName = "System_Task"; + + // 任务函数入口 + task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)System_Task; + + // 任务堆栈大小 + task_init_param.uwStackSize = 4096; + + // 创建任务 + Task_Status = LOS_TaskCreate(&System_Task_Handle, &task_init_param); + + return Task_Status; +} + +/******************************************************************* + * @ 函数? ? Start_Serial_Task + * @ 功能说明? 启动串口任务 + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +UINT32 Serial_Task_Handle; +static UINT32 Start_Serial_Task(void) +{ + + // 定义任务创建的返回?,默认为成? + UINT32 Task_Status = LOS_OK; + + TSK_INIT_PARAM_S task_init_param; + + // 任务优先级,数?越小,优先级越? + task_init_param.usTaskPrio = 4; + + // 任务名称 + task_init_param.pcName = "Serial_Task"; + + // 任务函数入口 + task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)Serial_Task; + + // 任务堆栈大小 + //task_init_param.uwStackSize = 4096; + task_init_param.uwStackSize = 5120; + // 创建任务 + Task_Status = LOS_TaskCreate(&Serial_Task_Handle, &task_init_param); + + return Task_Status; +} + +/******************************************************************* + * @ 函数? ? Start_User_Task + * @ 功能说明? 启动用户任务 + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +UINT32 User_Task_Handle; +static UINT32 Start_User_Task(void) +{ + + // 定义任务创建的返回?,默认为成? + UINT32 Task_Status = LOS_OK; + + TSK_INIT_PARAM_S task_init_param; + + // 任务优先级,数?越小,优先级越? + task_init_param.usTaskPrio = 5; + + // 任务名称 + task_init_param.pcName = "User_Task"; + + // 任务函数入口 + task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)User_Task; + + // 任务堆栈大小 + task_init_param.uwStackSize = 4096; + + // 创建任务 + Task_Status = LOS_TaskCreate(&User_Task_Handle, &task_init_param); + + return Task_Status; +} diff --git a/dev/team_x/metal_detection/serial_task.c b/dev/team_x/metal_detection/serial_task.c new file mode 100644 index 0000000000000000000000000000000000000000..efb80454917e9d19efd9e8c67a35a0c6f7293b7f --- /dev/null +++ b/dev/team_x/metal_detection/serial_task.c @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + ****************************************************************************** + * @file serial_task.c + * @author GEEKROS, site:www.geekros.com + ****************************************************************************** +*/ +#include "serial_task.h" + +static Serial_Data_Struct Read_Data; + +uint32_t Serial_Task_Buffer_Len = 512; + +uint8_t Serial_Task_Buffer[512]; + +/****************************************************************** + * @ Serial_Task + * @ ˵ USB⴮ + * @ NULL + * @ ֵ NULL + *****************************************************************/ +extern Mpu_Calc_Struct Mpu_Calc; +static float Mag_z_buff[100] = {0}; +void Serial_Task(void) +{ + float Gauss_Mag_z; + uint32_t i = 0, j = 0, k = 0; + bool Mag_z_Flag = 0; + float origin_mag_z = 0; + const uint16_t calibrateCount = 1000; + const uint16_t calibrateFrequency = 5; + const uint16_t calibrateAverageCount = 100; + uint16_t beepFrequency = 0; + const uint16_t taskDelayMs = 5; + while(1) { + char buff[20] = {0}; + + Gauss_Mag_z = Mpu_Calc.mag_z * 0.15f * 0.01f; + if(i=calibrateAverageCount) { + i = calibrateCount; + Mag_z_Flag = true; + for (k=0; k 0.03f) { + // ⵽ ͸Ӧö + beepFrequency = 50; + TIM_SetCompare1(TIM12, beepFrequency); + memset(buff, 0x00, sizeof(buff)); + sprintf(buff, "angle:%s", "Detected"); + ESP8266_send_data(buff, strlen(buff)); + } else { + // δ⵽رշ ͸Ӧö + beepFrequency = 300; + TIM_SetCompare1(TIM12, beepFrequency); + memset(buff, 0x00, sizeof(buff)); + sprintf(buff, "angle:%s", "UnDetected"); + ESP8266_send_data(buff, strlen(buff)); + } + } + Task_Delay(taskDelayMs); + } +} + diff --git a/dev/team_x/metal_detection/wifi.c b/dev/team_x/metal_detection/wifi.c new file mode 100644 index 0000000000000000000000000000000000000000..79370a7e03dfd039a009915d2749e8daa635bee4 --- /dev/null +++ b/dev/team_x/metal_detection/wifi.c @@ -0,0 +1,407 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/******************************************************************************* + * @file wifi.c + * @author GEEKROS, site:www.geekros.com + ****************************************************************************** +*/ + +#include "wifi.h" +#include "led.h" + +/****************************************************************** + * @ 函数? ? Wifi_Init + * @ 功能说明? ESP8266WiFi模块初始化,UART2作为WiFi模块专用接口 + * @ 参数 ? int baud_rate 波特? + * @ 返回? ? NULL + *****************************************************************/ +void Wifi_Init(int baud_rate) +{ + USART_InitTypeDef USART_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); + + GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2); + GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2); + + GPIO_StructInit(&GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + + GPIO_Init(GPIOD, &GPIO_InitStructure); + + USART_DeInit(USART2); + USART_StructInit(&USART_InitStructure); + USART_InitStructure.USART_BaudRate = baud_rate; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + + USART_Init(USART2, &USART_InitStructure); + USART_ITConfig(USART2, USART_IT_RXNE|USART_IT_IDLE, ENABLE); + + USART_Cmd(USART2, ENABLE); + + NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +} + +/****************************************************************** + * @ 函数? ? USART2_IRQHandler + * @ 功能说明? WiFi模块中断函数,接收UART2数据 + * @ 参数 ? NULL + * @ 返回? ? NULL + *****************************************************************/ +void USART2_IRQHandler(void) +{ + u8 ucCh; + + if(USART_GetITStatus( USART2, USART_IT_RXNE ) != RESET ) { + ucCh = USART_ReceiveData( USART2 ); + if(ESP8266_Fram_Record_Struct .InfBit .FramLength < (RX_BUF_MAX_LEN - 1)) { + ESP8266_Fram_Record_Struct .Data_RX_BUF[ ESP8266_Fram_Record_Struct .InfBit .FramLength ++ ] = ucCh; + } + } + + if( USART_GetITStatus( USART2, USART_IT_IDLE ) == SET ) { // 如果总线空闲 + ESP8266_Fram_Record_Struct .InfBit .FramFinishFlag = 1; + ucCh = USART_ReceiveData( USART2 ); // 由软件序列清除中断标志位(先读USART_SR,然后读USART_DR? + } +} + +/****************************************************************** + * @ 函数? ? Wifi_Parse_Json + * @ 功能说明? 解析JSON数据 + * @ 参数 ? const char *json JSON字符串数? + * @ 返回? ? NULL + *****************************************************************/ +void Wifi_Parse_Json(char* json) +{ + // 回调USB串口任务的JSON通讯协议解析与处理函? + Serial_Json_Handle(json); +} + +struct STRUCT_USART_Fram ESP8266_Fram_Record_Struct = { 0 }; //定义了一个数据帧结构? +//对ESP8266模块发?相关指? +// cmd 待发送的指令 +void ESP8266_Send_AT_Cmd(char *cmd,u32 time) +{ + ESP8266_Fram_Record_Struct .InfBit .FramLength = 0; // 重新接收新的数据? + memset(ESP8266_Fram_Record_Struct .Data_RX_BUF,0,sizeof(ESP8266_Fram_Record_Struct .Data_RX_BUF)); + ESP8266_USART("%s\r\n", cmd); + delay_ms(time); //延时 +} + +void ESP8266_send_at(void) +{ + char cStr [20]; + sprintf ( cStr, "AT"); + ESP8266_Send_AT_Cmd( cStr,100); +} + +void ESP8266_set_sta_mode(void) +{ + char cStr [20]; + sprintf ( cStr, "AT+CWMODE=1"); + ESP8266_Send_AT_Cmd( cStr,100); +} + +void ESP8266_connect_wifi(void) +{ + char cStr [64]; + sprintf ( cStr, "AT+CWJAP=%s,%s",WIFI_SSID,WIFI_PASSWORD); + Usb_Write_Data("SSID: %s PWD: %s\r\n",WIFI_SSID,WIFI_PASSWORD); + ESP8266_Send_AT_Cmd( cStr,5000); +} + +void ESP8266_TCP_connect(void) +{ + char cStr [64]; + sprintf ( cStr, "AT+CIPSTART=\"TCP\",%s,%d",TCP_SERVICE_IP,TCP_COM); + ESP8266_Send_AT_Cmd( cStr,1000); +} + +void ESP8266_start_send(unsigned int len) +{ + char cStr [20]; + sprintf ( cStr, "AT+CIPSEND=%d",len); + ESP8266_Send_AT_Cmd( cStr,50); +} + +void ESP8266_close_tcp_connect(void) +{ + char cStr [20]; + sprintf ( cStr, "AT+CIPCLOSE"); + ESP8266_Send_AT_Cmd( cStr,200); +} + +void ESP8266_send_data(char *dat,unsigned int len) +{ + ESP8266_start_send(len); //start send + + ESP8266_USART("%s\r\n", dat); +} + +// AT jiexi +static int ESP8266AckDataDeal(u8 *pdat, u16 length, u8 *err) +{ + //char *p = NULL; + const char *src = (const char *)pdat; + + if(ESP8266_Fram_Record_Struct .InfBit .FramFinishFlag==1) { + ESP8266_Fram_Record_Struct .InfBit .FramFinishFlag=0; + } else { + //return -1; //ERR + } + + if(NULL != strstr(src, "+CIPSTART")) { + if(strstr(src, "OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit .Connect_flag = 1; + } else { + ESP8266_Fram_Record_Struct .StateFlagBit .Connect_flag = 0; + } + return 0; + } else if(NULL != strstr(src, "+CIPCLOSE")) { + if(strstr(src, "OK")) { + return 0; + } + } else if(NULL != strstr(src, "+CWMODE")) { + if(strstr(src, "OK")) + { + ESP8266_Fram_Record_Struct .StateFlagBit.Sta_Mode = 1; + } + return 0; + } else if(NULL != strstr(src, "+CWJAP")) { + if(strstr(src, "CONNECTED")) { + ESP8266_Fram_Record_Struct .StateFlagBit.Get_Ip_flag = 1; + } else { + ESP8266_Fram_Record_Struct .StateFlagBit.Get_Ip_flag = 0; + } + return 0; + } else if(NULL != strstr(src, "+CIPMODE")) { + if(strstr(src, "OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit.Trans_Mode = 1; + } + return 0; + } else if(NULL != strstr(src, "+CIPSEND")) { + if(strstr(src, "SEND OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit.Send_OK_flag = 1; + } else { + ESP8266_Fram_Record_Struct .StateFlagBit.Send_OK_flag = 0; + } + return 0; + } else if(NULL != strstr(src, "OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit.ESP8266_Ready_flag = 1; + return 0; + } + return -1; +} + +signed char ESP8266_start_TCP(void) +{ + static unsigned char err = 0; + char cStr [128]; + unsigned char reconnect_cnt; + + // AT + Usb_Write_Data("ESP2866 TEST\r\n"); + err = 0; + do { + ESP8266_send_at(); + ESP8266AckDataDeal(ESP8266_Fram_Record_Struct.Data_RX_BUF, ESP8266_Fram_Record_Struct.InfBit.FramLength, &err); + + if(err++ > 5) { + return -1; + } + GREEN_LED_TOGGLE(); + }while(!ESP8266_Fram_Record_Struct.StateFlagBit.ESP8266_Ready_flag); + + reconnect_cnt=0; + RECONNECT: + // AT+CIPCLOSE + Usb_Write_Data("close tcp connect\r\n"); + err = 0; + ESP8266_close_tcp_connect(); + + // AT+CWMODE set sta mode + Usb_Write_Data("set sta mode\r\n"); + err = 0; + do { + ESP8266_set_sta_mode(); + ESP8266AckDataDeal(ESP8266_Fram_Record_Struct.Data_RX_BUF, ESP8266_Fram_Record_Struct.InfBit.FramLength, &err); + if(err++ > 5) { + return -1; + } + GREEN_LED_TOGGLE(); + }while(!ESP8266_Fram_Record_Struct.StateFlagBit.Sta_Mode); + + // AT+CWJAP + Usb_Write_Data("connecting wifi......\r\n"); + err = 0; + ESP8266_Fram_Record_Struct.StateFlagBit.Get_Ip_flag=0; + do { + ESP8266_connect_wifi(); + ESP8266AckDataDeal(ESP8266_Fram_Record_Struct.Data_RX_BUF, ESP8266_Fram_Record_Struct.InfBit.FramLength, &err); + if(err++ > 5) { + return -1; + } + GREEN_LED_TOGGLE(); + }while(!ESP8266_Fram_Record_Struct.StateFlagBit.Get_Ip_flag); + + // AT+CIPSTART + Usb_Write_Data("building tcp connect......\r\n"); + err = 0; + ESP8266_Fram_Record_Struct.StateFlagBit.Connect_flag=0; + do { + ESP8266_TCP_connect(); + ESP8266AckDataDeal(ESP8266_Fram_Record_Struct.Data_RX_BUF, ESP8266_Fram_Record_Struct.InfBit.FramLength, &err); + if(err++ > 5) { + //return -1; + reconnect_cnt++; + Usb_Write_Data("reconnect_cnt = %d\r\n",reconnect_cnt); + if(reconnect_cnt<5) { + goto RECONNECT; + } else { + return -1; + } + } + GREEN_LED_TOGGLE(); + }while(!ESP8266_Fram_Record_Struct.StateFlagBit .Connect_flag); + + Usb_Write_Data("ESP8266 ok!!!\r\n"); + sprintf (cStr, "ESP8266 init success"); + Usb_Write_Data("cStr length: %d\r\n",strlen(cStr)); + ESP8266_send_data(cStr,strlen(cStr)); + + return 0; +} + +static char *itoa( int value, char *string, int radix ) +{ + int i, d; + int flag = 0; + char *ptr = string; + + /* This implementation only works for decimal numbers. */ + if (radix != 10) { + *ptr = 0; + return string; + } + + if (!value) { + *ptr++ = 0x30; + *ptr = 0; + return string; + } + + /* if this is a negative value insert the minus sign. */ + if (value < 0) { + *ptr++ = '-'; + + /* Make the value positive. */ + value *= -1; + } + + for (i = 10000; i > 0; i /= 10) { + d = value / i; + if (d || flag) { + *ptr++ = (char)(d + 0x30); + value -= (d * i); + flag = 1; + } + } + + /* Null terminate the string. */ + *ptr = 0; + + return string; + +} /* NCL_Itoa */ + +void USART_printf ( USART_TypeDef * USARTx, char * Data, ... ) +{ + const char *s; + int d; + char buf[16]; + va_list ap; + va_start(ap, Data); + + while ( * Data != 0 ) { // 判断数据是否到达结束? + if ( * Data == 0x5c ) { //'\' + switch (*++Data) { + case 'r': // 回车? + USART_SendData(USARTx, 0x0d); + Data ++; + break; + + case 'n': // 换行? + USART_SendData(USARTx, 0x0a); + Data ++; + break; + + default: + Data ++; + break; + } + } else if ( * Data == '%') { + switch ( *++Data ) { + case 's': //字符? + s = va_arg(ap, const char *); + for ( ; *s; s++) { + USART_SendData(USARTx,*s); + while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET) { + ; + } + } + Data++; + break; + + case 'd': + d = va_arg(ap, int); // 十进刿 + itoa(d, buf, 10); + for (s = buf; *s; s++) { + USART_SendData(USARTx,*s); + while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET) { + ; + } + } + Data++; + break; + default: + Data++; + break; + } + } else { + USART_SendData(USARTx, *Data++); + while (USART_GetFlagStatus (USARTx, USART_FLAG_TXE) == RESET) { + ; + } + } + } +} + + diff --git a/dev/team_x/metal_detection/wifi.h b/dev/team_x/metal_detection/wifi.h new file mode 100644 index 0000000000000000000000000000000000000000..1ab5cf069cd7ccdafdcb1002ac28d9271cec8da1 --- /dev/null +++ b/dev/team_x/metal_detection/wifi.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MODULAR_WIFI +#define MODULAR_WIFI + +#include +#include +#include +#include +#include + +#include "stm32f4xx.h" +#include "serial_task.h" + + +#define TCP_SERVICE_IP "\"192.168.1.123\"" // 丽红 +#define WIFI_SSID "\"YYYYYY\"" + +// #define TCP_SERVICE_IP "\"192.168.100.151\"" +#define TCP_COM 5000 +// #define WIFI_SSID "\"A_zoumin888\"" +#define WIFI_PASSWORD "\"66666666\"" + +#define WIFI_DATA_LEN 128 + +typedef struct { + char buffer[WIFI_DATA_LEN]; + int len; +}Wifi_Struct; + +void Wifi_Init(int baud_rate); + +void Wifi_Parse_Json(char *json); + + +#if defined ( __CC_ARM ) +#pragma anon_unions +#endif + +#define ESP8266_USART(fmt, ...) USART_printf (USART2, fmt, ##__VA_ARGS__) +#define PC_USART(fmt, ...) printf(fmt, ##__VA_ARGS__) + +#define RX_BUF_MAX_LEN 1024 // ?大字节数 +extern struct STRUCT_USART_Fram { // 数据帧结构体 + u8 Data_RX_BUF[RX_BUF_MAX_LEN]; + union { + __IO u16 InfAll; + struct { + __IO u16 FramLength : 15; // 14:0 + __IO u16 FramFinishFlag : 1; // 15 + }InfBit; + }; + + union { + __IO u16 State; + struct { + __IO u16 Connect_flag : 1; + __IO u16 Get_Ip_flag : 1; + __IO u16 ESP8266_Ready_flag : 1; + __IO u16 Trans_Mode : 1; + __IO u16 Send_OK_flag : 1; + __IO u16 Sta_Mode : 1; + __IO u16 res : 10; + + }StateFlagBit; + }; +}ESP8266_Fram_Record_Struct; + +// 初始化和TCP功能函数 +signed char ESP8266_start_TCP(void); +void Wifi_Init(int baud_rate); +void ESP8266_AT(void); +void ESP8266_Send_AT_Cmd(char *cmd,u32 time); +void USART_printf(USART_TypeDef *USARTx, char *Data, ...); + +#endif diff --git a/dev/team_x/robot_dog/main.c b/dev/team_x/robot_dog/main.c new file mode 100644 index 0000000000000000000000000000000000000000..a7a3e155a89e11a41e82583dc362ddd69d7399bd --- /dev/null +++ b/dev/team_x/robot_dog/main.c @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + ****************************************************************************** + * @file main.c + * @author GEEKROS, site:www.geekros.com + ****************************************************************************** +*/ + +#include "main.h" + +#define BAUD_115200 115200 + +#define STACK_SIZE_4K 4096 +#define STACK_SIZE_5K 5120 + +#define PRIOR_3 3 +#define PRIOR_4 4 +#define PRIOR_5 5 + +/******************************************************************* + * @ 函数? ? main + * @ 功能说明? 程序启动入口,主要初始化?些开发板的模块以及任? + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +int main(void) +{ + + // 定义任务创建的返回?,默认为成? + UINT32 LiteOS_Status = LOS_OK; + + // LiteOS内核初始? + LiteOS_Status = LOS_KernelInit(); + if (LiteOS_Status != LOS_OK) { + // LiteOS内核初始化失? + return LOS_NOK; + } else { + // SystemClock_Config(); + // 时钟初始? + Delay_Init(LOSCFG_BASE_CORE_TICK_PER_SECOND); + + // USB虚拟串口初始? + Usb_Init(); + + // CPU模块初始? + Cpu_Init(); + + // LED模块初始? + Led_Init(); + + // BUZZER模块初始? + Buzzer_Init(); + + // CAN模块初始? + Can_Init(); + + // POWER模块初始? + Power_Init(); + + // KEY模块初始? + Key_Init(); + + // ADC模块初始? + Adc_Init(); + + // PWM模块初始? + Pwm_Init(); + + // MPU模块初始? + Mpu_Init(); + + // wifi模块初始? + Wifi_Init(BAUD_115200); + + if(ESP8266_start_TCP() == -1) { + GREEN_LED_OFF(); + } + else { + GREEN_LED_ON(); + } + + // 任务初始? + LiteOS_Status = Task_Init(); + // ?启LiteOS任务调度 + LOS_Start(); + } + while(1) { + ; + } +} + +/******************************************************************* + * @ 函数? ? Task_Init + * @ 功能说明? 任务初始化,为了方便管理,所有的任务创建函数都可以放在这个函数里? + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +static UINT32 Task_Init(void) +{ + + // 定义任务创建的返回?,默认为成? + UINT32 Status = LOS_OK; + + Status = Start_System_Task(); + if (Status != LOS_OK) { + // 任务启动失败 + return LOS_NOK; + } + + Status = Start_Serial_Task(); + if (Status != LOS_OK) { + // 任务启动失败 + return LOS_NOK; + } + + Status = Start_User_Task(); + if (Status != LOS_OK) { + // 任务启动失败 + return LOS_NOK; + } + + // ?有任务启动成功后播放?机音? + if(Status == LOS_OK) { + RED_LED_ON(); // 红色作为电源指示? + Usb_Write_Data("ALL OK\r\n"); + } + + return Status; +} + +/******************************************************************* + * @ 函数? ? Start_System_Task + * @ 功能说明? 启动系统任务 + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +UINT32 System_Task_Handle; +static UINT32 Start_System_Task(void) +{ + // 定义任务创建的返回?,默认为成? + UINT32 Task_Status = LOS_OK; + + TSK_INIT_PARAM_S task_init_param; + + // 任务优先级,数?越小,优先级越? + task_init_param.usTaskPrio = PRIOR_3; + + // 任务名称 + task_init_param.pcName = "System_Task"; + + // 任务函数入口 + task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)System_Task; + + // 任务堆栈大小 + task_init_param.uwStackSize = STACK_SIZE_4K; + + // 创建任务 + Task_Status = LOS_TaskCreate(&System_Task_Handle, &task_init_param); + + return Task_Status; +} + +/******************************************************************* + * @ 函数? ? Start_Serial_Task + * @ 功能说明? 启动串口任务 + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +UINT32 Serial_Task_Handle; +static UINT32 Start_Serial_Task(void) +{ + // 定义任务创建的返回?,默认为成? + UINT32 Task_Status = LOS_OK; + + TSK_INIT_PARAM_S task_init_param; + + // 任务优先级,数?越小,优先级越? + task_init_param.usTaskPrio = PRIOR_4; + + // 任务名称 + task_init_param.pcName = "Serial_Task"; + + // 任务函数入口 + task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)Serial_Task; + + // 任务堆栈大小 + task_init_param.uwStackSize = STACK_SIZE_5K; + // 创建任务 + Task_Status = LOS_TaskCreate(&Serial_Task_Handle, &task_init_param); + + return Task_Status; +} + +/******************************************************************* + * @ 函数? ? Start_User_Task + * @ 功能说明? 启动用户任务 + * @ 参数 ? ? + * @ 返回? ? ? + *************************************************************/ +UINT32 User_Task_Handle; +static UINT32 Start_User_Task(void) +{ + + // 定义任务创建的返回?,默认为成? + UINT32 Task_Status = LOS_OK; + + TSK_INIT_PARAM_S task_init_param; + + // 任务优先级,数?越小,优先级越? + task_init_param.usTaskPrio = PRIOR_5; + + // 任务名称 + task_init_param.pcName = "User_Task"; + + // 任务函数入口 + task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)User_Task; + + // 任务堆栈大小 + task_init_param.uwStackSize = STACK_SIZE_4K; + + // 创建任务 + Task_Status = LOS_TaskCreate(&User_Task_Handle, &task_init_param); + + return Task_Status; +} diff --git a/dev/team_x/robot_dog/serial_task.c b/dev/team_x/robot_dog/serial_task.c new file mode 100644 index 0000000000000000000000000000000000000000..d4b560b97462f90ddd6c0d37b646626310fec63d --- /dev/null +++ b/dev/team_x/robot_dog/serial_task.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + ****************************************************************************** + * @file serial_task.c + * @author GEEKROS, site:www.geekros.com + ****************************************************************************** +*/ + +#include "serial_task.h" + +#define SERIAL_TASK_DLY 5 +#define SERIAL_TASK_BUFFER_SIZE 512 + +static Serial_Data_Struct Read_Data; + +uint32_t Serial_Task_Buffer_Len = SERIAL_TASK_BUFFER_SIZE; + +uint8_t Serial_Task_Buffer[SERIAL_TASK_BUFFER_SIZE]; +/****************************************************************** + * @ 函数名 : Serial_Task + * @ 功能说明: USB虚拟串口任务函数 + * @ 参数 : NULL + * @ 返回值 : NULL + *****************************************************************/ + +void Serial_Task(void) +{ + while (1) { + Task_Delay(SERIAL_TASK_DLY); + } +} diff --git a/dev/team_x/robot_dog/wifi.c b/dev/team_x/robot_dog/wifi.c new file mode 100644 index 0000000000000000000000000000000000000000..1772fd247e727ca06bc66d77ea96c8d0c597f817 --- /dev/null +++ b/dev/team_x/robot_dog/wifi.c @@ -0,0 +1,465 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + ****************************************************************************** + * @file wifi.c + * @author GEEKROS, site:www.geekros.com + ****************************************************************************** +*/ + +#include "wifi.h" +#include "led.h" +#include "pwm.h" + +#define PWM_CH 1 +#define PWM_RATE 50 +#define PWM_WITH_1 1000 +#define PWM_WITH_2 1200 +#define PWM_WITH_3 1500 +#define PWM_WITH_4 2000 + +/****************************************************************** + * @ 函数? ? Wifi_Init + * @ 功能说明? ESP8266WiFi模块初始化,UART2作为WiFi模块专用接口 + * @ 参数 ? int baud_rate 波特? + * @ 返回? ? NULL + *****************************************************************/ +void Wifi_Init(int baud_rate) +{ + USART_InitTypeDef USART_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); + + GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2); + GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2); + + GPIO_StructInit(&GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + + GPIO_Init(GPIOD, &GPIO_InitStructure); + + USART_DeInit(USART2); + USART_StructInit(&USART_InitStructure); + USART_InitStructure.USART_BaudRate = baud_rate; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + + USART_Init(USART2, &USART_InitStructure); + USART_ITConfig(USART2, USART_IT_RXNE|USART_IT_IDLE, ENABLE); + + USART_Cmd(USART2, ENABLE); + + NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +} +void ESP8266_wifi_data_deal(char * pdat) +{ + const char * src = (const char *)pdat; + if(NULL != strstr(src, "pushUp")) { + Usb_Write_Data("cmd:pushUp\r\n"); + Pwm_Motion(PWM_CH,PWM_RATE,PWM_WITH_1); + } else if(NULL != strstr(src, "handshake")) { + Usb_Write_Data("cmd:handshake\r\n"); + Pwm_Motion(PWM_CH,PWM_RATE,PWM_WITH_2); + } else if(NULL != strstr(src, "dance")) { + Usb_Write_Data("cmd:dance\r\n"); + Pwm_Motion(PWM_CH,PWM_RATE,PWM_WITH_3); + } else if(NULL != strstr(src, "urine")) { + Usb_Write_Data("cmd:urine\r\n"); + Pwm_Motion(PWM_CH,PWM_RATE,PWM_WITH_4); + } else if(NULL != strstr(src, "LIVE")) { + Usb_Write_Data("heart beat\r\n"); + ESP8266_send_heart_beat(); + } +} + +/****************************************************************** + * @ 函数? ? USART2_IRQHandler + * @ 功能说明? WiFi模块中断函数,接收UART2数据 + * @ 参数 ? NULL + * @ 返回? ? NULL + *****************************************************************/ +void USART2_IRQHandler(void) +{ + u8 ucCh; + + if(USART_GetITStatus( USART2, USART_IT_RXNE ) != RESET ) { + ucCh = USART_ReceiveData( USART2 ); + + if(ESP8266_Fram_Record_Struct.StateFlagBit .Connect_flag) { // serivce conneted + if(ucCh == '{') { + // ?测到JSON数据起始符后?始记录数? + ESP8266_Fram_Record_Struct .Data_RX_BUF[0] = ucCh; + ESP8266_Fram_Record_Struct .InfBit .FramLength = 1; + } else if(ucCh == '}') { + // ?测到JSON数据结束符后停止数据记录 + ESP8266_Fram_Record_Struct .Data_RX_BUF[ESP8266_Fram_Record_Struct .InfBit .FramLength] = ucCh; + // 将完整的JSON数据传入JSON解析函数 + ESP8266_wifi_data_deal((char*) ESP8266_Fram_Record_Struct .Data_RX_BUF); + ESP8266_Fram_Record_Struct .InfBit .FramLength = 0; + } else { + // 判断是否?测到JSON数据起始符并记录数据 + if(ESP8266_Fram_Record_Struct .InfBit .FramLength > 0) { + ESP8266_Fram_Record_Struct .Data_RX_BUF[ESP8266_Fram_Record_Struct .InfBit .FramLength] = ucCh; + ESP8266_Fram_Record_Struct .InfBit .FramLength++; + } + } + } else { // connecting + if(ESP8266_Fram_Record_Struct .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1)) { + ESP8266_Fram_Record_Struct .Data_RX_BUF[ ESP8266_Fram_Record_Struct .InfBit .FramLength ++ ] = ucCh; + } + } + } +} + +/****************************************************************** + * @ 函数? ? Wifi_Parse_Json + * @ 功能说明? 解析JSON数据 + * @ 参数 ? const char *json JSON字符串数? + * @ 返回? ? NULL + *****************************************************************/ +void Wifi_Parse_Json(char* json) +{ + // 回调USB串口任务的JSON通讯协议解析与处理函? + Serial_Json_Handle(json); +} + +struct STRUCT_USART_Fram ESP8266_Fram_Record_Struct = { 0 }; // 定义了一个数据帧结构? +// 对ESP8266模块发?相关指? +// cmd 待发送的指令 +void ESP8266_Send_AT_Cmd(char *cmd,u32 time) +{ + + ESP8266_Fram_Record_Struct .InfBit .FramLength = 0; // 重新接收新的数据? + memset(ESP8266_Fram_Record_Struct .Data_RX_BUF,0,sizeof(ESP8266_Fram_Record_Struct .Data_RX_BUF)); + ESP8266_USART("%s\r\n", cmd); + delay_ms(time); //延时 +} + +void ESP8266_send_at(void) +{ + char cStr [20]; + sprintf ( cStr, "AT"); + ESP8266_Send_AT_Cmd( cStr,100); +} + +void ESP8266_set_sta_mode(void) +{ + char cStr [20]; + sprintf ( cStr, "AT+CWMODE=1"); + ESP8266_Send_AT_Cmd( cStr,100); +} + +void ESP8266_connect_wifi(void) +{ + char cStr [64]; + sprintf ( cStr, "AT+CWJAP=%s,%s",WIFI_SSID,WIFI_PASSWORD); + Usb_Write_Data("SSID: %s PWD: %s\r\n",WIFI_SSID,WIFI_PASSWORD); + ESP8266_Send_AT_Cmd( cStr,5000); +} + +void ESP8266_TCP_connect(void) +{ + char cStr [64]; + sprintf ( cStr, "AT+CIPSTART=\"TCP\",%s,%d",TCP_SERVICE_IP,TCP_COM); + ESP8266_Send_AT_Cmd( cStr,1000); +} + +void ESP8266_start_send(unsigned int len) +{ + char cStr [20]; + sprintf ( cStr, "AT+CIPSEND=%d",len); + ESP8266_Send_AT_Cmd( cStr,50); +} + +void ESP8266_close_tcp_connect(void) +{ + char cStr [20]; + sprintf ( cStr, "AT+CIPCLOSE"); + ESP8266_Send_AT_Cmd( cStr,200); +} + +void ESP8266_send_data(char *dat,unsigned int len) +{ + ESP8266_start_send(len); //start send + + ESP8266_USART("%s\r\n", dat); +} + +// heart beat +void ESP8266_send_heart_beat(void) +{ + char cStr [12]; + sprintf (cStr, "hart beat"); + ESP8266_send_data(cStr,strlen(cStr)); +} + +// AT 解析 +static int ESP8266AckDataDeal(u8 *pdat, u16 length, u8 * err) +{ + //char *p = NULL; + const char * src = (const char *)pdat; + + if(ESP8266_Fram_Record_Struct .InfBit .FramFinishFlag==1) { + ESP8266_Fram_Record_Struct .InfBit .FramFinishFlag=0; + } else { + //return -1; //ERR + } + + if(NULL != strstr(src, "+CIPSTART")) { + if(strstr(src, "OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit .Connect_flag = 1; + } else { + ESP8266_Fram_Record_Struct .StateFlagBit .Connect_flag = 0; + } + return 0; + } else if(NULL != strstr(src, "+CIPCLOSE")) { + if(strstr(src, "OK")) { + return 0; + } + } else if(NULL != strstr(src, "+CWMODE")) { + if(strstr(src, "OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit.Sta_Mode = 1; + } + return 0; + } else if(NULL != strstr(src, "+CWJAP")) { + if(strstr(src, "CONNECTED")) { + ESP8266_Fram_Record_Struct .StateFlagBit.Get_Ip_flag = 1; + } else { + ESP8266_Fram_Record_Struct .StateFlagBit.Get_Ip_flag = 0; + } + return 0; + } else if(NULL != strstr(src, "+CIPMODE")) { + if(strstr(src, "OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit.Trans_Mode = 1; + } + return 0; + } else if(NULL != strstr(src, "+CIPSEND")) { + if(strstr(src, "SEND OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit.Send_OK_flag = 1; + } else { + ESP8266_Fram_Record_Struct .StateFlagBit.Send_OK_flag = 0; + } + return 0; + } else if(NULL != strstr(src, "OK")) { + ESP8266_Fram_Record_Struct .StateFlagBit.ESP8266_Ready_flag = 1; + return 0; + } + + return -1; +} + +signed char ESP8266_start_TCP(void) +{ + static unsigned char err = 0; + char cStr [128]; + unsigned char reconnect_cnt; + + // AT + Usb_Write_Data("ESP2866 TEST\r\n"); + err = 0; + do { + ESP8266_send_at(); + ESP8266AckDataDeal(ESP8266_Fram_Record_Struct.Data_RX_BUF,ESP8266_Fram_Record_Struct .InfBit .FramLength,&err); + + if(err++ > 5) { + return -1; + } + GREEN_LED_TOGGLE(); + } while (!ESP8266_Fram_Record_Struct.StateFlagBit.ESP8266_Ready_flag); + + reconnect_cnt=0; + RECONNECT: + // AT+CIPCLOSE + Usb_Write_Data("close tcp connect\r\n"); + err = 0; + ESP8266_close_tcp_connect(); + + // AT+CWMODE set sta mode + Usb_Write_Data("set sta mode\r\n"); + err = 0; + do { + ESP8266_set_sta_mode(); + ESP8266AckDataDeal(ESP8266_Fram_Record_Struct.Data_RX_BUF,ESP8266_Fram_Record_Struct .InfBit .FramLength,&err); + if(err++ > 5) { + return -1; + } + GREEN_LED_TOGGLE(); + } while (!ESP8266_Fram_Record_Struct .StateFlagBit.Sta_Mode); + + + + // AT+CWJAP + Usb_Write_Data("connecting wifi......\r\n"); + err = 0; + ESP8266_Fram_Record_Struct.StateFlagBit.Get_Ip_flag=0; + do { + ESP8266_connect_wifi(); + ESP8266AckDataDeal(ESP8266_Fram_Record_Struct.Data_RX_BUF,ESP8266_Fram_Record_Struct .InfBit .FramLength,&err); + if(err++ > 5) { + return -1; + } + GREEN_LED_TOGGLE(); + } while (!ESP8266_Fram_Record_Struct.StateFlagBit.Get_Ip_flag); + + // AT+CIPSTART + Usb_Write_Data("building tcp connect......\r\n"); + err = 0; + ESP8266_Fram_Record_Struct.StateFlagBit.Connect_flag=0; + do { + ESP8266_TCP_connect(); + ESP8266AckDataDeal(ESP8266_Fram_Record_Struct.Data_RX_BUF,ESP8266_Fram_Record_Struct .InfBit .FramLength,&err); + if(err++ > 5) { + //return -1; + reconnect_cnt++; + Usb_Write_Data("reconnect_cnt = %d\r\n",reconnect_cnt); + if(reconnect_cnt<5) { + goto RECONNECT; + } else { + return -1; + } + } + GREEN_LED_TOGGLE(); + } while (!ESP8266_Fram_Record_Struct.StateFlagBit .Connect_flag); + + Usb_Write_Data("ESP8266 ok!!!\r\n"); + sprintf (cStr, "ESP8266 init success"); + Usb_Write_Data("cStr length: %d\r\n",strlen(cStr)); + ESP8266_send_data(cStr,strlen(cStr)); + + return 0; +} + + +static char *itoa( int value, char *string, int radix ) +{ + int i, d; + int flag = 0; + char *ptr = string; + + /* This implementation only works for decimal numbers. */ + if (radix != 10) { + *ptr = 0; + return string; + } + + if (!value) { + *ptr++ = 0x30; + *ptr = 0; + return string; + } + + /* if this is a negative value insert the minus sign. */ + if (value < 0) { + *ptr++ = '-'; + + /* Make the value positive. */ + value *= -1; + } + + for (i = 10000; i > 0; i /= 10) { + d = value / i; + + if (d || flag) { + *ptr++ = (char)(d + 0x30); + value -= (d * i); + flag = 1; + } + } + + /* Null terminate the string. */ + *ptr = 0; + + return string; + +} /* NCL_Itoa */ + +void USART_printf ( USART_TypeDef * USARTx, char * Data, ... ) +{ + const char *s; + int d; + char buf[16]; + + + va_list ap; + va_start(ap, Data); + + while ( * Data != 0 ) { // 判断数据是否到达结束? + if ( * Data == 0x5c ) { //'\' + switch ( *++Data ) { + case 'r': //回车? + USART_SendData(USARTx, 0x0d); + Data ++; + break; + + case 'n': //换行? + USART_SendData(USARTx, 0x0a); + Data ++; + break; + + default: + Data ++; + break; + } + } else if ( * Data == '%') { + switch ( *++Data ) { + case 's': //字符? + s = va_arg(ap, const char *); + for ( ; *s; s++) { + USART_SendData(USARTx,*s); + while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET) { + ; + } + } + Data++; + break; + + case 'd': + //十进? + d = va_arg(ap, int); + itoa(d, buf, 10); + for (s = buf; *s; s++) { + USART_SendData(USARTx,*s); + while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET) { + ; + } + } + Data++; + break; + default: + Data++; + break; + } + } else USART_SendData(USARTx, *Data++); + while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET ){;} + } +} + + + diff --git a/dev/team_x/robot_dog/wifi.h b/dev/team_x/robot_dog/wifi.h new file mode 100644 index 0000000000000000000000000000000000000000..b4dddf387a05c8d8e8c94c5159abb61dece19320 --- /dev/null +++ b/dev/team_x/robot_dog/wifi.h @@ -0,0 +1,87 @@ + /* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef MODULAR_WIFI +#define MODULAR_WIFI + +#include +#include +#include +#include +#include + +#include "stm32f4xx.h" +#include "serial_task.h" + +#define TCP_SERVICE_IP "\"192.168.151.151\"" +#define TCP_COM 5000 +#define WIFI_SSID "\"A_zoumin888\"" +#define WIFI_PASSWORD "\"zoumin#####\"" + +#define WIFI_DATA_LEN 128 + +typedef struct { + char buffer[WIFI_DATA_LEN]; + int len; +}Wifi_Struct; + +void Wifi_Init(int baud_rate); + +void Wifi_Parse_Json(char* json); + +#if defined ( __CC_ARM ) +#pragma anon_unions +#endif + +#define ESP8266_USART(fmt, ...) USART_printf (USART2, fmt, ##__VA_ARGS__) +#define PC_USART(fmt, ...) printf(fmt, ##__VA_ARGS__) // Ǵڴӡ1ִprintfԶִfputضprintf + + + +#define RX_BUF_MAX_LEN 1024 // ֽ +extern struct STRUCT_USART_Fram { // ֡ṹ + u8 Data_RX_BUF[RX_BUF_MAX_LEN]; + union { + __IO u16 InfAll; + struct { + __IO u16 FramLength :15; // 14:0 + __IO u16 FramFinishFlag :1; // 15 + }InfBit; + }; + + union { + __IO u16 State; + struct { + __IO u16 Connect_flag:1; + __IO u16 Get_Ip_flag:1; + __IO u16 ESP8266_Ready_flag:1; + __IO u16 Trans_Mode:1; + __IO u16 Send_OK_flag:1; + __IO u16 Sta_Mode:1; + __IO u16 res:10; + }StateFlagBit; + }; + +}ESP8266_Fram_Record_Struct; + +// ʼTCPܺ +signed char ESP8266_start_TCP(void); +void Wifi_Init(int baud_rate); +void ESP8266_AT(void); +void ESP8266_Send_AT_Cmd(char *cmd,u32 time); +void USART_printf(USART_TypeDef * USARTx, char * Data, ... ); + +void ESP8266_send_heart_beat(void); + +#endif diff --git "a/docs/electronic_compass/media/AT\346\214\207\344\273\244\351\205\215\347\275\221.png" "b/docs/electronic_compass/media/AT\346\214\207\344\273\244\351\205\215\347\275\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..9290dd63535fc4a17f50e9655a01870a8ca1245e Binary files /dev/null and "b/docs/electronic_compass/media/AT\346\214\207\344\273\244\351\205\215\347\275\221.png" differ diff --git "a/docs/electronic_compass/media/ESP8266_\347\203\247\345\275\225.png" "b/docs/electronic_compass/media/ESP8266_\347\203\247\345\275\225.png" new file mode 100644 index 0000000000000000000000000000000000000000..80565aab3a2f8417bc0ec9301f4e953c683f86d8 Binary files /dev/null and "b/docs/electronic_compass/media/ESP8266_\347\203\247\345\275\225.png" differ diff --git "a/docs/electronic_compass/media/ESP8266\346\250\241\347\273\204\345\274\225\350\204\232.png" "b/docs/electronic_compass/media/ESP8266\346\250\241\347\273\204\345\274\225\350\204\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..2caf07b6a090487a53150d354b318747fed1238d Binary files /dev/null and "b/docs/electronic_compass/media/ESP8266\346\250\241\347\273\204\345\274\225\350\204\232.png" differ diff --git a/docs/electronic_compass/media/build.png b/docs/electronic_compass/media/build.png new file mode 100644 index 0000000000000000000000000000000000000000..8853e5fd7e59e8a01fc0e5e2a936badfb3345aa9 Binary files /dev/null and b/docs/electronic_compass/media/build.png differ diff --git a/docs/electronic_compass/media/compass.png b/docs/electronic_compass/media/compass.png new file mode 100644 index 0000000000000000000000000000000000000000..b49b5369a7706e74158d094cf72996db2707f707 Binary files /dev/null and b/docs/electronic_compass/media/compass.png differ diff --git "a/docs/electronic_compass/media/elf\346\226\207\344\273\266.png" "b/docs/electronic_compass/media/elf\346\226\207\344\273\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..91b1aed3b02eb45dbd7f05e7c1fdf3bc6b135498 Binary files /dev/null and "b/docs/electronic_compass/media/elf\346\226\207\344\273\266.png" differ diff --git "a/docs/electronic_compass/media/elf\346\226\207\344\273\266\345\222\214hex\346\226\207\344\273\266.png" "b/docs/electronic_compass/media/elf\346\226\207\344\273\266\345\222\214hex\346\226\207\344\273\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..a264be33d67c24f6e3023ffe0297c47d972e5c09 Binary files /dev/null and "b/docs/electronic_compass/media/elf\346\226\207\344\273\266\345\222\214hex\346\226\207\344\273\266.png" differ diff --git a/docs/electronic_compass/media/image-20220311101035152.png b/docs/electronic_compass/media/image-20220311101035152.png new file mode 100644 index 0000000000000000000000000000000000000000..90ce598ba67615ae87adab19a862ce0d6e3dc2fa Binary files /dev/null and b/docs/electronic_compass/media/image-20220311101035152.png differ diff --git a/docs/electronic_compass/media/install.png b/docs/electronic_compass/media/install.png new file mode 100644 index 0000000000000000000000000000000000000000..39fee29696faa5a9f3f183dd550a06d1330eaa8c Binary files /dev/null and b/docs/electronic_compass/media/install.png differ diff --git a/docs/electronic_compass/media/new_project.png b/docs/electronic_compass/media/new_project.png new file mode 100644 index 0000000000000000000000000000000000000000..78372c2329b5bd0c96ee544c73a8df359107201c Binary files /dev/null and b/docs/electronic_compass/media/new_project.png differ diff --git a/docs/electronic_compass/media/run.png b/docs/electronic_compass/media/run.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c41fa3157e52082b336607d048e1c37c4f54a9 Binary files /dev/null and b/docs/electronic_compass/media/run.png differ diff --git a/docs/electronic_compass/media/sign.png b/docs/electronic_compass/media/sign.png new file mode 100644 index 0000000000000000000000000000000000000000..3fee06881e74b3589731b17734090bc5660e40fa Binary files /dev/null and b/docs/electronic_compass/media/sign.png differ diff --git "a/docs/electronic_compass/media/\344\270\213\350\275\275\345\267\245\345\205\2671.png" "b/docs/electronic_compass/media/\344\270\213\350\275\275\345\267\245\345\205\2671.png" new file mode 100644 index 0000000000000000000000000000000000000000..2efa36c59873af90b082401474f39797084a6996 Binary files /dev/null and "b/docs/electronic_compass/media/\344\270\213\350\275\275\345\267\245\345\205\2671.png" differ diff --git "a/docs/electronic_compass/media/\346\214\207\345\215\227\351\222\210.gif" "b/docs/electronic_compass/media/\346\214\207\345\215\227\351\222\210.gif" new file mode 100644 index 0000000000000000000000000000000000000000..d38df2438310b165725b613333e2123aa1c29b33 Binary files /dev/null and "b/docs/electronic_compass/media/\346\214\207\345\215\227\351\222\210.gif" differ diff --git "a/docs/electronic_compass/media/\347\203\247\345\275\225\345\267\245\345\205\2672.png" "b/docs/electronic_compass/media/\347\203\247\345\275\225\345\267\245\345\205\2672.png" new file mode 100644 index 0000000000000000000000000000000000000000..78044c67c556a6e99b07ed37374bfd87a10c3a8f Binary files /dev/null and "b/docs/electronic_compass/media/\347\203\247\345\275\225\345\267\245\345\205\2672.png" differ diff --git "a/docs/electronic_compass/media/\347\203\247\345\275\225\345\267\245\345\205\2673.png" "b/docs/electronic_compass/media/\347\203\247\345\275\225\345\267\245\345\205\2673.png" new file mode 100644 index 0000000000000000000000000000000000000000..441b9447ffd9195d491915525a27c2b2994a15f6 Binary files /dev/null and "b/docs/electronic_compass/media/\347\203\247\345\275\225\345\267\245\345\205\2673.png" differ diff --git "a/docs/electronic_compass/media/\347\243\201\345\234\272\347\244\272\346\204\217\345\233\276.png" "b/docs/electronic_compass/media/\347\243\201\345\234\272\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..c9a02cee0cf9d1299c4580bb4550d5acbf63a1f0 Binary files /dev/null and "b/docs/electronic_compass/media/\347\243\201\345\234\272\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/docs/electronic_compass/media/\347\275\221\347\273\234\350\260\203\350\257\225\345\212\251\346\211\213\351\205\215\347\275\256.png" "b/docs/electronic_compass/media/\347\275\221\347\273\234\350\260\203\350\257\225\345\212\251\346\211\213\351\205\215\347\275\256.png" new file mode 100644 index 0000000000000000000000000000000000000000..0078a26ba7f9cb24c9ba23783ff8eb717f638e2d Binary files /dev/null and "b/docs/electronic_compass/media/\347\275\221\347\273\234\350\260\203\350\257\225\345\212\251\346\211\213\351\205\215\347\275\256.png" differ diff --git a/docs/electronic_compass/readme.md b/docs/electronic_compass/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..6f23c8d14748056ec22d85d04fed0d2a3e37e528 --- /dev/null +++ b/docs/electronic_compass/readme.md @@ -0,0 +1,625 @@ +## 电子指南针 + +此项目是基于OpenHarmony操作系统,设备侧使用Geek_Lite_Board开发板,主控芯片为STM32F427IIH6,操作系统为OpenHarmony 3.0。应用端采用大禹系列HH-SCDAYU200开发板套件,主控芯片为瑞芯微[RK3568](https://gitee.com/link?target=http%3A%2F%2Fbbs.16rd.com%2Fcitiao-xinpian-RK3568.html)芯片,操作系统为OpenHarmony 3.1 release。 + +STM32通过mpu9250九轴姿态传感器中内置的ak8963磁力计获取磁场数据,把转换后的数据通过ESP8266无线模块把数据发送到RK3568。RK3568的应用是采用方舟开发框架(ArkUI)基于JS扩展的类web开发范式编写页面;通过NAPI接口获取底层网络数据,并在页面展示,展示效果如下图所示。 + +![](./media/指南针.gif) + +## 一、指南针设备开发 + +### 1. 磁力计在平面上的校准 + +#### 1.1 为什么要校准 + +电子指南针主要是通过感知地球磁场的存在来计算磁北极的方向。然而由于地球磁场在一般情况下只有微弱的0.5高斯,而一个普通的手机喇叭当相距2厘米时仍会有大约4高斯的磁场,一个手机马达在相距2厘米时会有大约6高斯的磁场,这一特点使得针对电子设备表面地球磁场的测量很容易受到电子设备本身的干扰。 + +磁场干扰是指由于具有磁性物质或者可以影响局部磁场强度的物质存在,使得磁传感器所放置位置上的地球磁场发生了偏差。如下图所示,在磁传感器的XYZ坐标系中,绿色的圆表示地球磁场矢量绕z轴圆周转动过程中在XY平面内的投影轨迹,再没有外界任何磁场干扰的情况下,此轨迹将会是一个标准的以0(0,0)为中心的圆。当存在外界磁场干扰的情况时,测量得到的磁场强度矢量α将为该点地球磁场β与干扰磁场γ的矢量和。记作: + +$$ +α(测量值)= β(地球磁场)+ γ(干扰磁场) +$$ +![磁场示意图](./media/磁场示意图.png) + +#### 1.2 校准方法 + +针对XY轴的校准,将配备有磁传感器的设备在XY平面内自转,如图1,等价于将地球磁场矢量绕着过点 +$$ +0(γx,γy) +$$ +垂直于XY平面的法线旋转,而红色的圆为磁场矢量在旋转过程中在XY平面内投影的轨迹。这可以找到圆心的位置为((Xmax+Xmin)/2,(Ymax+Ymin)/2)。 + +设测量值为(a,b),则校准后的值位为( a - ((Xmax+Xmin)/2) , b - ((Ymax+Ymin)/2) ) ,这个值就可以用来计算电子罗盘的偏航角。详情可以参考[磁力计电子罗盘学习及校准文档](https://max.book118.com/html/2020/0310/6105012132002145.shtm)。 + +### 2.ESP8266 wifi模组开发 + +#### 2.1 简介 + +指南针开发的EP8266 wifi模组主要用于和RK3568完成网络通信,ESP8266和STM32通过串口相连,通过发送AT指令的方式来控制。 + +#### 2.2 开发准备 + +##### 2.2.1 软件准备 + +开发用到的软件如下,可通过百度搜索下载 + +(1)串口调试助手(推荐使用友善之臂的串口调试助手) + +(2)网络调试助手 + +##### 2.2.2 烧录ESP8266固件 + +(1)将ESP8266烧录口通过USB和电脑连接 + +(2)打开烧录软件,烧录AT指令的固件,烧录方法步骤如图![image-20220311100650456](./media/ESP8266_烧录.png) + +#### 2.3 开发步骤 + +##### 2.3.1 通过网络调试助手搭建TCP服务器 + +![image-20220311101644858](./media/网络调试助手配置.png) + +##### 2.3.2 通过USB转串口工具连接ESP8266 + +​ ESP8266的AT指令是通过串口2发送的,连线方式为: + +​ TXD2(ESP8266)---RXD(USB转串口工具) + +​ TXD2(ESP8266)---RXD(USB转串口工具) + +​ GND(ESP8266)---GND(USB转串口工具) + +​ 5V(ESP8266) ---5V(USB转串口工具) + +![image-20220311101718907](./media/ESP8266模组引脚.png) + +##### 2.3.3 ESP8266网络功能调试 + +串口调试助手发送AT指令控制ESP8266完成配网,并测试数据收发. + + 发送AT指令的顺序如下: + +``` + AT #测试AT功能,同时测试模组已经ready + +​ AT+CIPCLOSE #关闭此前的TCP/UDP连接(如果有连接的话) + +​ AT+CWMODE=1 #设置模组进入STA模式 + +​ AT+CWJAP="ssid","password" #连接wifi + +​ AT+CIFSR #查看模组IP地址 + +​ AT+CIPSTART="TCP","TCP服务器IP地址",8080 #连接TCP服务器 + +​ AT+CIPSEND=len #发送长度len的数据到服务器 + +​ Abcde #输入数据 +``` + +​ ![image-20220311103410599](./media/AT指令配网.png) + +##### 2.3.4 配网功能实现 + +编写STM32程序,实现AT指令控制ESP8266配网,并完成数据收发。 + +(1)串口驱动的编写 + +编写串口初始化函数,初始化串口2的参数是115200,n,1,关键性函数:void Wifi_Init(int baud_rate) + +(2)AT指令的发送 + +实现各种AT指令的发送,关键函数:void ESP8266_Send_AT_Cmd(char *cmd,u32 time),参数cmd是AT指令,time是超时时间 + +(3)AT指令回复的接收和处理 + +实现AT指令发送后模组返回数据的处理, + +数据接收函数:void USART2_IRQHandler(void) + +数据处理函数:static int ESP8266AckDataDeal(u8 *pdat, u16 length, u8 * err) + +(4) 配网流程的实现 + +按照特定的顺序发送AT指令实现ESP8266连接TCP服务器,并处理其中的错误, + +关键性函数:signed char ESP8266_start_TCP(void) + +(5)TCP网络数据收发 + +实现网络数据的发送和接收 + +TCP数据发送函数:void ESP8266_send_data(char *dat,unsigned int len) + +TCP数据接收函数: void USART2_IRQHandler(void) + +### 3. 程序下载、编译和烧录 + +#### 3.1 程序下载 + +(1)使用git下载 + +``` +下载STM32F427 OpenHarmony适配代码: +git clone git@gitee.com:geekros/OpenHarmony_For_STM32F427.git --depth=1 +下载device代码: +git clone git@gitee.com:openharmony-sig/knowledge_demo_temp.git --depth=1 +代码拷贝: +a.拷贝knowledge_demo_temp\dev\team_x\electronic_compass\wifi.c 到 +OpenHarmony_For_STM32F427\dev-code\device\Geek_Ros\Geek_Lite_Board\modular\src 覆盖原来的文件 + +b.拷贝knowledge_demo_temp\dev\team_x\electronic_compass\wifi.h 到 +OpenHarmony_For_STM32F427\dev-code\device\Geek_Ros\Geek_Lite_Board\modular\inc 覆盖原来的文件 + +c.拷贝knowledge_demo_temp\dev\team_x\electronic_compass\main.c 到 +OpenHarmony_For_STM32F427\dev-code\device\Geek_Ros\Geek_Lite_Board\main\src 覆盖原来的文件 + +c.拷贝knowledge_demo_temp\dev\team_x\electronic_compass\serial_task.c 到 +OpenHarmony_For_STM32F427\dev-code\device\Geek_Ros\Geek_Lite_Board\main\src 覆盖原来的文件 +``` + +(2)直接下载压缩包 + +代码地址:[dev-code](../../dev/team_x/electronic_compass/) + +#### 3.2 程序编译 + +环境搭建参考[Windows编译OpenHarmony文档](https://gitee.com/Cruise2019/team_x/blob/master/homework/ohos_build_win/readme.md),搭建好windows编译环境后,使用windows命令行进入代码目录进行编译。 + +#### 3.3 程序烧录 + +(1)elf文件转.hex文件 + +程序编译成功后,会生成.elf文件,如下图所示。 + +![elf文件](./media/elf文件.png) + +在命令行进入所在.elf文件所在目录,在命令行输入如下命令,按下回车,生成烧录程序所用的geek_lite_sdk.hex文件。 + +``` +objcopy.exe -O ihex geek_lite_sdk.elf geek_lite_sdk.hex +``` + +整体效果如下图所示。 + +![elf文件和hex文件](./media/elf文件和hex文件.png) + +(2)把.hex文件烧录进开发板 + +下载[ST-LINK烧录工具](https://www.st.com/en/development-tools/stsw-link004.html#get-software),下载好就安装即可。 + +打开烧录工具,点击右上角的 “ File ” ,然后点击 ” Open file “ ,找到上面所说的.hex文件。 + +![下载工具1](./media/下载工具1.png) + +点击 “ Target ” ,选择 “ Connect ” ,连接开发板。 + +![烧录工具2](./media/烧录工具2.png) + +点击 “ Target ” ,选择 “ Program ” ,弹出如下界面,点击 “ Start ”开始烧录程序。 + +![烧录工具3](./media/烧录工具3.png) + +到这里程序已经烧录成功,可以上手体验了!!! + +## 二、指南针应用开发 + +### OpenHarmony技术特性 + +指南针应用端开发主要涉及: + +- **OpenHarmonyJS UI** + +- **Canvas 组件** + +- **NAPI** + +### 1.快速上手 + +#### 1.1 标准设备环境准备 + +- [ 搭建标准系统环境](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-standard-env-setup.md) +- [下载OpenHarmony 3.1 release 系统源码](https://blog.csdn.net/openharmony/article/details/123866852?utm_source=app&app_version=5.3.0) +- 以润和大禹系列HH-SCDAYU200开发板套件为例请参考:[开发板上新 | RK3568开发板上丝滑体验OpenHarmony标准系统](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/docs/rk3568_quick_start) + +#### 1.2 应用编译环境准备 + +- IDE版本:DevEco Studio 3.0 Beta3,DevEco Studio [下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta); +- SDK 版本 :OpenHarmony SDK API 8,请参考[配置OpenHarmony SDK](https://gitee.com/openharmony/docs/blob/update_master_0323/zh-cn/application-dev/quick-start/configuring-openharmony-sdk.md),完成**DevEco Studio**的安装和开发环境配置。 + +#### 1.3 项目下载和导入 + +1)git下载 + +``` +git clone git@gitee.com:openharmony-sig/knowledge_demo_temp.git --depth=1 +``` + +2)项目导入 + +打开DevEco Studio,点击File->Open->下载路径/electronic_compass/app-code/compass + + +#### 1.4 安装应用 + +- 配置应用签名信息,点击**File > Project Structure** > **Project > Signing Configs**界面勾选“**Automatically generate signing**”,等待自动签名完成即可,点击“**OK**”。如下图所示:![运行](./media/sign.png) + +- [安装应用](https://gitee.com/openharmony/docs/blob/update_master_0323/zh-cn/application-dev/quick-start/installing-openharmony-app.md) 识别到设备后点击![img](./media/install.png),或使用默认快捷键Shift+F10(macOS为Control+R)运行应用。 + + ![运行](./media/run.png) + +- 如果IDE没有识别到设备就需要通过命令安装,如下 + + 打开**OpenHarmony SDK路径 \toolchains** 文件夹下,执行如下hdc_std命令,其中**path**为hap包所在绝对路径。 + + ```text + hdc_std install -r path\entry-debug-standard-ark-signed.hap + ``` + + 应用安装到3568开发板后,需要SMT32开发板发送角度数据,才能看到效果;两个板子连接同一个wifi或使用网线连接并配置同一网段IP地址 + + ``` + hdc_std shell ifconfig eth0 192.168.1.111 netmask 255.255.255.0 + ``` + +### 2.关键代码解读 + +#### 2.1 目录结构 + +``` +├─entry +│ └─src +│ └─main +│ │ config.json 应用配置文件 +│ │ +│ ├─js +│ │ └─MainAbility +│ │ │ app.js // 应用程序主入口 +│ │ │ +│ │ ├─i18n +│ │ │ en-US.json +│ │ │ zh-CN.json +│ │ │ +│ │ └─pages +│ │ └─index // 指南针应用首页面 +│ │ index.css +│ │ index.hml +│ │ index.js +│ │ +│ └─resources +│ ├─base +│ │ ├─element +│ │ │ string.json +│ │ │ +│ │ └─media // 存放媒体资源 +│ │ icon.png // 应用桌面小图标 +│ │ +│ └─rawfile +``` + +#### 2.2 日志查看方法 + +``` +hdc_std shell +hilog | grep "xxx" (xxx表示你添加的日志标记) +``` + +#### 2.3 关键代码 + +- 指南针UI界面:index.hml , index.js , index.css +- NAPI: 导入 tcpserverapi 模块,该模块是要在3568系统代码中编译 + +### 3.从零开发指南针应用 + +#### 3.1 新建OpenHarmony ETS项目 + +在DevEco Studio中点击File -> New Project ->[Standard]Empty Ability->Next,Language 选择JS语言,最后点击Finish即创建成功。 +![image-20211124092813545](./media/new_project.png) + +#### 3.2编写指南针主页面 + +![image-20211124093106260](./media/compass.png) + +效果图如上可以分为三部分。 + +##### 3.2.1 方位角度 + +1)在hml文件添加[text](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-basic-text.md)组件; + +2)在css文件添加样式表; + +3)在js 文件修改text内容,即变量position的值; + +``` +index.hml + {{ position }}° + +index.css + .text-style{ + font-size: 60px; + } +index.js + getCompassMsg() { + this.intervalID = setInterval(() => { + //NAPI调用 + compassapi.recvCompassMsg().then((result) => { + var resultAngle = result.angle; + if (resultAngle.match("angle:")) { + var info = parseInt(resultAngle.slice(6)); + if (this.angle != info) { + this.angle = info; + console.info("=======compassAngle====" + this.angle) + if (this.angle >= 0 && this.angle < 23) { + this.position = '北 ' + this.angle; + } + else if (this.angle >= 23 && this.angle < 68) { + this.position = '东北 ' + this.angle; + } + else if (this.angle >= 68 && this.angle < 113) { + this.position = '东 ' + this.angle; + } + else if (this.angle >= 113 && this.angle < 158) { + this.position = '东南 ' + this.angle; + } + else if (this.angle >= 158 && this.angle < 203) { + this.position = '南 ' + this.angle; + } + else if (this.angle >= 203 && this.angle < 248) { + this.position = '西南 ' + this.angle; + } + else if (this.angle >= 248 && this.angle < 293) { + this.position = '西 ' + this.angle; + } + else if (this.angle >= 293 && this.angle < 338) { + this.position = '西北 ' + this.angle; + } + else if (this.angle >= 338 && this.angle < 360) { + this.position = '北 ' + this.angle; + } + } + } + }); + + }, 100); + }, +``` + + + +##### 3.2.2 指南针盘 + +指南针盘只由一个[Canvas](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvas.md)组件组成,但是却包括刻度盘,角度数字,方位文字 3 个部分; + +如下是指南针盘Canvas组件以及[CanvasRenderingContext2D](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvasrenderingcontext2d.md)的代码: + +``` +index.hml 添加canvas组件,并设置ref,以及配置坐标轴进行顺时针旋转角度 + +``` + +``` +index.css 长宽占用都是100% + .compass-canvas { + width:100%; + height: 100%; + } +``` + +``` +index.js 根据 hml 中的 ref,拿到该组件,并获取CanvasRenderingContext2D对象compass_context,之后所有的绘制都是调用compass_context对象方法 + + compass_canvas = this.$refs.compassCanvas; + compass_context = compass_canvas.getContext('2d', { + antialias: true + }); +``` + +1)刻度盘 + +刻度盘是由内圆、外圆和刻度竖线组成;如下是内外圆绘制: + +``` +compass_context.translate(this.width / 2, this.height / 2); 移动当前坐标系的原点。 + +this.outsideRadius = this.width / 2 - this.width / 7; // 计算外圆半径 +this.insideRadius = this.outsideRadius - this.width / 8; // 计算内圆半径 + +this.drawCircle(this.outsideRadius, '#F9F9F9'); //外圆,传入外圆半径和颜色 + this.drawCircle(this.insideRadius, '#FFFFFF'); //内圆,传入内圆半径和颜色 + + drawCircle(radius, color) { + compass_context.beginPath(); // 创建一个新的绘制路径。 + compass_context.fillStyle = color; // 指定绘制的填充色. + compass_context.strokeStyle = color; //设置描边的颜色。 + compass_context.arc(0, 0, radius, 0, 6.28); //绘制弧线路径。 + compass_context.fill(); //对封闭路径进行填充。 + }, +``` + +如下是圆环内部竖线刻度绘制: + +``` +drawAngleLine() { + compass_context.strokeStyle = '#000000'; //设置描边的颜色。 + // 总共有60 个刻度,按5的倍数进行线条加粗。 + for (var i = 0; i < 60; i++) { + if (i == 0 || i == 5 || i == 10 || i == 15 || i == 20 || i == 25 || i == 30 || i == 35 || i == 40 || i == 45 || i == 50 || i == 55) { + compass_context.lineWidth = 3; // 线条宽度 + compass_context.beginPath(); // 创建一个新的绘制路径。 + compass_context.moveTo(0, this.insideRadius + (this.outsideRadius - this.insideRadius) / 4); // 当前点移动到指定点。 + compass_context.lineTo(0, this.outsideRadius - this.width / 30); // 从当前点到指定点进行路径连接. + + } else { + compass_context.lineWidth = 0.5; + compass_context.beginPath(); + compass_context.moveTo(0, this.insideRadius + (this.outsideRadius - this.insideRadius) / 4); + compass_context.lineTo(0, this.outsideRadius - this.width / 30); + } + compass_context.stroke(); + compass_context.rotate(15 * Math.PI / 450); + } + }, +``` + +2)外围数字角度 + +``` + drawAngleNumber() { + compass_context.beginPath(); // 创建一个新的绘制路径。 + this.angleNumberSize = this.width / 30; // 角度数字文字大小。 + compass_context.font = this.angleNumberSize + 'px' + ' sans-serif'; // 角度数字文字大小转换。 + for (var i = 0; i < this.angleNumbers.length; i++) { + if (i == 0) { // 判断是0 设备颜色为红色,其他为灰黑色. + compass_context.fillStyle = '#FF00000'; + } else { + compass_context.fillStyle = '#AF000000'; + } + let number = this.angleNumbers[i]; // 获取数组对象里面的数字内容. + compass_context.fillText(number, -this.width / 85, -this.width / 2.45); // 绘制填充类文本。 + compass_context.rotate(30 * Math.PI / 180); // 设置当前坐标轴进行顺时针旋转,成圆形排列 + } + } +``` + +3)内部方位文字和三角箭头绘制 + +如下是 + +``` + drawPositionText() { + compass_context.beginPath(); + this.positionTextSize = this.width / 20; + compass_context.font = this.positionTextSize + 'px' + ' sans-serif'; + for (let i = 0; i < this.positionTexts.length; i++) { + if (i == 0) { + compass_context.fillStyle = '#FF00000'; // 获取方位文字为北,改变文字颜色为红色 + this.drawTriangle(); // 指北三角箭头绘制 + } else { + compass_context.fillStyle = '#0000000'; + } + let positionText = this.positionTexts[i]; + compass_context.fillText(positionText, -this.width / 40, -this.width / 9); + compass_context.stroke(); + compass_context.rotate(90 * Math.PI / 180); + } + }, +``` + +4)三角箭头绘制 + +``` + drawTriangle() { + compass_context.beginPath(); + compass_context.fillStyle = '#FF00000'; + compass_context.moveTo(0, -this.width / 5); + compass_context.lineTo(this.width / 40, -this.width / 5 + this.width / 35); + compass_context.lineTo(-this.width / 40, -this.width / 5 + this.width / 35); + compass_context.closePath(); // 结束当前路径形成一个封闭路径。 + compass_context.fill(); + }, +``` + +##### 3.2.3 指示线 + +指南针指示线只由一个[Canvas](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvas.md)组件组成,也只包括一根竖线的绘制; + +1)如下是指南针指示线Canvas组件以及[CanvasRenderingContext2D](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-canvas-canvasrenderingcontext2d.md)的代码: + +``` +index.hml 添加canvas组件,并设置ref + +``` + +``` +index.css 长宽占用都是100%,并设定样式 position: absolute 相对于父元素进行定位。 +.line-canvas { + width: 100%; + height:100%; + position: absolute; +} +``` + +``` +index.js 根据 hml 中的 ref,拿到该组件,并获取CanvasRenderingContext2D对象compass_context,之后所有的绘制都是调用compass_context对象方法 + + line_canvas = this.$refs.lineCanvas; + line_context = line_canvas.getContext('2d', { + antialias: true + }); +``` + +2)指示线获取 + +``` + drawPositionLine() { + line_context.strokeStyle = '#000000'; + line_context.lineWidth = 6; + line_context.lineCap = 'round'; // 线端点以圆形结束。 + line_context.moveTo(0, -this.outsideRadius + this.width / 15); + line_context.lineTo(0, -this.outsideRadius - this.width / 28); + line_context.stroke(); // 进行边框绘制操作。 + }, +``` + +#### 3.3 NAPI + +##### 3.3.1 底层NAPI模块封装 + +1)NAPI接口开发具体请参考文档[OpenharmonyNAPI开源仓库](https://gitee.com/javen678/hello-ohos-napi )。 + +2)本应用封装的模块名为tcpserverapi,[源码路径](https://gitee.com/chenchenfangfang/knowledge_demo_attitude_control/tree/master/common\tcpservermodule),下载好的tcpservermodule文件夹。 + +3)下载完成后放到3.1Beta版本根目录,并按照参考PPT配置编译脚本;第一次编译完成需要烧写整个镜像,请参考[开发板上新 | RK3568开发板上丝滑体验OpenHarmony标准系统](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/docs/rk3568_quick_start);后面修改模块源码,只需将库send到板子里面。命令如下: + +``` +先挂载,再send +hdc_std shell mount -oremount,rw / +hdc_std file send libtcpserverapi.z.so system/lib/module/libtcpserverapi.z.so +``` + +##### 3.3.2 应用端导入NAPI模块 + +``` +import tcpserverapi from '@ohos.tcpserverapi' +``` + +##### 3.3.3 应用端NAPI接口调用 + +``` +//调用initServer接口 初始化 TCP 服务器 +tcpserverapi.initServer() +``` + +``` +//调用recvMsg 获取并解析SMT32板子发送过来的角度 +tcpserverapi.recvMsg().then((result) => { + var resultAngle = result.angle; + }) +``` + +#### 3.4 项目下载和导入 + +1)git下载 + +``` +git clone git@gitee.com:openharmony-sig/knowledge_demo_temp.git --depth=1 +``` + +2)项目导入 + +打开DevEco Studio,点击File->Open->下载路径/electronic_compass/app-code/compass + +#### 3.5 约束与限制 + +##### 3.5.1 设备编译约束 + +以润和大禹系列HH-SCDAYU200开发板套件为例 + +- [开发板上新 | RK3568开发板上丝滑体验OpenHarmony标准系统](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/docs/rk3568_quick_start) + +##### 3.5.2 应用编译约束 + +- [OpenHarmony 基于JS扩展的类Web开发范式](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/Readme-CN.md) +- [OpenHarmony应用接口](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/Readme-CN.md) +- 集成开发环境:DevEco Studio 版本[下载](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta) + diff --git a/docs/metal_detection/quick_develop.md b/docs/metal_detection/quick_develop.md new file mode 100644 index 0000000000000000000000000000000000000000..4e1b24e390ea51b00d121daed82e46fa657bfe82 --- /dev/null +++ b/docs/metal_detection/quick_develop.md @@ -0,0 +1,366 @@ +## OpenHarmony金属探测器应用 + +### 简介 + +金属探测器应用是通过接送消息,判断是否检测到金属;应用是采用方舟开发框架(ArkUI)基于eTS扩展的声明式开发范式编写页面;通过NAPI接口接送设备的消息;页面进行发现中,发现到金属,未发现金属的页面展示。 + +- demo效果(HH-SCDAYU200) +- ![show](resource/探测器.gif) + +### 工程目录 + +完整的项目结构目录如下 + +``` +entry +│ └─src +│ └─main +│ │ config.json // 应用配置文件 +│ │ +│ ├─ets +│ │ └─MainAbility +│ │ │ app.ets // 应用程序主入口 +│ │ │ +│ │ ├─common // 动画源图片目录 +│ │ │ img_1.png +│ │ │ img_2.png +│ │ │ +│ │ ├─model +│ │ │ CommonLog.ets // 日志打印模块 +│ │ │ PlayerManager.ets // 音频播放模块 +│ │ └─pages +│ │ index.ets // 金属探测器首页 +│ │ +│ └─resources +│ ├─base +│ │ ├─element +│ │ │ string.json +│ │ │ +│ │ ├─graphic +│ │ ├─layout +│ │ ├─media // 存放媒体资源 +│ │ │ icon.png +│ │ │ img_background.png +│ │ └─profile +│ └─rawfile +``` + + + +### 开发步骤 + +#### 1. 新建OpenHarmony ETS项目 + +在DevEco Studio中点击File -> New Project ->[Standard]Empty Ability->Next,Language 选择eTS语言,最后点击Finish即创建成功。 +![image-20211124092813545](resource/new_project.png) + +#### 2. 编写金属探测主页面 + +![image-20211124093106260](resource/normal.jpg)![image-20211124093106260](resource/detecting.jpg)![image-20211124093106260](resource/detected.jpg) + +如上效果图是通过接收到的设备消息,改变页面展示图,整体布局分为两个部分。 + +##### 2.1 标题 + +1)主要有[Flex](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-container-flex.md)布局容器一个[text](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-text.md)组件; + +``` +@Component +struct TitleName { + build() { + Flex() { + Text('金属探测器') + .fontSize('36lpx') + .fontColor('#FFFFFF') + .margin({ left: '40lpx', top: '16lpx' }) + } + } +} +``` + +##### 2.2 检测状态 + +1)主要分为检测中背景动画,检测状态图,检测结果文字说明组成 + +``` + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Stack() { + ImageAnimator() + .images([ + { + src: "/common/img_1.png", + duration: 500, + width: 500, + height: 500, + top: 0, + left: 0 + }, + { + src: "/common/img_2.png", + duration: 500, + width: 500, + height: 500, + top: 0, + left: 0 + }, + { + src: "/common/img_3.png", + duration: 500, + width: 500, + height: 500, + top: 0, + left: 0 + }, + { + src: "/common/img_4.png", + duration: 500, + width: 500, + height: 500, + top: 0, + left: 0 + }, + { + src: "/common/img_5.png", + duration: 500, + width: 500, + height: 500, + top: 0, + left: 0 + } + ]) + .state(this.state).reverse(this.reverse).fixedSize(false).preDecode(3) + .fillMode(FillMode.None).iterations(this.iterations).width(500).height(500) + Image(this.detection) + .width('532lpx') + .height('531lpx') + } + + Text(this.detectionState) + .margin({ top: "90lpx" }) + .fontSize('40lpx') + .fontColor('#FFFFFF') + + } + .width('100%') + .height('100%') + } + + +``` + +2)调用recvMsg接口接送金属探测器的消息,并修改首页展示状态 + +``` +@Component +struct detectionImage { + @State detectionState: string = '' + detection: Resource = $r("app.media.img_normal"); + isDisplay: boolean = false; + metal: string = ''; + + aboutToAppear() { + this.playerManager.setOnStatusChangeListener(() => { + CommonLog.info('setOnStatusChangeListener ' + this.playerManager.getCurrentMusic().url) + }) + + var intervalID = setInterval(() => { + //NAPI调用 + tcpserverapi.recvMsg().then((result) => { + if (result.clientNumber == 0) { + this.detectionState = ''; + this.detection = $r("app.media.img_normal"); + this.state = AnimationStatus.Stopped + this.onPlayOrPauseMusic(true); + this.metal = '' + } else{ + var resultMetal = result.message; + if (resultMetal.match("metal:")) { + if(this.metal != resultMetal.slice(6)) { + this.metal = resultMetal.slice(6); + CommonLog.info('metal' + this.metal) + if (this.metal === 'Detected') { + this.detectionState = '发现金属'; + this.onPlayOrPauseMusic(false); + this.detection = $r("app.media.img_detected"); + this.state = AnimationStatus.Stopped + } + else if (this.metal === 'UnDetected' || this.metal === 'CalibrateOK') { + this.detectionState = '检测中'; + this.onPlayOrPauseMusic(true); + this.detection = $r("app.media.img_detecting"); + this.state = AnimationStatus.Running + } + } + } + } + }) + }, 200) + } + } +``` + +#### 3.NAPI + +##### 3.1 底层NAPI模块封装 + +1)NAPI接口开发具体请参考文档[OpenharmonyNAPI开源仓库](https://gitee.com/javen678/hello-ohos-napi )。 + +2)本应用封装的模块名为tcpserverapi,[源码路径](https://gitee.com/chenchenfangfang/knowledge_demo_attitude_control/tree/master/common\tcpservermodule),下载好的tcpservermodule文件夹。 + +3)下载完成后放到3.1Beta版本根目录,并按照参考PPT配置编译脚本;第一次编译完成需要烧写整个镜像,请参考[开发板上新 | RK3568开发板上丝滑体验OpenHarmony标准系统](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/docs/rk3568_quick_start);后面修改模块源码,只需将库send到板子里面。命令如下: + +``` +先挂载,再send +hdc_std shell mount -oremount,rw / +hdc_std file send libtcpserverapi.z.so system/lib/module/libtcpserverapi.z.so +``` + +##### 3.2 应用端导入NAPI模块 + +``` +import tcpserverapi from '@ohos.tcpserverapi' +``` + +##### 3.3 应用端NAPI接口调用 + +``` +//调用initRecv接口 初始化 TCP 服务器 +tcpserverapi.initServer() +``` + +``` +//定时调用recvMsg获取金属探测器消息 + var intervalID = setInterval(() => { + //NAPI调用 + tcpserverapi.recvMsg().then((result) => { + if (result.clientNumber == 0) { + this.detectionState = ''; + this.detection = $r("app.media.img_normal"); + this.isDisplay = false; + this.metal = '' + } else{ + var resultMetal = result.message; + if (resultMetal.match("metal:")) { + this.metal = resultMetal.slice(6); + console.info('=======' + this.metal) + if (this.metal === 'Detected') { + this.detectionState = '发现金属'; + this.detection = $r("app.media.img_detected"); + this.isDisplay = false; + } + else if (this.metal === 'UnDetected' || this.metal ==='CalibrateOK') { + this.detectionState = '检测中'; + this.detection = $r("app.media.img_detecting"); + this.isDisplay = true; + + } + } + } + }) + }, 200) +``` + +#### 4.音频播放开发 + +本应用里面音频播放,主要是在探测到金属后,播报已探测到金属,达到通知用户的目的,可以简单分为下面四个小节: + +##### 4.1 导入meida模块 + +``` +import media from '@ohos.multimedia.media'; +``` + +##### 4.2 创建音频播放实例 + +``` +// OH media对象 +private player = media.createAudioPlayer(); +``` + +##### 4.3实现音频播放接口 + +``` +play(seekTo) { + if (this.player.state == 'playing' && this.player.src == this.getCurrentMusic().url) { + return + } + + if (this.player.state == 'idle' || this.player.src != this.getCurrentMusic().url) { + CommonLog.info('Preload music url = ' + this.getCurrentMusic().url) + this.player.reset() + this.player.src = this.getCurrentMusic().url + this.player.on('dataLoad', () => { + CommonLog.info('dataLoad duration=' + this.player.duration) + this.totalTimeMs = this.player.duration + if (seekTo > this.player.duration) { + seekTo = -1 + } + this.player.on('play', () => { + if (seekTo > 0) { + this.player.seek(seekTo) + } + }) + + this.player.play() + if(this.statusChangeListener){ + this.statusChangeListener() + } + this.setProgressTimer() + this.isPlaying = true + }) + } + else { + if (seekTo > this.player.duration) { + seekTo = -1 + } + this.player.on('play', () => { + if (seekTo > 0) { + this.player.seek(seekTo) + } + }) + + this.player.play() + this.setProgressTimer() + this.isPlaying = true + } +} +``` + +##### 4.4 实现暂停播放接口 + +``` +pause() { + CommonLog.info("pause music") + this.player.pause(); + this.cancelProgressTimer() + this.isPlaying = false +} +``` + +详细的参考接口:[音视频开发接口](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-media.md) + +### 项目下载和导入 + +1)git下载 + +``` +git clone https://gitee.com/chenchenfangfang/knowledge_demo_attitude_control.git +``` + +2)项目导入 + +打开DevEco Studio,点击File->Open->下载路径/metal_detection/app-code/metalDetection + +#### 1. 设备编译约束 + +以润和大禹系列HH-SCDAYU200开发板套件为例 + +- [开发板上新 | RK3568开发板上丝滑体验OpenHarmony标准系统](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/docs/rk3568_quick_start) + +#### 2. 应用编译约束 + +- [OpenHarmony 基于eTS扩展的类Web开发范式](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md) +- [OpenHarmony应用接口](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/Readme-CN.md) +- 集成开发环境:DevEco Studio 版本[下载](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta) + diff --git a/docs/metal_detection/readme.md b/docs/metal_detection/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..024be8b6d955b9bf393e0b3799ef7375f0ef915e --- /dev/null +++ b/docs/metal_detection/readme.md @@ -0,0 +1,234 @@ +# OpenHarmony金属探测器 + +## 一、简介 + +金属探测器demo是基于OpenHarmony 3.1 release版本,通过磁场强度判断是否检测到金属。当检测到金属物体后,设备端会发出报警并发送信号到应用端。 + +### 1.OpenHarmony技术特性 + +- eTS UI +- UI管理状态@state +- NAPI +- 音频播放 + +### 2.效果展示 + +- demo效果(HH-SCDAYU200) + +![show](resource/探测器.gif) + +## 二、应用端开发 + +应用是使用润和大禹系列HH-SCDAYU200开发板套件,采用方舟开发框架(ArkUI)基于eTS扩展的声明式开发范式编写页面;通过NAPI接口接送设备的消息;页面进行发现中,发现到金属,未发现金属的页面展示。 + +### 1.快速上手 + +#### 1.1 标准设备环境准备 + +以润和大禹系列HH-SCDAYU200开发板套件为例 + +- [ 搭建标准系统环境](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-standard-env-setup.md) +- [下载OpenHarmony 3.1 release 系统源码](https://blog.csdn.net/openharmony/article/details/123866852?utm_source=app&app_version=5.3.0) + +- [开发板上新 | RK3568开发板上丝滑体验OpenHarmony标准系统](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/docs/rk3568_quick_start) + +#### 1.2 应用编译环境准备 + +- 下载DevEco Studio [下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta); +- 配置SDK,参考 [配置OpenHarmony-SDK](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/configuring-openharmony-sdk.md) + +#### 1.3 项目下载和导入 + +1)git下载 + +``` +git clone https://gitee.com/chenchenfangfang/knowledge_demo_attitude_control.git +``` + +2)项目导入 + +打开DevEco Studio,点击File->Open->下载路径/metal_detection/app-code/metalDetection + + +#### 1.4 安装应用 + +- 配置应用签名信息,点击**File > Project Structure** > **Project > Signing Configs**界面勾选“**Automatically generate signing**”,等待自动签名完成即可,点击“**OK**”。如下图所示: + +- ![运行](./resource/sign.png) + +- [安装应用](https://gitee.com/openharmony/docs/blob/update_master_0323/zh-cn/application-dev/quick-start/installing-openharmony-app.md) 识别到设备后点击![img](C:/Users/china/Desktop/smt32/knowledge_demo_attitude_control/electronic_compass/doc/resource/install.png),或使用默认快捷键Shift+F10(macOS为Control+R)运行应用。 + + ![运行](C:/Users/china/Desktop/smt32/knowledge_demo_attitude_control/electronic_compass/doc/resource/run.png) + +- 如果IDE没有识别到设备就需要通过命令安装,如下 + + 打开**OpenHarmony SDK路径 \toolchains** 文件夹下,执行如下hdc_std命令,其中**path**为hap包所在绝对路径。 + + ```text + hdc_std install -r path\entry-debug-standard-ark-signed.hap + ``` + + 应用安装到3568开发板后,需要SMT32开发板发送角度数据,才能看到效果;两个板子连接同一个wifi或使用网线连接并配置同一网段IP地址 + + ``` + hdc_std shell ifconfig eth0 192.168.1.111 netmask 255.255.255.0 + ``` + +### 2.关键代码解读 + +#### 2.1目录结构 + +``` +entry +│ └─src +│ └─main +│ │ config.json // 应用配置文件 +│ │ +│ ├─ets +│ │ └─MainAbility +│ │ │ app.ets // 应用程序主入口 +│ │ │ +│ │ ├─common // 动画源图片目录 +│ │ │ img_1.png +│ │ │ img_2.png +│ │ │ +│ │ ├─model +│ │ │ CommonLog.ets // 日志打印模块 +│ │ │ PlayerManager.ets // 音频播放模块 +│ │ └─pages +│ │ index.ets // 金属探测器首页 +│ │ +│ └─resources +│ ├─base +│ │ ├─element +│ │ │ string.json +│ │ │ +│ │ ├─graphic +│ │ ├─layout +│ │ ├─media // 存放媒体资源 +│ │ │ icon.png +│ │ │ img_background.png +│ │ └─profile +│ └─rawfile +``` + +#### 2.2日志查看方法 + +``` +hdc_std shell +hilog | grep "metalDetected" (metalDetected表示你添加的日志标记) +``` + +#### 2.3关键代码 + +- 金属探测器UI界面:index.ets +- NAPI: 导入 tcpserverapi模块,该模块是要在3568系统代码中编译 + +### 3.从零开发金属探测器应用 + +[从零开发金属探测器应用](quick_develop.md) + +### 4.参考链接 + +- [OpenHarmony基于eTS扩展的声明式开发范式](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md) +- [OpenHarmony应用接口](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/Readme-CN.md) + +## 三、设备侧开发 + +金属检测demo设备端基于Geek_Lite_Board开发板,上位机使用RK3568。通过AK8963电子罗盘芯片,对磁场数据对比后来判断附近有无金属物体。当检测到金属物体后,设备端会发出报警并发送信号到应用端。 + +### 1.工作流程 + +设备上电后,首先进行硬件初始化,初始化完成红色指示灯亮起;设备端通过ESP8266与应用端建立连接,连接成功后绿色指示灯亮起;初始化与连接成功后,设备根据周围磁场强度进行自校准,校准完成后蓝色指示灯亮起。三个指示灯都常量表示设备已经正常工作,可以进入工作状态。 + +当有金属物体靠近设备时,设备会检测到磁场强度发生波动。磁场强度波动0.03高斯时,此时认为附近检测到金属物体,蜂鸣器开启并向应用端发送信号。 + +![](./resource/金属检测流程图.png) + +### 2.工作原理 + +AK8963电子罗盘芯片可以在x、y、z轴检测当前位置的位置的磁场强度,当检测到金属物体后,磁场会生较大波动,当我们平行于电子罗盘芯片放置金属物体时,z轴磁场波动尤为明显,所以我们以z轴磁场强度的波动程度来进行判断。 + +![](./resource/AK8963IC.png) + +### 3.功能实现 + +#### 3.1 磁场数据采集 + +AK8963电子IC内置于mpu9250模块中,通过对mpu9250数据寄存器的读取就能获得ak8963的磁场数据。 + +(1)通过Mpu_Read_Bytes()函数得到mpu9250数据寄存器的值。 + +``` +uint8_t Mpu_Read_Bytes(uint8_t const regAddr, uint8_t *pData, uint8_t len) +``` + +(2)通过mpu9250的寄存器手册获取ak8963的磁场原始数据。 + +``` +Mpu_Data.mag_x = (MPU_BUFF[16] << 8) | MPU_BUFF[15]; // x轴磁场数据 + +Mpu_Data.mag_y = (MPU_BUFF[18] << 8) | MPU_BUFF[17]; // y轴磁场数据 + +Mpu_Data.mag_z = (MPU_BUFF[20] << 8) | MPU_BUFF[19]; // z轴磁场数据 +``` + +(3)对原始数据进行转化,得到磁场强度,单位高斯。 + +``` +Gauss_Mag_z = Mpu_Calc.mag_z * 0.15f * 0.01f; +``` + +#### 3.2 磁场数据调零 + +首先采集100组z轴磁场强度基准数据,然后对这些数据做平均处理,由此得到z轴磁场强度的零点数据。 + +``` + if(i<1000){ + i++; + if(i%5 == 0){ + Mag_z_buff[j++] = Gauss_Mag_z; + if(j>=100){ + i = 1000; + Mag_z_Flag = true; + for(k=0;k<100;k++){ + origin_mag_z += Mag_z_buff[k]; + } + origin_mag_z = origin_mag_z / 100.0f; + + // 校准完成,蓝灯亮,发送给应用端 "CalibrateOK" + BLUE_LED_ON(); + memset(buff,0x00,sizeof(buff)); + sprintf(buff,"angle:%s","CalibrateOK"); + ESP8266_send_data(buff,strlen(buff)); + } + } +} +``` + +#### 3.3 检测信息发送 + +当标志位Mag_z_Flag置1,表示已经完成校准。 + +设置磁场强度波动范围大于0.03Gauss,当超过这个范围,就可以认定为有金属靠近对磁场产生影响。蜂鸣器发出报警信息,然后把检测信息"Detected"发送给应用端。金属离开磁场范围时,设备发送"UnDetected"到应用端。 + +``` +if(Mag_z_Flag){ + if(fabs(Gauss_Mag_z - origin_mag_z) > 0.03f) + { + // 检测到金属,开启蜂鸣器, 发送给应用端 + TIM_SetCompare1(TIM12, 50); + memset(buff,0x00,sizeof(buff)); + sprintf(buff,"angle:%s","Detected"); + ESP8266_send_data(buff,strlen(buff)); + } + else + { + // 未检测到金属,关闭蜂鸣器, 发送给应用端 + TIM_SetCompare1(TIM12, 300); + memset(buff,0x00,sizeof(buff)); + sprintf(buff,"angle:%s","UnDetected"); + ESP8266_send_data(buff,strlen(buff)); + } +} +``` diff --git a/docs/metal_detection/resource/AK8963IC.png b/docs/metal_detection/resource/AK8963IC.png new file mode 100644 index 0000000000000000000000000000000000000000..a52d54a28d2ada2fc37cc1ede76ac6a8e96fa5a1 Binary files /dev/null and b/docs/metal_detection/resource/AK8963IC.png differ diff --git a/docs/metal_detection/resource/detected.jpg b/docs/metal_detection/resource/detected.jpg new file mode 100644 index 0000000000000000000000000000000000000000..730d4f2190cc08923c231e096ec7f31e1844423e Binary files /dev/null and b/docs/metal_detection/resource/detected.jpg differ diff --git a/docs/metal_detection/resource/detecting.jpg b/docs/metal_detection/resource/detecting.jpg new file mode 100644 index 0000000000000000000000000000000000000000..30f72c4ef2d888664c21d7688097305befa07086 Binary files /dev/null and b/docs/metal_detection/resource/detecting.jpg differ diff --git a/docs/metal_detection/resource/metal.m4a b/docs/metal_detection/resource/metal.m4a new file mode 100644 index 0000000000000000000000000000000000000000..12a4e864d0343a681cb6d398dc44145d1805f24a Binary files /dev/null and b/docs/metal_detection/resource/metal.m4a differ diff --git a/docs/metal_detection/resource/new_project.png b/docs/metal_detection/resource/new_project.png new file mode 100644 index 0000000000000000000000000000000000000000..78372c2329b5bd0c96ee544c73a8df359107201c Binary files /dev/null and b/docs/metal_detection/resource/new_project.png differ diff --git a/docs/metal_detection/resource/normal.jpg b/docs/metal_detection/resource/normal.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9226d4b127c8dd188c1b8b345a35ccdc8566c6ba Binary files /dev/null and b/docs/metal_detection/resource/normal.jpg differ diff --git a/docs/metal_detection/resource/sign.png b/docs/metal_detection/resource/sign.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d203b840f46e6d2d68567be4388157567d9620 Binary files /dev/null and b/docs/metal_detection/resource/sign.png differ diff --git "a/docs/metal_detection/resource/\346\216\242\346\265\213\345\231\250.gif" "b/docs/metal_detection/resource/\346\216\242\346\265\213\345\231\250.gif" new file mode 100644 index 0000000000000000000000000000000000000000..d92fdba31707922dc63d66db0c7a74d9533b90a6 Binary files /dev/null and "b/docs/metal_detection/resource/\346\216\242\346\265\213\345\231\250.gif" differ diff --git "a/docs/metal_detection/resource/\351\207\221\345\261\236\346\243\200\346\265\213\346\265\201\347\250\213\345\233\276.png" "b/docs/metal_detection/resource/\351\207\221\345\261\236\346\243\200\346\265\213\346\265\201\347\250\213\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..c150c8308741cd1c0aaab6769393157a57a099ad Binary files /dev/null and "b/docs/metal_detection/resource/\351\207\221\345\261\236\346\243\200\346\265\213\346\265\201\347\250\213\345\233\276.png" differ diff --git a/docs/robot_dog/quick_develop.md b/docs/robot_dog/quick_develop.md new file mode 100644 index 0000000000000000000000000000000000000000..c3bcd571bd74fd988bef1a03ace473d127ea3ef7 --- /dev/null +++ b/docs/robot_dog/quick_develop.md @@ -0,0 +1,290 @@ +## OpenHarmony机器狗应用 + +### 简介 + +机器狗应用是通过发送控制命令,控制机器狗做相应的动作;应用是采用方舟开发框架(ArkUI)基于eTS扩展的声明式开发范式编写页面;通过NAPI接口发送控制命令给机器狗设备;页面暂无做对应动作的动图,待升级完善。 + +- demo效果(HH-SCDAYU200)【需要替换】 + +![show](resources/3568.gif) + +### 工程目录 + +完整的项目结构目录如下 + +``` +entry +│ └─src +│ └─main +│ │ config.json // 应用配置文件 +│ │ +│ ├─ets +│ │ └─MainAbility +│ │ │ app.ets // 应用程序主入口 +│ │ │ +│ │ ├─model +│ │ │ comtrolData.ets // 控制指令数据 +│ │ │ +│ │ └─pages +│ │ index.ets // 机器狗控制首页 +│ │ +│ └─resources +│ ├─base +│ │ ├─element +│ │ │ string.json +│ │ │ +│ │ ├─graphic +│ │ ├─layout +│ │ ├─media // 存放媒体资源 +│ │ │ bg_select.png +│ │ │ +│ │ └─profile +│ └─rawfile +``` + + + +### 开发步骤 + +#### 1. 新建OpenHarmony ETS项目 + +在DevEco Studio中点击File -> New Project ->[Standard]Empty Ability->Next,Language 选择eTS语言,最后点击Finish即创建成功。 +![image-20211124092813545](resources/new_project.png) + +#### 2. 编写机器狗主页面 + +![image-20211124093106260](resources/disconnect.png) + + + +![image-20211124093106260](resources/connect.png) + +效果图如上可以分为四部分。 + +##### 2.1 标题 + +1)主要有[Flex](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-container-flex.md)布局容器一个[text](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-text.md)组件; + +``` +@Component +struct TitleName { + build() + Flex() { + Text('机器狗') + .fontSize('36lpx') + .fontColor('#FFFFFF') + .margin({ left: '40lpx', top: '16lpx' }) + } + } +} +``` + +##### 2.2 logo图标 + +1)主要有[Flex](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-container-flex.md)布局容器一个[image](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-image.md)组件; + +``` +@Component +struct LogoImage { + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Image($r("app.media.icon_logo")) + .width('480lpx') + .height('320lpx') + } + .width('100%') + .height('372lpx') + } +} +``` + +##### 2.3 连接状态栏 + +连接状态是通过NAPI接口获取客户端是否连接成功信息,展示对应的状态; + +1)aboutToAppear中定时获取是否已连接成功,并对connectState进行[@State](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/ts-component-states-state.md)修饰,只有数据改变,就重新进行UI渲染 + +``` + @State connectState: boolean = false + aboutToAppear() { + var intervalID = setInterval(() => { + //NAPI调用 + tcpserverapi.recvMsg().then((result) => { + if (result.ip) { + this.connectState = true; + clearInterval(intervalID); + } + }) + }, 1000) + } +``` + +2)根据连接状态connectState进行[条件渲染](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/ts-rending-control-syntax-if-else.md)展示 + +``` + build() { + //连接状态 + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + if (this.connectState) { + Text('已连接') + .fontSize('36lpx') + .fontColor('#FFFFFF') + Image($r("app.media.icon_switch_on")) + .width('112lpx') + .height('112lpx') + } + else { + Text('未连接') + .fontSize('36lpx') + .fontColor('#FFFFFF') + Image($r("app.media.icon_switch_off")) + .width('112lpx') + .height('112lpx') + } + } + .linearGradient({ + angle: 180, + colors: [[0x363D4D, 0], [0x303644, 0.49], [0x22252F, 1.0]] + }) + .borderRadius('32lpx') + .width('672lpx') + .height('146lpx') + .padding({ left: '32lpx', right: '32lpx' }) + } +``` + +##### 2.4 控制命令栏 + +1)首先通过initializeOnStartup 获取命令数据 + +2)再通过循环渲染[ForEach](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/ts-rending-control-syntax-foreach.md)展示四个命令框图 + +3)并对每一个框图添加点击事件[onClick](),点击选中后发送命令 + +4)因设计图边框是渐变色,.border属性暂不支持设备,所以用[stack](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-container-stack.md)堆叠方式展示是否点击选中 + +``` + +@Component +struct CommandListItem { +//控制命令 + @State command: any[] = ControlData + @State commandItems: CommandData[] = initializeOnStartup(this.command) + @State name: string = '' + + build() { + Flex({ wrap: FlexWrap.Wrap, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceEvenly }) { + ForEach(this.commandItems, item => { + Stack() { + Image(this.name == item.name ? $r("app.media.bg_select") : $r("app.media.bg_unselect")) + Flex({ + direction: FlexDirection.Column, + alignItems: ItemAlign.Center, + justifyContent: FlexAlign.SpaceEvenly + }) { + + Image(item.imgSrc) + .width('112lpx') + .height('112lpx') + Text(item.name) + .fontSize('36lpx') + .fontColor('#FFFFFF') + } + .onClick(() => { + this.name = item.name; + tcpserverapi.sendRobotDogCommand(item.commandName); + }) + } + .borderRadius('32lpx') + .width('324lpx') + .height('242lpx') + .margin({ bottom: '12lpx' }) + + }, item => item.id.toString()) + } + .width('100%') + .height('600lpx') + .margin({ top: '16lpx' }) + } +} +``` + +#### 3.NAPI + +##### 3.1 底层NAPI模块封装 + +1)NAPI接口开发具体请参考文档[标准设备NAPI](标准设备应用开发——NAPI6.pptx)和[OpenharmonyNAPI开源仓库](https://gitee.com/javen678/hello-ohos-napi )。 + +2)本应用封装的模块名为tcpserverapi,[源码路径](https://gitee.com/chenchenfangfang/knowledge_demo_attitude_control/tree/master/common\tcpservermodule),下载好的tcpservermodule文件夹。 + +3)下载完成后放到3.1Beta版本根目录,并按照参考PPT配置编译脚本;第一次编译完成需要烧写整个镜像,请参考[开发板上新 | RK3568开发板上丝滑体验OpenHarmony标准系统](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/docs/rk3568_quick_start);后面修改模块源码,只需将库send到板子里面。命令如下: + +``` +先挂载,再send +hdc_std shell mount -oremount,rw / +hdc_std file send libtcpserverapi.z.so system/lib/module/libtcpserverapi.z.so +``` + +##### 3.2 应用端导入NAPI模块 + +``` +import tcpserverapi from '@ohos.tcpserverapi' +``` + +##### 3.3 应用端NAPI接口调用 + +``` +//调用initRecv接口 初始化 TCP 服务器 +tcpserverapi.initServer() +``` + +``` +//定时调用recvMsg获取客户端是否连接,连接后退出检测 +aboutToAppear() { + var intervalID = setInterval(() => { + //NAPI调用 + tcpserverapi.recvMsg().then((result) => { + console.info('===llh=='+result.ip) + if (result.ip) { + console.info('==1=llh=='+result.ip) + this.connectState = true; + clearInterval(intervalID); + } + }) + }, 1000) + } +``` + +``` +// 点击图标,调用sendRobotDogCommand发送控制命令 +.onClick(() => { + this.name = item.name; + tcpserverapi.sendRobotDogCommand(item.commandName); + }) + +``` + + + +### 项目下载和导入 + +1)git下载 + +``` +git clone https://gitee.com/chenchenfangfang/knowledge_demo_attitude_control.git +``` + +2)项目导入 + +打开DevEco Studio,点击File->Open->下载路径/robot_dog/app-code/robotDog + +#### 1. 设备编译约束 + +以润和大禹系列HH-SCDAYU200开发板套件为例 + +- [开发板上新 | RK3568开发板上丝滑体验OpenHarmony标准系统](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/docs/rk3568_quick_start) + +#### 2. 应用编译约束 + +- 参考 [应用开发快速入门](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/deveco-studio-overview.md#/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/installing-openharmony-app.md) +- 集成开发环境:DevEco Studio 版本[下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta); diff --git a/docs/robot_dog/readme.md b/docs/robot_dog/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..e3f01bb532aed0bbc922e346fe5ca18e85277580 --- /dev/null +++ b/docs/robot_dog/readme.md @@ -0,0 +1,130 @@ +# OpenHarmony机器狗应用 + +## 一、简介 + +#### 1.样例效果 + +机器狗应用是通过发送控制命令,控制机器狗做相应的动作;应用是采用方舟开发框架(ArkUI)基于eTS扩展的声明式开发范式编写页面;通过NAPI接口发送控制命令给机器狗设备;页面暂无做对应动作的动图,待升级完善。 + +- demo效果(HH-SCDAYU200)【需要替换】 + +![show](resources/3568.gif) + +#### 2.涉及OpenHarmony技术特性 + +- eTS UI +- UI管理状态@state +- NAPI + +#### 3.支持OpenHarmony版本 + +OpenHarmony 3.1 release版本 + +#### 4.支持开发板 + +- 润和大禹系列HH-SCDAYU200开发板套件 + +## 二、快速上手 + +#### 1.标准设备环境准备 + +以润和大禹系列HH-SCDAYU200开发板套件为例 + +- [开发板上新 | RK3568开发板上丝滑体验OpenHarmony标准系统](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/docs/rk3568_quick_start) + +#### 2.应用编译环境准备 + +- 下载DevEco Studio [下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta); +- 配置SDK,参考 [配置OpenHarmony-SDK](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/configuring-openharmony-sdk.md) +- DevEco Studio 点击File -> Open 导入本下面的代码工程compass + +#### 3.项目下载和导入 + +1)git下载 + +``` +git clone https://gitee.com/chenchenfangfang/knowledge_demo_attitude_control.git +``` + +2)项目导入 + +打开DevEco Studio,点击File->Open->下载路径/robot_dog/app-code/robotDog + + +#### 4.安装应用 + +- [配置应用签名信息](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/configuring-openharmony-app-signature.md) + +- [安装应用](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/installing-openharmony-app.md) 如果IDE没有识别到设备就需要通过命令安装,如下 + + 打开**OpenHarmony SDK路径 \toolchains** 文件夹下,执行如下hdc_std命令,其中**path**为hap包所在绝对路径。 + + ```text + hdc_std install -r path\entry-debug-standard-ark-signed.hap + ``` + + 应用安装到3568开发板后,需要向机器狗开发板发送控制数据,才能看到效果;两个板子连接同一个wifi或使用网线连接并配置同一网段IP地址 + + ``` + hdc shell ifconfig eth0 192.168.1.111 netmask 255.255.255.0 + ``` + +**PS**环境准备,源码下载,编译,烧录设备,应用部署的完整步骤请参考[这里](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/deveco-studio-overview.md#/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/configuring-openharmony-app-signature.md) + +## 三、关键代码解读 + +#### 1.目录结构 + +``` +entry +│ └─src +│ └─main +│ │ config.json // 应用配置文件 +│ │ +│ ├─ets +│ │ └─MainAbility +│ │ │ app.ets // 应用程序主入口 +│ │ │ +│ │ ├─model +│ │ │ comtrolData.ets // 控制指令数据 +│ │ │ +│ │ └─pages +│ │ index.ets // 机器狗控制首页 +│ │ +│ └─resources +│ ├─base +│ │ ├─element +│ │ │ string.json +│ │ │ +│ │ ├─graphic +│ │ ├─layout +│ │ ├─media // 存放媒体资源 +│ │ │ bg_select.png +│ │ │ +│ │ └─profile +│ └─rawfile +``` + +#### 2.日志查看方法 + +``` +hdc_std shell +hilog | grep "xxx" (xxx表示你添加的日志标记) +``` + +#### 3.关键代码 + +- 机器狗UI界面:index.ets +- NAPI: 导入 tcpserverapi模块,该模块是要在3568系统代码中编译 + +## 四、如何从零开发机器狗应用 + +[从零开发机器狗应用](quick_develop.md) + +## 五、参考链接 + +- [OpenHarmony基于eTS扩展的声明式开发范式](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md) +- [OpenHarmony应用接口](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/Readme-CN.md) + + + diff --git a/docs/robot_dog/resources/connect.png b/docs/robot_dog/resources/connect.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8dfed5472547b304289d001ee9b8b6e3e90922 Binary files /dev/null and b/docs/robot_dog/resources/connect.png differ diff --git a/docs/robot_dog/resources/disconnect.png b/docs/robot_dog/resources/disconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..aafe4ef7a4cdb5833485172ececcb604d0a9f3be Binary files /dev/null and b/docs/robot_dog/resources/disconnect.png differ diff --git a/docs/robot_dog/resources/new_project.png b/docs/robot_dog/resources/new_project.png new file mode 100644 index 0000000000000000000000000000000000000000..78372c2329b5bd0c96ee544c73a8df359107201c Binary files /dev/null and b/docs/robot_dog/resources/new_project.png differ