From 6d1b00ccfcbe4184dc572b34aa25c630fe196525 Mon Sep 17 00:00:00 2001 From: CaiFeng <2397707574@qq.com> Date: Tue, 26 Mar 2024 08:55:35 +0800 Subject: [PATCH 01/20] support vibrator --- app/src/main/AndroidManifest.xml | 1 + cloudphone/src/main/AndroidManifest.xml | 1 + .../cloudphone/api/CloudPhoneParas.java | 1 + .../common/VirtualDeviceProtocol.java | 3 ++ .../vibrator/VirtualVibrator.java | 48 +++++++++++++++++++ .../vibrator/VirtualVibratorManager.java | 36 ++++++++++++++ 6 files changed, 90 insertions(+) create mode 100644 cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java create mode 100644 cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5575ca1..cd94b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ + + \ No newline at end of file diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/api/CloudPhoneParas.java b/cloudphone/src/main/java/com/huawei/cloudphone/api/CloudPhoneParas.java index 1abef36..729c0d8 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/api/CloudPhoneParas.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/api/CloudPhoneParas.java @@ -31,4 +31,5 @@ public class CloudPhoneParas { public static final short DEV_TYPE_MICROPHONE = 2; public static final short DEV_TYPE_SENSOR = 3; public static final short DEV_TYPE_LOCATION = 4; + public static final short DEV_TYPE_VIBRATOR = 5; } diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java index 16906a5..e94e465 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java @@ -19,6 +19,7 @@ import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_CAMERA; import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_LOCATION; import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_MICROPHONE; import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_SENSOR; +import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_VIBRATOR; import android.content.Context; import android.hardware.SensorManager; @@ -29,6 +30,7 @@ import com.huawei.cloudphone.virtualdevice.camera.VirtualCameraManager; import com.huawei.cloudphone.virtualdevice.location.VirtualLocationManager; import com.huawei.cloudphone.virtualdevice.microphone.VirtualMicrophoneManager; import com.huawei.cloudphone.virtualdevice.sensor.VirtualSensorManager; +import com.huawei.cloudphone.virtualdevice.vibrator.VirtualVibratorManager; import java.util.HashMap; import java.util.Map; @@ -56,6 +58,7 @@ public class VirtualDeviceProtocol { virtualDeviceManagers.put(DEV_TYPE_SENSOR, new VirtualSensorManager(this, (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE))); virtualDeviceManagers.put(DEV_TYPE_LOCATION, new VirtualLocationManager(this, mContext)); + virtualDeviceManagers.put(DEV_TYPE_VIBRATOR, new VirtualVibratorManager(this, mContext)); // 设置权限监听 if (listener != null) { diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java new file mode 100644 index 0000000..b5fc058 --- /dev/null +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java @@ -0,0 +1,48 @@ +/* + * Copyright 2023 Huawei Cloud Computing Technology 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. + */ +package com.huawei.cloudphone.virtualdevice.vibrator; + +import android.content.Context; +import android.os.Vibrator; + +import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; + +public class VirtualVibrator { + private static final String TAG = "VirtualVibrator"; + + private Context mContext; + private Vibrator mVibrator; + + public VirtualVibrator(Context context) { + mContext = context; + mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + } + + public void startVibrate(VirtualDeviceProtocol.MsgHeader header, byte[] body) { + if (!mVibrator.hasVibrator()) { + return; + } + long vibrateTime = ((body[0] << 24) | (body[1] << 16) | (body[2] << 8) | (body[3])); + mVibrator.vibrate(vibrateTime); + } + + public void stopVibrate() { + if (!mVibrator.hasVibrator()) { + return; + } + mVibrator.cancel(); + } +} \ No newline at end of file diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java new file mode 100644 index 0000000..0210e01 --- /dev/null +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java @@ -0,0 +1,36 @@ +package com.huawei.cloudphone.virtualdevice.vibrator; + +import android.content.Context; +import android.util.Log; + +import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager; +import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; + +public class VirtualVibratorManager extends VirtualDeviceManager { + private static final String TAG = "VirtualVibratorManager"; + public static final short OPT_VIBRATOR_START_REQ = 0x0; + public static final short OPT_VIBRATOR_STOP_REQ = 0x1; + + private VirtualVibrator mVirtualVibrator; + private VirtualDeviceProtocol mVirtualDeviceProtocol; + + public VirtualVibratorManager(VirtualDeviceProtocol virtualDeviceProtocol, Context context) { + mVirtualDeviceProtocol = virtualDeviceProtocol; + mVirtualVibrator = new VirtualVibrator(context); + } + + public void processMsg(VirtualDeviceProtocol.MsgHeader header, byte[] body) { + switch (header.mOptType) { + case OPT_VIBRATOR_START_REQ: + Log.i(TAG, "processMsg: start vibrate"); + mVirtualVibrator.startVibrate(header, body); + break; + case OPT_VIBRATOR_STOP_REQ: + Log.i(TAG, "processMsg: stop vibrate"); + mVirtualVibrator.stopVibrate(); + break; + default: + Log.e(TAG, "processMsg: error opt type"); + } + } +} -- Gitee From 9ce7bb8ba452e660b24718ad1a66d45b6e0015c2 Mon Sep 17 00:00:00 2001 From: CaiFeng <2397707574@qq.com> Date: Tue, 26 Mar 2024 11:09:43 +0800 Subject: [PATCH 02/20] support vibrator but optimize --- .../huawei/cloudapp/ui/CasCloudDebugActivity.java | 2 +- cloudphone/src/main/AndroidManifest.xml | 1 - cloudphone/src/main/cpp/cas_common/CasMsg.h | 1 + .../src/main/cpp/cas_stream/CasStreamRecvParser.cpp | 2 +- .../virtualdevice/common/VirtualDeviceProtocol.java | 1 + .../virtualdevice/vibrator/VirtualVibrator.java | 8 +++++++- .../vibrator/VirtualVibratorManager.java | 12 ++++++------ 7 files changed, 17 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java index 68cb2e3..a39c376 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java @@ -118,7 +118,7 @@ public class CasCloudDebugActivity extends Activity { connectorInfo.setSessionId(sessionId); connectorInfo.setTicket("ticket_xxxxxx"); // 32位16进制数,测试使用 - connectorInfo.setAesKey("11111111111111111111111111111111"); + connectorInfo.setAesKey("a6b0986c973f4dbf9015b8f07c1f4524"); connectorInfo.setAuthTs("987654321"); connectorInfo.setTouchTimeout("0"); return connectorInfo; diff --git a/cloudphone/src/main/AndroidManifest.xml b/cloudphone/src/main/AndroidManifest.xml index 119861f..4994237 100644 --- a/cloudphone/src/main/AndroidManifest.xml +++ b/cloudphone/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ - \ No newline at end of file diff --git a/cloudphone/src/main/cpp/cas_common/CasMsg.h b/cloudphone/src/main/cpp/cas_common/CasMsg.h index f591ff8..3f58e51 100644 --- a/cloudphone/src/main/cpp/cas_common/CasMsg.h +++ b/cloudphone/src/main/cpp/cas_common/CasMsg.h @@ -39,6 +39,7 @@ enum CasMsgType : uint8_t { VirtualMicrophone = 22, VirtualSensor = 23, VirtualLocation = 24, + VirtualVibrator = 25, End, }; diff --git a/cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp b/cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp index 09746b9..6439dfc 100644 --- a/cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp +++ b/cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp @@ -75,7 +75,7 @@ void CasStreamRecvParser::SetServiceHandle(unsigned char type, CasPktHandle *ser CasPktHandle *CasStreamRecvParser::GetServiceHandle(unsigned char type) { - return VirtualLocation >= type && type >= VirtualCamera ? m_serviceHandles[VirtualDevice] : m_serviceHandles[type]; + return VirtualVibrator >= type && type >= VirtualCamera ? m_serviceHandles[VirtualDevice] : m_serviceHandles[type]; } CasStreamParseThread::CasStreamParseThread(CasSocket *socket, CasStreamRecvParser *streamRecvParser) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java index e94e465..b8e347a 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java @@ -88,6 +88,7 @@ public class VirtualDeviceProtocol { public void processMsg(MsgHeader header, byte[] body) { short devType = header.mDeviceType; + Log.e(TAG, "processMsg: device type :" + header.mDeviceType); if (devType == 0) devType = DEV_TYPE_SENSOR; VirtualDeviceManager virtualDeviceManager = virtualDeviceManagers.get(devType); if (virtualDeviceManager == null) { diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java index b5fc058..d306588 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java @@ -15,9 +15,11 @@ */ package com.huawei.cloudphone.virtualdevice.vibrator; +import android.annotation.SuppressLint; import android.content.Context; import android.os.Vibrator; +import com.huawei.cloudphone.common.CASLog; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; public class VirtualVibrator { @@ -28,17 +30,21 @@ public class VirtualVibrator { public VirtualVibrator(Context context) { mContext = context; - mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); } + @SuppressLint("MissingPermission") public void startVibrate(VirtualDeviceProtocol.MsgHeader header, byte[] body) { if (!mVibrator.hasVibrator()) { return; } long vibrateTime = ((body[0] << 24) | (body[1] << 16) | (body[2] << 8) | (body[3])); + CASLog.i(TAG, "vibrate time is " + vibrateTime); + mVibrator.cancel(); mVibrator.vibrate(vibrateTime); } + @SuppressLint("MissingPermission") public void stopVibrate() { if (!mVibrator.hasVibrator()) { return; diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java index 0210e01..dd522a7 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java @@ -1,15 +1,15 @@ package com.huawei.cloudphone.virtualdevice.vibrator; import android.content.Context; -import android.util.Log; +import com.huawei.cloudphone.common.CASLog; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; public class VirtualVibratorManager extends VirtualDeviceManager { private static final String TAG = "VirtualVibratorManager"; - public static final short OPT_VIBRATOR_START_REQ = 0x0; - public static final short OPT_VIBRATOR_STOP_REQ = 0x1; + public static final short OPT_VIBRATOR_START_REQ = 0x1; + public static final short OPT_VIBRATOR_STOP_REQ = 0x2; private VirtualVibrator mVirtualVibrator; private VirtualDeviceProtocol mVirtualDeviceProtocol; @@ -22,15 +22,15 @@ public class VirtualVibratorManager extends VirtualDeviceManager { public void processMsg(VirtualDeviceProtocol.MsgHeader header, byte[] body) { switch (header.mOptType) { case OPT_VIBRATOR_START_REQ: - Log.i(TAG, "processMsg: start vibrate"); + CASLog.i(TAG, "processMsg: start vibrate"); mVirtualVibrator.startVibrate(header, body); break; case OPT_VIBRATOR_STOP_REQ: - Log.i(TAG, "processMsg: stop vibrate"); + CASLog.i(TAG, "processMsg: stop vibrate"); mVirtualVibrator.stopVibrate(); break; default: - Log.e(TAG, "processMsg: error opt type"); + CASLog.e(TAG, "processMsg: error opt type"); } } } -- Gitee From 6fd8ee54460ae5b4d4dd6d95d3cfed0a203f2b21 Mon Sep 17 00:00:00 2001 From: CaiFeng <2397707574@qq.com> Date: Tue, 26 Mar 2024 16:45:40 +0800 Subject: [PATCH 03/20] support sensor but parse body failed --- .../virtualdevice/sensor/VirtualSensor.java | 20 ++++++++++++++++++ .../sensor/VirtualSensorManager.java | 21 ++++++++++++++----- .../vibrator/VirtualVibrator.java | 2 +- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java index 0580a0e..21ce5d3 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java @@ -23,7 +23,11 @@ import android.os.Handler; import android.os.HandlerThread; import android.util.Log; +import com.huawei.cloudphone.common.CASLog; import com.huawei.cloudphone.virtualdevice.common.IVirtualDeviceDataListener; +import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; + +import java.util.Arrays; public class VirtualSensor implements SensorEventListener { private static final String TAG = "VirtualSensor"; @@ -68,6 +72,22 @@ public class VirtualSensor implements SensorEventListener { mIsStart = false; } + public void handleSensorInfo(VirtualDeviceProtocol.MsgHeader header, byte[] body) { + CASLog.i(TAG, "payloadLength=" + header.mPayloadLength); + int sensorId = header.mDeviceId; + CASLog.i(TAG, "body=" + Arrays.toString(body)); + long samplingPeriodUs = ((body[0] << 24) | (body[1] << 16) | (body[2] << 8) | (body[3] & 0xFF)); + long maxReportLatencyUs = ((body[4] << 24) | (body[5] << 16) | (body[6] << 8) | (body[7] & 0xFF)); + CASLog.i(TAG, "sensorId=" + sensorId + " samplingPeriodUs=" + samplingPeriodUs + " maxReportLatencyUs=" + maxReportLatencyUs); + } + + public void handleSensorStatus(VirtualDeviceProtocol.MsgHeader header, byte[] body) { + CASLog.i(TAG, "payloadLength=" + header.mPayloadLength); + int sensorId = header.mDeviceId; + int status = (body[0] << 8) | (body[1] & 0x0FF); + CASLog.i(TAG, "sensorId=" + sensorId + " status=" + status); + } + @Override public void onSensorChanged(SensorEvent sensorEvent) { if (mListener == null) { diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java index 561f2d6..3b349a2 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java @@ -32,10 +32,13 @@ public class VirtualSensorManager extends VirtualDeviceManager { public static final short DEV_ACCELERATION = 0x0; public static final short DEV_GYROSCOPE = 0x1; + public static final short OPT_SENSOR_ENABLE_REQ = 0x1; public static final short OPT_SENSOR_ENABLE_RSP = 0x1001; public static final short OPT_SENSOR_DISABLE_REQ = 0x2; public static final short OPT_SENSOR_DISABLE_RSP = 0x1002; + public static final short OPT_SENSOR_STATUS_RSP = 0x1003; + public static final short OPT_SENSOR_INFO_RSP = 0x1004; public static final short OPT_SENSOR_DATA = 0x10; private VirtualSensor mVirtualSensor; @@ -49,13 +52,21 @@ public class VirtualSensorManager extends VirtualDeviceManager { public void processMsg(MsgHeader header, byte[] body) { switch (header.mOptType) { case OPT_SENSOR_ENABLE_RSP: - Log.i(TAG, "processMsg: enable sensor"); - mVirtualSensor.registerSensorDataListener(new SensorDataListener()); - mVirtualSensor.startProcess(); + Log.i(TAG, "processMsg: sensor enable"); +// mVirtualSensor.registerSensorDataListener(new SensorDataListener()); +// mVirtualSensor.startProcess(); break; case OPT_SENSOR_DISABLE_RSP: - Log.i(TAG, "processMsg: disable sensor"); - mVirtualSensor.stopProcess(); + Log.i(TAG, "processMsg: sensor disable"); +// mVirtualSensor.stopProcess(); + break; + case OPT_SENSOR_STATUS_RSP: + Log.i(TAG, "processMsg: sensor status"); + mVirtualSensor.handleSensorStatus(header, body); + break; + case OPT_SENSOR_INFO_RSP: + Log.i(TAG, "processMsg: sensor info"); + mVirtualSensor.handleSensorInfo(header, body); break; default: Log.e(TAG, "processMsg: error opt type"); diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java index d306588..e795dc7 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java @@ -41,7 +41,7 @@ public class VirtualVibrator { long vibrateTime = ((body[0] << 24) | (body[1] << 16) | (body[2] << 8) | (body[3])); CASLog.i(TAG, "vibrate time is " + vibrateTime); mVibrator.cancel(); - mVibrator.vibrate(vibrateTime); +// mVibrator.vibrate(vibrateTime); } @SuppressLint("MissingPermission") -- Gitee From a49e6c8d9b47822e3c80a94caf09f52e4e37b4bf Mon Sep 17 00:00:00 2001 From: CaiFeng <2397707574@qq.com> Date: Thu, 28 Mar 2024 21:45:31 +0800 Subject: [PATCH 04/20] support gnss --- .../location/VirtualLocation.java | 275 +++++++++++++++--- .../location/VirtualLocationManager.java | 50 +++- 2 files changed, 282 insertions(+), 43 deletions(-) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java index baef697..2e6cdc7 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java @@ -25,6 +25,9 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.location.GnssClock; +import android.location.GnssMeasurement; +import android.location.GnssMeasurementsEvent; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; @@ -51,6 +54,11 @@ import com.huawei.cloudphone.api.CloudPhonePermissionRequestListener; import com.huawei.cloudphone.common.CASLog; import com.huawei.cloudphone.virtualdevice.common.IVirtualDeviceDataListener; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; @@ -58,25 +66,48 @@ public class VirtualLocation { private static final String TAG = "VirtualLocation"; private final long MIN_TIME = 1000; private final float MIN_DISTANCE = 1; + private final int TYPE_LOCATION = 0; + private final int TYPE_GNSS_MEASUREMENT = 1; + + private static final int HAS_SNR = (1<<0); + private static final int HAS_CARRIER_FREQUENCY = (1<<9); + private static final int HAS_CARRIER_CYCLES = (1<<10); + private static final int HAS_CARRIER_PHASE = (1<<11); + private static final int HAS_CARRIER_PHASE_UNCERTAINTY = (1<<12); + private static final int HAS_AUTOMATIC_GAIN_CONTROL = (1<<13); + + private static final int HAS_LEAP_SECOND = (1<<0); + private static final int HAS_TIME_UNCERTAINTY = (1<<1); + private static final int HAS_FULL_BIAS = (1<<2); + private static final int HAS_BIAS = (1<<3); + private static final int HAS_BIAS_UNCERTAINTY = (1<<4); + private static final int HAS_DRIFT = (1<<5); + private static final int HAS_DRIFT_UNCERTAINTY = (1<<6); private Context mContext; private Location mLocation; private LocationManager mLocationManager; private LocationListener mLocationListener; + private GnssMeasurementsEvent.Callback mGnssMeasurementsEventCallback; private String mLocationProvider; - private IVirtualDeviceDataListener mListener = null; + private IVirtualDeviceDataListener mLocationDataListener = null; + private IVirtualDeviceDataListener mGnssMeasurementsDataListener = null; public VirtualLocation(Context context) { mContext = context; } public void registerLocationDataListener(IVirtualDeviceDataListener listener) { - mListener = listener; + mLocationDataListener = listener; + } + + public void registerGnssMeasurementsDataListener(IVirtualDeviceDataListener listener) { + mGnssMeasurementsDataListener = listener; } @RequiresApi(api = Build.VERSION_CODES.P) @SuppressLint("MissingPermission") - public void requestLocationUpdates(CloudPhonePermissionRequestListener listener) { + public void requestUpdates(CloudPhonePermissionRequestListener listener, int type) { if ((ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) && (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { CASLog.i(TAG, "request coarse and fine location permission"); @@ -92,54 +123,86 @@ public class VirtualLocation { if (mLocationManager == null) { mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); } - boolean locationEnable = mLocationManager.isLocationEnabled(); - if (!locationEnable) { - CASLog.i(TAG, "location enable is false"); - Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); - mContext.startActivity(intent); - return; + if (type == TYPE_LOCATION) { + requestLocationUpdates(); + } else if (type == TYPE_GNSS_MEASUREMENT) { + requestGnssMeasurementUpdates(); } + } + } - List providers = mLocationManager.getProviders(true); - if (providers.contains(LocationManager.GPS_PROVIDER)) { - mLocationProvider = LocationManager.GPS_PROVIDER; - } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) { - mLocationProvider = LocationManager.NETWORK_PROVIDER; - } else { - return; - } - CASLog.i(TAG, "location provider is " + mLocationProvider); - mLocationListener = new LocationListener() { - @Override - public void onLocationChanged(Location location) { - if (location != null) { - mLocation = location; - String locationInfo = getLocationInfo(location); - mListener.onRecvData(locationInfo); - } + @RequiresApi(api = Build.VERSION_CODES.P) + @SuppressLint("MissingPermission") + private void requestLocationUpdates() { + if (mLocationManager == null) { + return; + } + boolean locationEnable = mLocationManager.isLocationEnabled(); + if (!locationEnable) { + CASLog.i(TAG, "location enable is false"); + Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); + mContext.startActivity(intent); + return; + } + List providers = mLocationManager.getProviders(true); + if (providers.contains(LocationManager.GPS_PROVIDER)) { + mLocationProvider = LocationManager.GPS_PROVIDER; + } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) { + mLocationProvider = LocationManager.NETWORK_PROVIDER; + } else { + return; + } + CASLog.i(TAG, "location provider is " + mLocationProvider); + mLocationListener = new LocationListener() { + @Override + public void onLocationChanged(Location location) { + if (location != null) { + mLocation = location; + String locationInfo = getLocationInfo(location); + mLocationDataListener.onRecvData(locationInfo); } + } - @Override - public void onStatusChanged(String s, int i, Bundle bundle) { - } + @Override + public void onStatusChanged(String s, int i, Bundle bundle) { + } - @Override - public void onProviderEnabled(String s) { - } + @Override + public void onProviderEnabled(String s) { + } - @Override - public void onProviderDisabled(String s) { - } - }; - mLocationManager.requestLocationUpdates(mLocationProvider, MIN_TIME, MIN_DISTANCE, mLocationListener, Looper.getMainLooper()); - mLocation = mLocationManager.getLastKnownLocation(mLocationProvider); - String locationInfo = getLocationInfo(mLocation); - if (locationInfo != null) { - mListener.onRecvData(locationInfo); + @Override + public void onProviderDisabled(String s) { } + }; + mLocationManager.requestLocationUpdates(mLocationProvider, MIN_TIME, MIN_DISTANCE, mLocationListener, Looper.getMainLooper()); + mLocation = mLocationManager.getLastKnownLocation(mLocationProvider); + String locationInfo = getLocationInfo(mLocation); + if (locationInfo != null) { + mLocationDataListener.onRecvData(locationInfo); } } + @SuppressLint("MissingPermission") + @RequiresApi(api = Build.VERSION_CODES.N) + private void requestGnssMeasurementUpdates() { + if (mLocationManager == null) { + return; + } + mGnssMeasurementsEventCallback = new GnssMeasurementsEvent.Callback() { + @Override + public void onGnssMeasurementsReceived(GnssMeasurementsEvent eventArgs) { + super.onGnssMeasurementsReceived(eventArgs); + try { + handleReceivedGnssMeasurements(eventArgs); + } catch (JSONException e) { + CASLog.e(TAG, "Failed to handle received gnss measurements"); + } + } + }; + mLocationManager.registerGnssMeasurementsCallback(mGnssMeasurementsEventCallback); + } + @SuppressLint("MissingPermission") public void closeLocationUpdates() { if (mLocationManager != null) { @@ -150,6 +213,16 @@ public class VirtualLocation { } } + @RequiresApi(api = Build.VERSION_CODES.N) + public void closeGnssMeasurementUpdates() { + if (mLocationManager != null) { + mLocationManager.unregisterGnssMeasurementsCallback(mGnssMeasurementsEventCallback); + } + if (mGnssMeasurementsEventCallback != null) { + mGnssMeasurementsEventCallback = null; + } + } + private String getLocationInfo(Location location) { if (location == null) { return null; @@ -223,6 +296,126 @@ public class VirtualLocation { return null; } + @RequiresApi(api = Build.VERSION_CODES.N) + private void handleReceivedGnssMeasurements(GnssMeasurementsEvent event) throws JSONException { + JSONObject gnssMesurementsJson = new JSONObject(); + + JSONObject gnssClockJsonObject = gnssClockToJsonObject(event.getClock()); + gnssMesurementsJson.put("clock", gnssClockJsonObject); + + JSONArray gnssMesurementsJsonArray = new JSONArray(); + JSONObject jsonObject; + for (GnssMeasurement measurement : event.getMeasurements()) { + jsonObject = gnssMeasurementToJsonObject(measurement); + gnssMesurementsJsonArray.put(jsonObject); + } + gnssMesurementsJson.put("measurements", gnssMesurementsJsonArray); + mGnssMeasurementsDataListener.onRecvData(gnssMesurementsJson.toString()); + } + + @RequiresApi(api = Build.VERSION_CODES.N) + private JSONObject gnssClockToJsonObject(GnssClock gnssClock) throws JSONException { + JSONObject jsonObject = new JSONObject(); + int flags = 0; + + if (gnssClock.hasLeapSecond()) { + flags = flags | HAS_LEAP_SECOND; + jsonObject.put("leapSecond", gnssClock.getLeapSecond()); + } + + jsonObject.put("timeNs", gnssClock.getTimeNanos()); + + if (gnssClock.hasTimeUncertaintyNanos()) { + flags = flags | HAS_TIME_UNCERTAINTY; + jsonObject.put("timeUncertaintyNs", gnssClock.getTimeUncertaintyNanos()); + } + + if (gnssClock.hasFullBiasNanos()) { + flags = flags | HAS_FULL_BIAS; + jsonObject.put("fullBiasNs", gnssClock.getFullBiasNanos()); + } + + if (gnssClock.hasBiasNanos()) { + flags = flags | HAS_BIAS; + jsonObject.put("biasNs", gnssClock.getBiasNanos()); + } + + if (gnssClock.hasBiasUncertaintyNanos()) { + flags = flags | HAS_BIAS_UNCERTAINTY; + jsonObject.put("biasUncertaintyNs", gnssClock.getLeapSecond()); + } + + if (gnssClock.hasDriftNanosPerSecond()) { + flags = flags | HAS_DRIFT; + jsonObject.put("driftNsps", gnssClock.getDriftNanosPerSecond()); + } + + if (gnssClock.hasDriftUncertaintyNanosPerSecond()) { + flags = flags | HAS_DRIFT_UNCERTAINTY; + jsonObject.put("driftUncertaintyNsps", gnssClock.getDriftUncertaintyNanosPerSecond()); + } + + jsonObject.put("hwClockDiscontinuityCount", gnssClock.getHardwareClockDiscontinuityCount()); + jsonObject.put("flags", flags); + return jsonObject; + } + + @RequiresApi(api = Build.VERSION_CODES.N) + private JSONObject gnssMeasurementToJsonObject(GnssMeasurement measurement) throws JSONException { + JSONObject jsonObject = new JSONObject(); + int flags = 0; + + jsonObject.put("svid", measurement.getSvid()); + jsonObject.put("constellation", measurement.getConstellationType()); + jsonObject.put("timeOffsetNs", measurement.getTimeOffsetNanos()); + jsonObject.put("state", measurement.getState()); + jsonObject.put("receivedSvTimeInNs", measurement.getReceivedSvTimeNanos()); + jsonObject.put("receivedSvTimeUncertaintyInNs", measurement.getReceivedSvTimeUncertaintyNanos()); + jsonObject.put("cN0Dbhz", measurement.getCn0DbHz()); + jsonObject.put("pseudorangeRateMps", measurement.getPseudorangeRateMetersPerSecond()); + jsonObject.put("pseudorangeRateUncertaintyMps", measurement.getPseudorangeRateUncertaintyMetersPerSecond()); + jsonObject.put("accumulatedDeltaRangeState", measurement.getAccumulatedDeltaRangeState()); + jsonObject.put("accumulatedDeltaRangeM", measurement.getAccumulatedDeltaRangeMeters()); + jsonObject.put("accumulatedDeltaRangeUncertaintyM", measurement.getAccumulatedDeltaRangeUncertaintyMeters()); + + if (measurement.hasCarrierFrequencyHz()) { + flags = flags | HAS_CARRIER_FREQUENCY; + jsonObject.put("carrierFrequencyHz", measurement.getCarrierFrequencyHz()); + } + + if (measurement.hasCarrierCycles()) { + flags = flags | HAS_CARRIER_CYCLES; + jsonObject.put("carrierCycles", measurement.getCarrierCycles()); + } + + if (measurement.hasCarrierPhase()) { + flags = flags | HAS_CARRIER_PHASE; + jsonObject.put("carrierPhase", measurement.getCarrierPhase()); + } + + if (measurement.hasCarrierPhaseUncertainty()) { + flags = flags | HAS_CARRIER_PHASE_UNCERTAINTY; + jsonObject.put("carrierPhaseUncertainty", measurement.getCarrierPhaseUncertainty()); + } + + jsonObject.put("multipathIndicator", measurement.getMultipathIndicator()); + + if (measurement.hasSnrInDb()) { + flags = flags | HAS_SNR; + jsonObject.put("snrDb", measurement.getSnrInDb()); + } + + if (SDK_INT >= Build.VERSION_CODES.O) { + if (measurement.hasAutomaticGainControlLevelDb()) { + flags = flags | HAS_AUTOMATIC_GAIN_CONTROL; + jsonObject.put("agcLevelDb", measurement.getAutomaticGainControlLevelDb()); + } + } + + jsonObject.put("flags", flags); + return jsonObject; + } + private class CellInfoData { private String cellType = ""; private int mcc = -1; diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java index 582bedf..2b267d8 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java @@ -11,6 +11,7 @@ import android.util.Log; import androidx.annotation.RequiresApi; import com.huawei.cloudphone.api.CloudPhonePermissionRequestListener; +import com.huawei.cloudphone.common.CASLog; import com.huawei.cloudphone.virtualdevice.common.IVirtualDeviceDataListener; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; @@ -20,15 +21,24 @@ public class VirtualLocationManager extends VirtualDeviceManager { public static final short OPT_LOCATION_OPEN_REQ = 0x0; public static final short OPT_LOCATION_CLOSE_REQ = 0x1; public static final short OPT_LOCATION_DATA = 0x2; + public static final short OPT_GNSS_MEASUREMENT_OPEN_REQ = 0x3; + public static final short OPT_GNSS_MEASUREMENT_CLOSE_REQ = 0x4; + public static final short OPT_GNSS_MEASUREMENT_DATA = 0x5; private VirtualLocation mVirtualLocation; private VirtualDeviceProtocol mVirtualDeviceProtocol; private CloudPhonePermissionRequestListener mPermissionListener; + private boolean mIsLocationOpen = false; + private boolean mIsGnssMeasurementOpen = false; + private static final int TYPE_LOCATION = 0; + private static final int TYPE_GNSS_MEASUREMENT = 1; + public VirtualLocationManager(VirtualDeviceProtocol virtualDeviceProtocol, Context context) { mVirtualDeviceProtocol = virtualDeviceProtocol; mVirtualLocation = new VirtualLocation(context); mVirtualLocation.registerLocationDataListener(new LocationDataListener()); + mVirtualLocation.registerGnssMeasurementsDataListener(new GnssMeasurementsDataListener()); } @Override @@ -38,11 +48,18 @@ public class VirtualLocationManager extends VirtualDeviceManager { @RequiresApi(api = Build.VERSION_CODES.P) public void init() { - mVirtualLocation.requestLocationUpdates(mPermissionListener); + if (mIsLocationOpen) { + mVirtualLocation.requestUpdates(mPermissionListener, TYPE_LOCATION); + } + if (mIsGnssMeasurementOpen) { + mVirtualLocation.requestUpdates(mPermissionListener, TYPE_GNSS_MEASUREMENT); + } } + @RequiresApi(api = Build.VERSION_CODES.N) public void stop() { mVirtualLocation.closeLocationUpdates(); + mVirtualLocation.closeGnssMeasurementUpdates(); } @RequiresApi(api = Build.VERSION_CODES.P) @@ -50,12 +67,24 @@ public class VirtualLocationManager extends VirtualDeviceManager { switch (header.mOptType) { case OPT_LOCATION_OPEN_REQ: Log.i(TAG, "processMsg: open location"); - mVirtualLocation.requestLocationUpdates(mPermissionListener); + mIsLocationOpen = true; + mVirtualLocation.requestUpdates(mPermissionListener, TYPE_LOCATION); break; case OPT_LOCATION_CLOSE_REQ: Log.i(TAG, "processMsg: close location"); + mIsLocationOpen = false; mVirtualLocation.closeLocationUpdates(); break; + case OPT_GNSS_MEASUREMENT_OPEN_REQ: + Log.i(TAG, "processMsg: open gnss measurement"); + mIsGnssMeasurementOpen = true; + mVirtualLocation.requestUpdates(mPermissionListener, TYPE_GNSS_MEASUREMENT); + break; + case OPT_GNSS_MEASUREMENT_CLOSE_REQ: + Log.i(TAG, "processMsg: close gnss measurement"); + mIsGnssMeasurementOpen = false; + mVirtualLocation.closeGnssMeasurementUpdates(); + break; default: Log.e(TAG, "processMsg: error opt type"); } @@ -67,6 +96,7 @@ public class VirtualLocationManager extends VirtualDeviceManager { String body = (String) args[0]; int type = 0; int bodyLen = body.getBytes().length; + CASLog.i(TAG, "location=" + body + " size=" + bodyLen); int rspMsgLen = bodyLen + MSG_HEADER_LEN; VirtualDeviceProtocol.MsgHeader header = new VirtualDeviceProtocol.MsgHeader(OPT_LOCATION_DATA, DEV_TYPE_LOCATION, (short) type, rspMsgLen); byte[] rspBody = new byte[bodyLen]; @@ -74,4 +104,20 @@ public class VirtualLocationManager extends VirtualDeviceManager { mVirtualDeviceProtocol.sendMsg(header, rspBody, LOCATION_DATA); } } + + class GnssMeasurementsDataListener implements IVirtualDeviceDataListener { + + @Override + public void onRecvData(Object... args) { + String body = (String) args[0]; + int type = 0; + int bodyLen = body.getBytes().length; + CASLog.i(TAG, "gnssMeasurements=" + body + " size=" + bodyLen); + int rspMsgLen = bodyLen + MSG_HEADER_LEN; + VirtualDeviceProtocol.MsgHeader header = new VirtualDeviceProtocol.MsgHeader(OPT_GNSS_MEASUREMENT_DATA, DEV_TYPE_LOCATION, (short) type, rspMsgLen); + byte[] rspBody = new byte[bodyLen]; + System.arraycopy(body.getBytes(), 0, rspBody, 0, bodyLen); + mVirtualDeviceProtocol.sendMsg(header, rspBody, LOCATION_DATA); + } + } } -- Gitee From 3361b9740d187b300533fff7fb3140911c95a0e7 Mon Sep 17 00:00:00 2001 From: CaiFeng <2397707574@qq.com> Date: Fri, 29 Mar 2024 17:37:37 +0800 Subject: [PATCH 05/20] support sensor list --- .../virtualdevice/sensor/VirtualSensor.java | 65 +++++++++++-------- .../sensor/VirtualSensorManager.java | 61 ++++++++--------- 2 files changed, 70 insertions(+), 56 deletions(-) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java index 21ce5d3..1a263e0 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java @@ -28,50 +28,75 @@ import com.huawei.cloudphone.virtualdevice.common.IVirtualDeviceDataListener; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class VirtualSensor implements SensorEventListener { private static final String TAG = "VirtualSensor"; private SensorManager mSensorManager; - private Sensor mSensor; - private Sensor mAccelerationSensor; private IVirtualDeviceDataListener mListener = null; private HandlerThread mHandlerThread; + private Handler mHandler; + private Sensor mSensor; + private Sensor mAccelerationSensor; + private boolean mIsStart = false; + private Map mSensorMap = new HashMap<>(); public VirtualSensor(SensorManager sensorManager) { mSensorManager = sensorManager; - mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); mAccelerationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); +// List sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL); +// CASLog.i(TAG, "sensor list size " + sensorList.size()); +// for (Sensor sensor : sensorList) { +// mSensorMap.put(sensor.getType(), mSensorManager.getDefaultSensor(sensor.getType())); +// } } void registerSensorDataListener(IVirtualDeviceDataListener listener) { mListener = listener; } - public void startProcess() { - Log.i(TAG, "startProcess"); + public void start() { + Log.i(TAG, "start"); if (mIsStart) { return; } mHandlerThread = new HandlerThread("sensorThread"); mHandlerThread.start(); - Handler handler = new Handler(mHandlerThread.getLooper()); - mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME, handler); - mSensorManager.registerListener(this, mAccelerationSensor, SensorManager.SENSOR_DELAY_GAME, handler); + mHandler = new Handler(mHandlerThread.getLooper()); mIsStart = true; } - public void stopProcess() { - Log.i(TAG, "stopProcess"); + public void stop() { + Log.i(TAG, "stop"); if (!mIsStart) { return; } - mSensorManager.unregisterListener(this, mSensor); - mSensorManager.unregisterListener(this, mAccelerationSensor); mHandlerThread.getLooper().quit(); mIsStart = false; } + public void startProcess(short sensorId) { + Log.i(TAG, "register sensor id " + sensorId); + if (sensorId == 1) { + mSensorManager.registerListener(this, mAccelerationSensor, SensorManager.SENSOR_DELAY_GAME, mHandler); + return; + } + mSensor = mSensorManager.getDefaultSensor(sensorId); + mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME, mHandler); + } + + public void stopProcess(short sensorId) { + Log.i(TAG, "unregister sensor id " + sensorId); + if (sensorId == 1) { + mSensorManager.unregisterListener(this, mAccelerationSensor); + } + mSensor = mSensorManager.getDefaultSensor(sensorId); + mSensorManager.unregisterListener(this, mSensor); + } + public void handleSensorInfo(VirtualDeviceProtocol.MsgHeader header, byte[] body) { CASLog.i(TAG, "payloadLength=" + header.mPayloadLength); int sensorId = header.mDeviceId; @@ -81,27 +106,13 @@ public class VirtualSensor implements SensorEventListener { CASLog.i(TAG, "sensorId=" + sensorId + " samplingPeriodUs=" + samplingPeriodUs + " maxReportLatencyUs=" + maxReportLatencyUs); } - public void handleSensorStatus(VirtualDeviceProtocol.MsgHeader header, byte[] body) { - CASLog.i(TAG, "payloadLength=" + header.mPayloadLength); - int sensorId = header.mDeviceId; - int status = (body[0] << 8) | (body[1] & 0x0FF); - CASLog.i(TAG, "sensorId=" + sensorId + " status=" + status); - } @Override public void onSensorChanged(SensorEvent sensorEvent) { if (mListener == null) { return; } - float x = sensorEvent.values[0]; - float y = sensorEvent.values[1]; - float z = sensorEvent.values[2]; - int type = sensorEvent.sensor.getType(); - if (type == Sensor.TYPE_ACCELEROMETER) { - mListener.onRecvData(x, y, z, sensorEvent.accuracy, 0); - } else if (type == Sensor.TYPE_GYROSCOPE) { - mListener.onRecvData(x, y, z, sensorEvent.accuracy, 1); - } + mListener.onRecvData(sensorEvent); } @Override diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java index 3b349a2..d191079 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java @@ -19,9 +19,11 @@ import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_SENSOR; import static com.huawei.cloudphone.jniwrapper.JNIWrapper.SENSOR_DATA; import static com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol.MSG_HEADER_LEN; +import android.hardware.SensorEvent; import android.hardware.SensorManager; import android.util.Log; +import com.huawei.cloudphone.common.CASLog; import com.huawei.cloudphone.virtualdevice.common.IVirtualDeviceDataListener; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; @@ -30,9 +32,6 @@ import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol.MsgHeade public class VirtualSensorManager extends VirtualDeviceManager { private static final String TAG = "VirtualSensorManager"; - public static final short DEV_ACCELERATION = 0x0; - public static final short DEV_GYROSCOPE = 0x1; - public static final short OPT_SENSOR_ENABLE_REQ = 0x1; public static final short OPT_SENSOR_ENABLE_RSP = 0x1001; public static final short OPT_SENSOR_DISABLE_REQ = 0x2; @@ -47,22 +46,32 @@ public class VirtualSensorManager extends VirtualDeviceManager { public VirtualSensorManager(VirtualDeviceProtocol virtualDeviceProtocol, SensorManager sensorManager) { mVirtualDeviceProtocol = virtualDeviceProtocol; mVirtualSensor = new VirtualSensor(sensorManager); + mVirtualSensor.registerSensorDataListener(new SensorDataListener()); } public void processMsg(MsgHeader header, byte[] body) { + short sensorId = header.mDeviceId; + Log.i(TAG, "processMsg: sensor id is " + sensorId); switch (header.mOptType) { case OPT_SENSOR_ENABLE_RSP: - Log.i(TAG, "processMsg: sensor enable"); -// mVirtualSensor.registerSensorDataListener(new SensorDataListener()); -// mVirtualSensor.startProcess(); + Log.i(TAG, "processMsg: sensor enable " + sensorId); + mVirtualSensor.startProcess(sensorId); break; case OPT_SENSOR_DISABLE_RSP: - Log.i(TAG, "processMsg: sensor disable"); -// mVirtualSensor.stopProcess(); + Log.i(TAG, "processMsg: sensor disable " + sensorId); + mVirtualSensor.stopProcess(sensorId); break; case OPT_SENSOR_STATUS_RSP: - Log.i(TAG, "processMsg: sensor status"); - mVirtualSensor.handleSensorStatus(header, body); + int status = (body[0] << 8) | (body[1] & 0x0FF); + Log.i(TAG, "processMsg: sensor status " + status); + MsgHeader msgHeader; + if (status != 0) { + msgHeader = new MsgHeader(OPT_SENSOR_ENABLE_REQ, DEV_TYPE_SENSOR, sensorId, MSG_HEADER_LEN); + mVirtualDeviceProtocol.sendMsg(msgHeader, null, SENSOR_DATA); + } else { + header = new MsgHeader(OPT_SENSOR_DISABLE_REQ, DEV_TYPE_SENSOR, sensorId, MSG_HEADER_LEN); + mVirtualDeviceProtocol.sendMsg(header, null, SENSOR_DATA); + } break; case OPT_SENSOR_INFO_RSP: Log.i(TAG, "processMsg: sensor info"); @@ -74,38 +83,32 @@ public class VirtualSensorManager extends VirtualDeviceManager { } public void start() { - int rspMsgLen = MSG_HEADER_LEN; - MsgHeader header = new MsgHeader(OPT_SENSOR_ENABLE_REQ, DEV_TYPE_SENSOR, DEV_GYROSCOPE, rspMsgLen); - mVirtualDeviceProtocol.sendMsg(header, null, SENSOR_DATA); - header = new MsgHeader(OPT_SENSOR_ENABLE_REQ, DEV_TYPE_SENSOR, DEV_ACCELERATION, rspMsgLen); - mVirtualDeviceProtocol.sendMsg(header, null, SENSOR_DATA); + Log.e(TAG, "start"); + mVirtualSensor.start(); } public void stop() { - mVirtualSensor.stopProcess(); - int rspMsgLen = MSG_HEADER_LEN; - MsgHeader header = new MsgHeader(OPT_SENSOR_DISABLE_REQ, DEV_TYPE_SENSOR, DEV_GYROSCOPE, rspMsgLen); - mVirtualDeviceProtocol.sendMsg(header, null, SENSOR_DATA); - header = new MsgHeader(OPT_SENSOR_DISABLE_REQ, DEV_TYPE_SENSOR, DEV_ACCELERATION, rspMsgLen); - mVirtualDeviceProtocol.sendMsg(header, null, SENSOR_DATA); + Log.e(TAG, "stop"); + mVirtualSensor.stop(); } class SensorDataListener implements IVirtualDeviceDataListener { @Override public void onRecvData(Object... args) { - String xStr = Float.valueOf((float) args[0]).toString(); - String yStr = Float.valueOf((float) args[1]).toString(); - String zStr = Float.valueOf((float) args[2]).toString(); - String accurateStr = Integer.valueOf((int) args[3]).toString(); - String body = xStr + ":" + yStr + ":" + zStr + ":" + accurateStr + ":"; - int type = (int) args[4]; + SensorEvent sensorEvent = (SensorEvent) args[0]; + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < sensorEvent.values.length; i++) { + stringBuilder.append(Float.valueOf(sensorEvent.values[i]).toString() + ":"); + } + stringBuilder.append(Integer.valueOf(sensorEvent.accuracy).toString() + ":"); + String body = stringBuilder.toString(); + int type = sensorEvent.sensor.getType(); int bodyLen = body.getBytes().length; int rspMsgLen = bodyLen + MSG_HEADER_LEN; MsgHeader header = new MsgHeader(OPT_SENSOR_DATA, DEV_TYPE_SENSOR, (short)type, rspMsgLen); byte[] rspBody = new byte[bodyLen]; System.arraycopy(body.getBytes(), 0, rspBody, 0, bodyLen); mVirtualDeviceProtocol.sendMsg(header, rspBody, SENSOR_DATA); - } } -} +} \ No newline at end of file -- Gitee From 748dcc7dc893855281db01d55e81f161d9e0e651 Mon Sep 17 00:00:00 2001 From: CaiFeng <2397707574@qq.com> Date: Sat, 30 Mar 2024 11:43:09 +0800 Subject: [PATCH 06/20] optimize location and sonsor --- .../location/VirtualLocation.java | 9 +++-- .../location/VirtualLocationManager.java | 2 -- .../virtualdevice/sensor/VirtualSensor.java | 10 ------ .../sensor/VirtualSensorManager.java | 36 +++++++++++++------ 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java index 2e6cdc7..c874ca2 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java @@ -60,6 +60,7 @@ import org.json.JSONObject; import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Collection; import java.util.List; public class VirtualLocation { @@ -305,10 +306,14 @@ public class VirtualLocation { JSONArray gnssMesurementsJsonArray = new JSONArray(); JSONObject jsonObject; - for (GnssMeasurement measurement : event.getMeasurements()) { - jsonObject = gnssMeasurementToJsonObject(measurement); + List measurements = (List) event.getMeasurements(); + // 云手机接口文档最大64个,取64个卫星,当大于64时如何选择 + int measurementCount = measurements.size() <= 64 ? measurements.size() : 64; + for (int i = 0; i < measurementCount; i++) { + jsonObject = gnssMeasurementToJsonObject(measurements.get(i)); gnssMesurementsJsonArray.put(jsonObject); } + gnssMesurementsJson.put("measurements", gnssMesurementsJsonArray); mGnssMeasurementsDataListener.onRecvData(gnssMesurementsJson.toString()); } diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java index 2b267d8..a0b78f2 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java @@ -96,7 +96,6 @@ public class VirtualLocationManager extends VirtualDeviceManager { String body = (String) args[0]; int type = 0; int bodyLen = body.getBytes().length; - CASLog.i(TAG, "location=" + body + " size=" + bodyLen); int rspMsgLen = bodyLen + MSG_HEADER_LEN; VirtualDeviceProtocol.MsgHeader header = new VirtualDeviceProtocol.MsgHeader(OPT_LOCATION_DATA, DEV_TYPE_LOCATION, (short) type, rspMsgLen); byte[] rspBody = new byte[bodyLen]; @@ -112,7 +111,6 @@ public class VirtualLocationManager extends VirtualDeviceManager { String body = (String) args[0]; int type = 0; int bodyLen = body.getBytes().length; - CASLog.i(TAG, "gnssMeasurements=" + body + " size=" + bodyLen); int rspMsgLen = bodyLen + MSG_HEADER_LEN; VirtualDeviceProtocol.MsgHeader header = new VirtualDeviceProtocol.MsgHeader(OPT_GNSS_MEASUREMENT_DATA, DEV_TYPE_LOCATION, (short) type, rspMsgLen); byte[] rspBody = new byte[bodyLen]; diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java index 1a263e0..e6d3aee 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java @@ -97,16 +97,6 @@ public class VirtualSensor implements SensorEventListener { mSensorManager.unregisterListener(this, mSensor); } - public void handleSensorInfo(VirtualDeviceProtocol.MsgHeader header, byte[] body) { - CASLog.i(TAG, "payloadLength=" + header.mPayloadLength); - int sensorId = header.mDeviceId; - CASLog.i(TAG, "body=" + Arrays.toString(body)); - long samplingPeriodUs = ((body[0] << 24) | (body[1] << 16) | (body[2] << 8) | (body[3] & 0xFF)); - long maxReportLatencyUs = ((body[4] << 24) | (body[5] << 16) | (body[6] << 8) | (body[7] & 0xFF)); - CASLog.i(TAG, "sensorId=" + sensorId + " samplingPeriodUs=" + samplingPeriodUs + " maxReportLatencyUs=" + maxReportLatencyUs); - } - - @Override public void onSensorChanged(SensorEvent sensorEvent) { if (mListener == null) { diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java index d191079..d2febe3 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java @@ -19,16 +19,20 @@ import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_SENSOR; import static com.huawei.cloudphone.jniwrapper.JNIWrapper.SENSOR_DATA; import static com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol.MSG_HEADER_LEN; +import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorManager; import android.util.Log; -import com.huawei.cloudphone.common.CASLog; import com.huawei.cloudphone.virtualdevice.common.IVirtualDeviceDataListener; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol.MsgHeader; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + public class VirtualSensorManager extends VirtualDeviceManager { private static final String TAG = "VirtualSensorManager"; @@ -40,8 +44,16 @@ public class VirtualSensorManager extends VirtualDeviceManager { public static final short OPT_SENSOR_INFO_RSP = 0x1004; public static final short OPT_SENSOR_DATA = 0x10; + private final int SENSOR_TYPE_WAKE_GESTURE = 23; + private final int SENSOR_TYPE_GLANCE_GESTURE = 24; + private final int SENSOR_TYPE_PICK_UP_GESTURE = 25; + private VirtualSensor mVirtualSensor; private VirtualDeviceProtocol mVirtualDeviceProtocol; + private Set mOneShotSet = new HashSet(Arrays.asList( + Sensor.TYPE_SIGNIFICANT_MOTION, Sensor.TYPE_STATIONARY_DETECT, Sensor.TYPE_MOTION_DETECT, + SENSOR_TYPE_WAKE_GESTURE, SENSOR_TYPE_GLANCE_GESTURE, SENSOR_TYPE_PICK_UP_GESTURE + )); public VirtualSensorManager(VirtualDeviceProtocol virtualDeviceProtocol, SensorManager sensorManager) { mVirtualDeviceProtocol = virtualDeviceProtocol; @@ -51,19 +63,18 @@ public class VirtualSensorManager extends VirtualDeviceManager { public void processMsg(MsgHeader header, byte[] body) { short sensorId = header.mDeviceId; - Log.i(TAG, "processMsg: sensor id is " + sensorId); switch (header.mOptType) { case OPT_SENSOR_ENABLE_RSP: - Log.i(TAG, "processMsg: sensor enable " + sensorId); + Log.i(TAG, "processMsg: sensor id " + sensorId + " enable"); mVirtualSensor.startProcess(sensorId); break; case OPT_SENSOR_DISABLE_RSP: - Log.i(TAG, "processMsg: sensor disable " + sensorId); + Log.i(TAG, "processMsg: sensor id " + sensorId + " disable"); mVirtualSensor.stopProcess(sensorId); break; case OPT_SENSOR_STATUS_RSP: int status = (body[0] << 8) | (body[1] & 0x0FF); - Log.i(TAG, "processMsg: sensor status " + status); + Log.i(TAG, "processMsg: sensor id " + sensorId + " status " + status); MsgHeader msgHeader; if (status != 0) { msgHeader = new MsgHeader(OPT_SENSOR_ENABLE_REQ, DEV_TYPE_SENSOR, sensorId, MSG_HEADER_LEN); @@ -73,10 +84,6 @@ public class VirtualSensorManager extends VirtualDeviceManager { mVirtualDeviceProtocol.sendMsg(header, null, SENSOR_DATA); } break; - case OPT_SENSOR_INFO_RSP: - Log.i(TAG, "processMsg: sensor info"); - mVirtualSensor.handleSensorInfo(header, body); - break; default: Log.e(TAG, "processMsg: error opt type"); } @@ -102,13 +109,20 @@ public class VirtualSensorManager extends VirtualDeviceManager { } stringBuilder.append(Integer.valueOf(sensorEvent.accuracy).toString() + ":"); String body = stringBuilder.toString(); - int type = sensorEvent.sensor.getType(); + int sensorId = sensorEvent.sensor.getType(); int bodyLen = body.getBytes().length; int rspMsgLen = bodyLen + MSG_HEADER_LEN; - MsgHeader header = new MsgHeader(OPT_SENSOR_DATA, DEV_TYPE_SENSOR, (short)type, rspMsgLen); + MsgHeader header = new MsgHeader(OPT_SENSOR_DATA, DEV_TYPE_SENSOR, (short)sensorId, rspMsgLen); byte[] rspBody = new byte[bodyLen]; System.arraycopy(body.getBytes(), 0, rspBody, 0, bodyLen); mVirtualDeviceProtocol.sendMsg(header, rspBody, SENSOR_DATA); + + // oneshot模式需主动发送0x2 + if (mOneShotSet.contains(sensorId)) { + header = new MsgHeader(OPT_SENSOR_DISABLE_REQ, DEV_TYPE_SENSOR, (short)sensorId, MSG_HEADER_LEN); + mVirtualDeviceProtocol.sendMsg(header, null, SENSOR_DATA); + mVirtualSensor.stopProcess((short)sensorId); + } } } } \ No newline at end of file -- Gitee From 3d48a655e23c5c676bd9843015555dea93f126da Mon Sep 17 00:00:00 2001 From: CaiFeng <2397707574@qq.com> Date: Sat, 30 Mar 2024 15:30:52 +0800 Subject: [PATCH 07/20] gnss type double need DecimalFormat --- .../location/VirtualLocation.java | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java index c874ca2..95c9007 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java @@ -321,6 +321,7 @@ public class VirtualLocation { @RequiresApi(api = Build.VERSION_CODES.N) private JSONObject gnssClockToJsonObject(GnssClock gnssClock) throws JSONException { JSONObject jsonObject = new JSONObject(); + DecimalFormat numberFormat = new DecimalFormat("#.#"); int flags = 0; if (gnssClock.hasLeapSecond()) { @@ -332,7 +333,7 @@ public class VirtualLocation { if (gnssClock.hasTimeUncertaintyNanos()) { flags = flags | HAS_TIME_UNCERTAINTY; - jsonObject.put("timeUncertaintyNs", gnssClock.getTimeUncertaintyNanos()); + jsonObject.put("timeUncertaintyNs", numberFormat.format(gnssClock.getTimeUncertaintyNanos())); } if (gnssClock.hasFullBiasNanos()) { @@ -342,25 +343,25 @@ public class VirtualLocation { if (gnssClock.hasBiasNanos()) { flags = flags | HAS_BIAS; - jsonObject.put("biasNs", gnssClock.getBiasNanos()); + jsonObject.put("biasNs", numberFormat.format(gnssClock.getBiasNanos())); } if (gnssClock.hasBiasUncertaintyNanos()) { flags = flags | HAS_BIAS_UNCERTAINTY; - jsonObject.put("biasUncertaintyNs", gnssClock.getLeapSecond()); + jsonObject.put("biasUncertaintyNs", numberFormat.format(gnssClock.getLeapSecond())); } if (gnssClock.hasDriftNanosPerSecond()) { flags = flags | HAS_DRIFT; - jsonObject.put("driftNsps", gnssClock.getDriftNanosPerSecond()); + jsonObject.put("driftNsps", numberFormat.format(gnssClock.getDriftNanosPerSecond())); } if (gnssClock.hasDriftUncertaintyNanosPerSecond()) { flags = flags | HAS_DRIFT_UNCERTAINTY; - jsonObject.put("driftUncertaintyNsps", gnssClock.getDriftUncertaintyNanosPerSecond()); + jsonObject.put("driftUncertaintyNsps", numberFormat.format(gnssClock.getDriftUncertaintyNanosPerSecond())); } - jsonObject.put("hwClockDiscontinuityCount", gnssClock.getHardwareClockDiscontinuityCount()); + jsonObject.put("hwClockDiscontinuityCount", numberFormat.format(gnssClock.getHardwareClockDiscontinuityCount())); jsonObject.put("flags", flags); return jsonObject; } @@ -368,24 +369,25 @@ public class VirtualLocation { @RequiresApi(api = Build.VERSION_CODES.N) private JSONObject gnssMeasurementToJsonObject(GnssMeasurement measurement) throws JSONException { JSONObject jsonObject = new JSONObject(); + DecimalFormat numberFormat = new DecimalFormat("#.#"); int flags = 0; jsonObject.put("svid", measurement.getSvid()); jsonObject.put("constellation", measurement.getConstellationType()); - jsonObject.put("timeOffsetNs", measurement.getTimeOffsetNanos()); + jsonObject.put("timeOffsetNs", numberFormat.format(measurement.getTimeOffsetNanos())); jsonObject.put("state", measurement.getState()); jsonObject.put("receivedSvTimeInNs", measurement.getReceivedSvTimeNanos()); jsonObject.put("receivedSvTimeUncertaintyInNs", measurement.getReceivedSvTimeUncertaintyNanos()); - jsonObject.put("cN0Dbhz", measurement.getCn0DbHz()); - jsonObject.put("pseudorangeRateMps", measurement.getPseudorangeRateMetersPerSecond()); - jsonObject.put("pseudorangeRateUncertaintyMps", measurement.getPseudorangeRateUncertaintyMetersPerSecond()); - jsonObject.put("accumulatedDeltaRangeState", measurement.getAccumulatedDeltaRangeState()); - jsonObject.put("accumulatedDeltaRangeM", measurement.getAccumulatedDeltaRangeMeters()); - jsonObject.put("accumulatedDeltaRangeUncertaintyM", measurement.getAccumulatedDeltaRangeUncertaintyMeters()); + jsonObject.put("cN0Dbhz", numberFormat.format(measurement.getCn0DbHz())); + jsonObject.put("pseudorangeRateMps", numberFormat.format(measurement.getPseudorangeRateMetersPerSecond())); + jsonObject.put("pseudorangeRateUncertaintyMps", numberFormat.format(measurement.getPseudorangeRateUncertaintyMetersPerSecond())); + jsonObject.put("accumulatedDeltaRangeState", numberFormat.format(measurement.getAccumulatedDeltaRangeState())); + jsonObject.put("accumulatedDeltaRangeM", numberFormat.format(measurement.getAccumulatedDeltaRangeMeters())); + jsonObject.put("accumulatedDeltaRangeUncertaintyM", numberFormat.format(measurement.getAccumulatedDeltaRangeUncertaintyMeters())); if (measurement.hasCarrierFrequencyHz()) { flags = flags | HAS_CARRIER_FREQUENCY; - jsonObject.put("carrierFrequencyHz", measurement.getCarrierFrequencyHz()); + jsonObject.put("carrierFrequencyHz", numberFormat.format(measurement.getCarrierFrequencyHz())); } if (measurement.hasCarrierCycles()) { @@ -395,25 +397,25 @@ public class VirtualLocation { if (measurement.hasCarrierPhase()) { flags = flags | HAS_CARRIER_PHASE; - jsonObject.put("carrierPhase", measurement.getCarrierPhase()); + jsonObject.put("carrierPhase", numberFormat.format(measurement.getCarrierPhase())); } if (measurement.hasCarrierPhaseUncertainty()) { flags = flags | HAS_CARRIER_PHASE_UNCERTAINTY; - jsonObject.put("carrierPhaseUncertainty", measurement.getCarrierPhaseUncertainty()); + jsonObject.put("carrierPhaseUncertainty", numberFormat.format(measurement.getCarrierPhaseUncertainty())); } jsonObject.put("multipathIndicator", measurement.getMultipathIndicator()); if (measurement.hasSnrInDb()) { flags = flags | HAS_SNR; - jsonObject.put("snrDb", measurement.getSnrInDb()); + jsonObject.put("snrDb", numberFormat.format(measurement.getSnrInDb())); } if (SDK_INT >= Build.VERSION_CODES.O) { if (measurement.hasAutomaticGainControlLevelDb()) { flags = flags | HAS_AUTOMATIC_GAIN_CONTROL; - jsonObject.put("agcLevelDb", measurement.getAutomaticGainControlLevelDb()); + jsonObject.put("agcLevelDb", numberFormat.format(measurement.getAutomaticGainControlLevelDb())); } } -- Gitee From 15b68d0cea52491db8b3ad1f4c292d38bddafce4 Mon Sep 17 00:00:00 2001 From: CaiFeng <2397707574@qq.com> Date: Sun, 7 Apr 2024 14:26:48 +0800 Subject: [PATCH 08/20] add sdcard permission --- app/src/main/AndroidManifest.xml | 1 + .../java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java | 2 +- .../java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cd94b90..a0492d3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java index a39c376..b29059f 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java @@ -118,7 +118,7 @@ public class CasCloudDebugActivity extends Activity { connectorInfo.setSessionId(sessionId); connectorInfo.setTicket("ticket_xxxxxx"); // 32位16进制数,测试使用 - connectorInfo.setAesKey("a6b0986c973f4dbf9015b8f07c1f4524"); + connectorInfo.setAesKey("78e36c43a4ac45afa03a9863ccae1c4e"); connectorInfo.setAuthTs("987654321"); connectorInfo.setTouchTimeout("0"); return connectorInfo; diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java index 1db0370..7273a46 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java @@ -16,6 +16,7 @@ package com.huawei.cloudapp.ui; +import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.ClipData; @@ -28,6 +29,7 @@ import android.content.pm.PackageManager; import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; +import android.os.Environment; import android.os.Handler; import android.os.Message; @@ -313,6 +315,9 @@ public class CasCloudPhoneActivity extends FragmentActivity { parasMap.put(USER_ID, mConnectInfo.getUserId()); parasMap.put(TOUCH_TIMEOUT, mConnectInfo.getTouchTimeout()); mCloudPhone.startCloudPhone(this, mFrameLayout, parasMap); + CASLog.e(TAG, "begin to request permission."); + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); + CASLog.e(TAG, "end to request permission."); } else { Gson gson = new Gson(); HashMap requestBody = new HashMap(); -- Gitee From 694105bef53321d7ce610d03c7b69b6d0f77f895 Mon Sep 17 00:00:00 2001 From: CaiFeng <2397707574@qq.com> Date: Sun, 7 Apr 2024 18:57:54 +0800 Subject: [PATCH 09/20] fix sensor size --- .../main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java | 2 +- .../virtualdevice/location/VirtualLocationManager.java | 2 ++ .../cloudphone/virtualdevice/sensor/VirtualSensorManager.java | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java index b29059f..a39c376 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java @@ -118,7 +118,7 @@ public class CasCloudDebugActivity extends Activity { connectorInfo.setSessionId(sessionId); connectorInfo.setTicket("ticket_xxxxxx"); // 32位16进制数,测试使用 - connectorInfo.setAesKey("78e36c43a4ac45afa03a9863ccae1c4e"); + connectorInfo.setAesKey("a6b0986c973f4dbf9015b8f07c1f4524"); connectorInfo.setAuthTs("987654321"); connectorInfo.setTouchTimeout("0"); return connectorInfo; diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java index a0b78f2..fc778f6 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java @@ -97,6 +97,7 @@ public class VirtualLocationManager extends VirtualDeviceManager { int type = 0; int bodyLen = body.getBytes().length; int rspMsgLen = bodyLen + MSG_HEADER_LEN; + CASLog.i(TAG, "location bodyLen=" + bodyLen + " body=" + body); VirtualDeviceProtocol.MsgHeader header = new VirtualDeviceProtocol.MsgHeader(OPT_LOCATION_DATA, DEV_TYPE_LOCATION, (short) type, rspMsgLen); byte[] rspBody = new byte[bodyLen]; System.arraycopy(body.getBytes(), 0, rspBody, 0, bodyLen); @@ -112,6 +113,7 @@ public class VirtualLocationManager extends VirtualDeviceManager { int type = 0; int bodyLen = body.getBytes().length; int rspMsgLen = bodyLen + MSG_HEADER_LEN; + CASLog.i(TAG, "gnss bodyLen=" + bodyLen + " body=" + body); VirtualDeviceProtocol.MsgHeader header = new VirtualDeviceProtocol.MsgHeader(OPT_GNSS_MEASUREMENT_DATA, DEV_TYPE_LOCATION, (short) type, rspMsgLen); byte[] rspBody = new byte[bodyLen]; System.arraycopy(body.getBytes(), 0, rspBody, 0, bodyLen); diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java index d2febe3..48b9c7d 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java @@ -24,6 +24,7 @@ import android.hardware.SensorEvent; import android.hardware.SensorManager; import android.util.Log; +import com.huawei.cloudphone.common.CASLog; import com.huawei.cloudphone.virtualdevice.common.IVirtualDeviceDataListener; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; @@ -112,6 +113,7 @@ public class VirtualSensorManager extends VirtualDeviceManager { int sensorId = sensorEvent.sensor.getType(); int bodyLen = body.getBytes().length; int rspMsgLen = bodyLen + MSG_HEADER_LEN; + CASLog.i(TAG, "sensorid=" + sensorId + " bodyLen=" + bodyLen + " body=" + body); MsgHeader header = new MsgHeader(OPT_SENSOR_DATA, DEV_TYPE_SENSOR, (short)sensorId, rspMsgLen); byte[] rspBody = new byte[bodyLen]; System.arraycopy(body.getBytes(), 0, rspBody, 0, bodyLen); -- Gitee From b6e87e6a640cbc72cfd5ba2fee021e58376e8cce Mon Sep 17 00:00:00 2001 From: CaiFeng <2397707574@qq.com> Date: Mon, 8 Apr 2024 23:27:41 +0800 Subject: [PATCH 10/20] fix gnss data format --- .../location/VirtualLocation.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java index 95c9007..c687222 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java @@ -321,7 +321,6 @@ public class VirtualLocation { @RequiresApi(api = Build.VERSION_CODES.N) private JSONObject gnssClockToJsonObject(GnssClock gnssClock) throws JSONException { JSONObject jsonObject = new JSONObject(); - DecimalFormat numberFormat = new DecimalFormat("#.#"); int flags = 0; if (gnssClock.hasLeapSecond()) { @@ -333,7 +332,7 @@ public class VirtualLocation { if (gnssClock.hasTimeUncertaintyNanos()) { flags = flags | HAS_TIME_UNCERTAINTY; - jsonObject.put("timeUncertaintyNs", numberFormat.format(gnssClock.getTimeUncertaintyNanos())); + jsonObject.put("timeUncertaintyNs", gnssClock.getTimeUncertaintyNanos()); } if (gnssClock.hasFullBiasNanos()) { @@ -343,25 +342,25 @@ public class VirtualLocation { if (gnssClock.hasBiasNanos()) { flags = flags | HAS_BIAS; - jsonObject.put("biasNs", numberFormat.format(gnssClock.getBiasNanos())); + jsonObject.put("biasNs", gnssClock.getBiasNanos()); } if (gnssClock.hasBiasUncertaintyNanos()) { flags = flags | HAS_BIAS_UNCERTAINTY; - jsonObject.put("biasUncertaintyNs", numberFormat.format(gnssClock.getLeapSecond())); + jsonObject.put("biasUncertaintyNs", gnssClock.getLeapSecond()); } if (gnssClock.hasDriftNanosPerSecond()) { flags = flags | HAS_DRIFT; - jsonObject.put("driftNsps", numberFormat.format(gnssClock.getDriftNanosPerSecond())); + jsonObject.put("driftNsps", gnssClock.getDriftNanosPerSecond()); } if (gnssClock.hasDriftUncertaintyNanosPerSecond()) { flags = flags | HAS_DRIFT_UNCERTAINTY; - jsonObject.put("driftUncertaintyNsps", numberFormat.format(gnssClock.getDriftUncertaintyNanosPerSecond())); + jsonObject.put("driftUncertaintyNsps", gnssClock.getDriftUncertaintyNanosPerSecond()); } - jsonObject.put("hwClockDiscontinuityCount", numberFormat.format(gnssClock.getHardwareClockDiscontinuityCount())); + jsonObject.put("hwClockDiscontinuityCount", gnssClock.getHardwareClockDiscontinuityCount()); jsonObject.put("flags", flags); return jsonObject; } @@ -369,25 +368,25 @@ public class VirtualLocation { @RequiresApi(api = Build.VERSION_CODES.N) private JSONObject gnssMeasurementToJsonObject(GnssMeasurement measurement) throws JSONException { JSONObject jsonObject = new JSONObject(); - DecimalFormat numberFormat = new DecimalFormat("#.#"); int flags = 0; jsonObject.put("svid", measurement.getSvid()); jsonObject.put("constellation", measurement.getConstellationType()); - jsonObject.put("timeOffsetNs", numberFormat.format(measurement.getTimeOffsetNanos())); + jsonObject.put("timeOffsetNs", measurement.getTimeOffsetNanos()); + jsonObject.put("timeOffsetNs", measurement.getTimeOffsetNanos()); jsonObject.put("state", measurement.getState()); jsonObject.put("receivedSvTimeInNs", measurement.getReceivedSvTimeNanos()); jsonObject.put("receivedSvTimeUncertaintyInNs", measurement.getReceivedSvTimeUncertaintyNanos()); - jsonObject.put("cN0Dbhz", numberFormat.format(measurement.getCn0DbHz())); - jsonObject.put("pseudorangeRateMps", numberFormat.format(measurement.getPseudorangeRateMetersPerSecond())); - jsonObject.put("pseudorangeRateUncertaintyMps", numberFormat.format(measurement.getPseudorangeRateUncertaintyMetersPerSecond())); - jsonObject.put("accumulatedDeltaRangeState", numberFormat.format(measurement.getAccumulatedDeltaRangeState())); - jsonObject.put("accumulatedDeltaRangeM", numberFormat.format(measurement.getAccumulatedDeltaRangeMeters())); - jsonObject.put("accumulatedDeltaRangeUncertaintyM", numberFormat.format(measurement.getAccumulatedDeltaRangeUncertaintyMeters())); + jsonObject.put("cN0Dbhz", measurement.getCn0DbHz()); + jsonObject.put("pseudorangeRateMps", measurement.getPseudorangeRateMetersPerSecond()); + jsonObject.put("pseudorangeRateUncertaintyMps", measurement.getPseudorangeRateUncertaintyMetersPerSecond()); + jsonObject.put("accumulatedDeltaRangeState", measurement.getAccumulatedDeltaRangeState()); + jsonObject.put("accumulatedDeltaRangeM", measurement.getAccumulatedDeltaRangeMeters()); + jsonObject.put("accumulatedDeltaRangeUncertaintyM", measurement.getAccumulatedDeltaRangeUncertaintyMeters()); if (measurement.hasCarrierFrequencyHz()) { flags = flags | HAS_CARRIER_FREQUENCY; - jsonObject.put("carrierFrequencyHz", numberFormat.format(measurement.getCarrierFrequencyHz())); + jsonObject.put("carrierFrequencyHz", measurement.getCarrierFrequencyHz()); } if (measurement.hasCarrierCycles()) { @@ -397,25 +396,25 @@ public class VirtualLocation { if (measurement.hasCarrierPhase()) { flags = flags | HAS_CARRIER_PHASE; - jsonObject.put("carrierPhase", numberFormat.format(measurement.getCarrierPhase())); + jsonObject.put("carrierPhase", measurement.getCarrierPhase()); } if (measurement.hasCarrierPhaseUncertainty()) { flags = flags | HAS_CARRIER_PHASE_UNCERTAINTY; - jsonObject.put("carrierPhaseUncertainty", numberFormat.format(measurement.getCarrierPhaseUncertainty())); + jsonObject.put("carrierPhaseUncertainty", measurement.getCarrierPhaseUncertainty()); } jsonObject.put("multipathIndicator", measurement.getMultipathIndicator()); if (measurement.hasSnrInDb()) { flags = flags | HAS_SNR; - jsonObject.put("snrDb", numberFormat.format(measurement.getSnrInDb())); + jsonObject.put("snrDb", measurement.getSnrInDb()); } if (SDK_INT >= Build.VERSION_CODES.O) { if (measurement.hasAutomaticGainControlLevelDb()) { flags = flags | HAS_AUTOMATIC_GAIN_CONTROL; - jsonObject.put("agcLevelDb", numberFormat.format(measurement.getAutomaticGainControlLevelDb())); + jsonObject.put("agcLevelDb", measurement.getAutomaticGainControlLevelDb()); } } -- Gitee From 68bbdb46f9868fad28655232f86338eaf65be654 Mon Sep 17 00:00:00 2001 From: CaiFeng <2397707574@qq.com> Date: Fri, 19 Apr 2024 09:54:10 +0800 Subject: [PATCH 11/20] support touch switch to mright --- .../cloudphone/virtualdevice/location/VirtualLocation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java index c687222..37c25c4 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java @@ -347,7 +347,7 @@ public class VirtualLocation { if (gnssClock.hasBiasUncertaintyNanos()) { flags = flags | HAS_BIAS_UNCERTAINTY; - jsonObject.put("biasUncertaintyNs", gnssClock.getLeapSecond()); + jsonObject.put("biasUncertaintyNs", gnssClock.getBiasUncertaintyNanos()); } if (gnssClock.hasDriftNanosPerSecond()) { -- Gitee From 5ca54d493d01c69b97e89db3a4b3cd2f9ebfbef2 Mon Sep 17 00:00:00 2001 From: CaiFeng <2397707574@qq.com> Date: Mon, 22 Apr 2024 14:44:23 +0800 Subject: [PATCH 12/20] support fec --- .../location/VirtualLocation.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java index 37c25c4..f8fe2ae 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java @@ -320,6 +320,7 @@ public class VirtualLocation { @RequiresApi(api = Build.VERSION_CODES.N) private JSONObject gnssClockToJsonObject(GnssClock gnssClock) throws JSONException { + DecimalFormat numberFormat = new DecimalFormat("#.#"); JSONObject jsonObject = new JSONObject(); int flags = 0; @@ -332,7 +333,8 @@ public class VirtualLocation { if (gnssClock.hasTimeUncertaintyNanos()) { flags = flags | HAS_TIME_UNCERTAINTY; - jsonObject.put("timeUncertaintyNs", gnssClock.getTimeUncertaintyNanos()); +// jsonObject.put("timeUncertaintyNs", numberFormat.format(gnssClock.getTimeUncertaintyNanos())); + jsonObject.put("timeUncertaintyNs", gnssClock.getTimeUncertaintyNanos()); } if (gnssClock.hasFullBiasNanos()) { @@ -342,21 +344,25 @@ public class VirtualLocation { if (gnssClock.hasBiasNanos()) { flags = flags | HAS_BIAS; +// jsonObject.put("biasNs", numberFormat.format(gnssClock.getBiasNanos())); jsonObject.put("biasNs", gnssClock.getBiasNanos()); } if (gnssClock.hasBiasUncertaintyNanos()) { flags = flags | HAS_BIAS_UNCERTAINTY; +// jsonObject.put("biasUncertaintyNs", numberFormat.format(gnssClock.getBiasUncertaintyNanos())); jsonObject.put("biasUncertaintyNs", gnssClock.getBiasUncertaintyNanos()); } if (gnssClock.hasDriftNanosPerSecond()) { flags = flags | HAS_DRIFT; +// jsonObject.put("driftNsps", numberFormat.format(gnssClock.getDriftNanosPerSecond())); jsonObject.put("driftNsps", gnssClock.getDriftNanosPerSecond()); } if (gnssClock.hasDriftUncertaintyNanosPerSecond()) { flags = flags | HAS_DRIFT_UNCERTAINTY; +// jsonObject.put("driftUncertaintyNsps", numberFormat.format(gnssClock.getDriftUncertaintyNanosPerSecond())); jsonObject.put("driftUncertaintyNsps", gnssClock.getDriftUncertaintyNanosPerSecond()); } @@ -367,25 +373,35 @@ public class VirtualLocation { @RequiresApi(api = Build.VERSION_CODES.N) private JSONObject gnssMeasurementToJsonObject(GnssMeasurement measurement) throws JSONException { + DecimalFormat numberFormat = new DecimalFormat("#.#"); JSONObject jsonObject = new JSONObject(); int flags = 0; jsonObject.put("svid", measurement.getSvid()); jsonObject.put("constellation", measurement.getConstellationType()); - jsonObject.put("timeOffsetNs", measurement.getTimeOffsetNanos()); +// jsonObject.put("timeOffsetNs", numberFormat.format(measurement.getTimeOffsetNanos())); jsonObject.put("timeOffsetNs", measurement.getTimeOffsetNanos()); jsonObject.put("state", measurement.getState()); jsonObject.put("receivedSvTimeInNs", measurement.getReceivedSvTimeNanos()); jsonObject.put("receivedSvTimeUncertaintyInNs", measurement.getReceivedSvTimeUncertaintyNanos()); +// jsonObject.put("cN0Dbhz", numberFormat.format(measurement.getCn0DbHz())); +// jsonObject.put("pseudorangeRateMps", numberFormat.format(measurement.getPseudorangeRateMetersPerSecond())); +// jsonObject.put("pseudorangeRateUncertaintyMps", numberFormat.format(measurement.getPseudorangeRateUncertaintyMetersPerSecond())); + jsonObject.put("cN0Dbhz", measurement.getCn0DbHz()); jsonObject.put("pseudorangeRateMps", measurement.getPseudorangeRateMetersPerSecond()); jsonObject.put("pseudorangeRateUncertaintyMps", measurement.getPseudorangeRateUncertaintyMetersPerSecond()); + jsonObject.put("accumulatedDeltaRangeState", measurement.getAccumulatedDeltaRangeState()); +// jsonObject.put("accumulatedDeltaRangeM", numberFormat.format(measurement.getAccumulatedDeltaRangeMeters())); +// jsonObject.put("accumulatedDeltaRangeUncertaintyM", numberFormat.format(measurement.getAccumulatedDeltaRangeUncertaintyMeters())); + jsonObject.put("accumulatedDeltaRangeM", measurement.getAccumulatedDeltaRangeMeters()); jsonObject.put("accumulatedDeltaRangeUncertaintyM", measurement.getAccumulatedDeltaRangeUncertaintyMeters()); if (measurement.hasCarrierFrequencyHz()) { flags = flags | HAS_CARRIER_FREQUENCY; +// jsonObject.put("carrierFrequencyHz", numberFormat.format(measurement.getCarrierFrequencyHz())); jsonObject.put("carrierFrequencyHz", measurement.getCarrierFrequencyHz()); } @@ -396,11 +412,13 @@ public class VirtualLocation { if (measurement.hasCarrierPhase()) { flags = flags | HAS_CARRIER_PHASE; +// jsonObject.put("carrierPhase", numberFormat.format(measurement.getCarrierPhase())); jsonObject.put("carrierPhase", measurement.getCarrierPhase()); } if (measurement.hasCarrierPhaseUncertainty()) { flags = flags | HAS_CARRIER_PHASE_UNCERTAINTY; +// jsonObject.put("carrierPhaseUncertainty", numberFormat.format(measurement.getCarrierPhaseUncertainty())); jsonObject.put("carrierPhaseUncertainty", measurement.getCarrierPhaseUncertainty()); } @@ -408,12 +426,14 @@ public class VirtualLocation { if (measurement.hasSnrInDb()) { flags = flags | HAS_SNR; +// jsonObject.put("snrDb", numberFormat.format(measurement.getSnrInDb())); jsonObject.put("snrDb", measurement.getSnrInDb()); } if (SDK_INT >= Build.VERSION_CODES.O) { if (measurement.hasAutomaticGainControlLevelDb()) { flags = flags | HAS_AUTOMATIC_GAIN_CONTROL; +// jsonObject.put("agcLevelDb", numberFormat.format(measurement.getAutomaticGainControlLevelDb())); jsonObject.put("agcLevelDb", measurement.getAutomaticGainControlLevelDb()); } } -- Gitee From 782d16c249986bb3c710d7b599f87c73d206d05d Mon Sep 17 00:00:00 2001 From: Kobetao <15503630572@163.com> Date: Fri, 31 May 2024 11:46:02 +0800 Subject: [PATCH 13/20] support gnss by struct --- .../location/VirtualLocation.java | 149 +++++++++++++++++- .../location/VirtualLocationManager.java | 13 +- 2 files changed, 157 insertions(+), 5 deletions(-) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java index f8fe2ae..1b2d53e 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java @@ -45,6 +45,7 @@ import android.telephony.CellInfoGsm; import android.telephony.CellInfoLte; import android.telephony.CellInfoWcdma; import android.telephony.TelephonyManager; +import android.util.Log; import androidx.annotation.RequiresApi; import androidx.core.app.ActivityCompat; @@ -58,8 +59,11 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -315,7 +319,9 @@ public class VirtualLocation { } gnssMesurementsJson.put("measurements", gnssMesurementsJsonArray); - mGnssMeasurementsDataListener.onRecvData(gnssMesurementsJson.toString()); + // Log.i(TAG,"jwt gnssMesurementsJson:" + gnssMesurementsJson.toString()); + mGnssMeasurementsDataListener.onRecvData(getData(event)); + //mGnssMeasurementsDataListener.onRecvData(gnssMesurementsJson.toString()); } @RequiresApi(api = Build.VERSION_CODES.N) @@ -371,6 +377,110 @@ public class VirtualLocation { return jsonObject; } + private static boolean DEBUG = true; + + @RequiresApi(api = Build.VERSION_CODES.N) + private static void gnssMeasurementData(ByteBuffer buffer, GnssMeasurement measurement) { + int flags = 0; + + if (measurement.hasCarrierFrequencyHz()) { + flags = flags | HAS_CARRIER_FREQUENCY; + } + + if (measurement.hasCarrierCycles()) { + flags = flags | HAS_CARRIER_CYCLES; + } + + if (measurement.hasCarrierPhase()) { + flags = flags | HAS_CARRIER_PHASE; + } + + if (measurement.hasCarrierPhaseUncertainty()) { + flags = flags | HAS_CARRIER_PHASE_UNCERTAINTY; + } + + if (measurement.hasSnrInDb()) { + flags = flags | HAS_SNR; + } + + if (SDK_INT >= Build.VERSION_CODES.O) { + if (measurement.hasAutomaticGainControlLevelDb()) { + flags = flags | HAS_AUTOMATIC_GAIN_CONTROL; + } + } + + buffer.putInt((short) flags); + buffer.putShort((short) measurement.getSvid()); + buffer.put((byte) measurement.getConstellationType()); + buffer.putDouble(measurement.getTimeOffsetNanos()); + buffer.putInt(measurement.getState()); + buffer.putLong(measurement.getReceivedSvTimeNanos()); + buffer.putLong(measurement.getReceivedSvTimeUncertaintyNanos()); + buffer.putDouble(measurement.getCn0DbHz()); + buffer.putDouble(measurement.getPseudorangeRateMetersPerSecond()); + buffer.putDouble(measurement.getPseudorangeRateUncertaintyMetersPerSecond()); + buffer.putShort((short) measurement.getAccumulatedDeltaRangeState()); + buffer.putDouble(measurement.getAccumulatedDeltaRangeMeters()); + buffer.putDouble(measurement.getAccumulatedDeltaRangeUncertaintyMeters()); + buffer.putFloat(measurement.getCarrierFrequencyHz()); + buffer.putLong(measurement.getCarrierCycles()); + buffer.putDouble(measurement.getCarrierPhase()); + buffer.putDouble(measurement.getCarrierPhaseUncertainty()); + buffer.put((byte) measurement.getMultipathIndicator()); + buffer.putDouble(measurement.getSnrInDb()); + // buffer.putDouble(measurement.getAutomaticGainControlLevelDb()); + if (DEBUG) + Log.i(TAG, "@@tm@@ " + buffer.position() + " =====>:" + Arrays.toString(buffer.array())); + DEBUG = false; + } + + @RequiresApi(api = Build.VERSION_CODES.N) + private static void gnssClockData(ByteBuffer buffer, GnssClock gnssClock) { + int flags = 0; + + if (gnssClock.hasLeapSecond()) { + flags = flags | HAS_LEAP_SECOND; + } + + if (gnssClock.hasTimeUncertaintyNanos()) { + flags = flags | HAS_TIME_UNCERTAINTY; + } + + if (gnssClock.hasFullBiasNanos()) { + flags = flags | HAS_FULL_BIAS; + } + + if (gnssClock.hasBiasNanos()) { + flags = flags | HAS_BIAS; + } + + if (gnssClock.hasBiasUncertaintyNanos()) { + flags = flags | HAS_BIAS_UNCERTAINTY; + } + + if (gnssClock.hasDriftNanosPerSecond()) { + flags = flags | HAS_DRIFT; + } + + if (gnssClock.hasDriftUncertaintyNanosPerSecond()) { + flags = flags | HAS_DRIFT_UNCERTAINTY; + } + + buffer.putShort((short) flags); + buffer.putShort((short) gnssClock.getLeapSecond()); + buffer.putLong(gnssClock.getTimeNanos()); + buffer.putDouble(gnssClock.getTimeUncertaintyNanos()); + buffer.putLong(gnssClock.getFullBiasNanos()); + buffer.putDouble(gnssClock.getBiasNanos()); + buffer.putDouble(gnssClock.getLeapSecond()); + buffer.putDouble(gnssClock.getDriftNanosPerSecond()); + buffer.putDouble(gnssClock.getDriftUncertaintyNanosPerSecond()); + buffer.putInt(gnssClock.getHardwareClockDiscontinuityCount()); + //buffer.putInt(140); + if (DEBUG) + Log.i(TAG, "@@tm@@ " + buffer.position() + " =====>:" + Arrays.toString(buffer.array())); + } + @RequiresApi(api = Build.VERSION_CODES.N) private JSONObject gnssMeasurementToJsonObject(GnssMeasurement measurement) throws JSONException { DecimalFormat numberFormat = new DecimalFormat("#.#"); @@ -441,6 +551,43 @@ public class VirtualLocation { jsonObject.put("flags", flags); return jsonObject; } + + public static String byteArrayToString(byte[] byteArray) { + StringBuilder sb = new StringBuilder(); + for (byte b : byteArray) { + sb.append(String.format("%02X ", b)); + } + return sb.toString().trim(); + } + @RequiresApi(api = Build.VERSION_CODES.N) + public static ByteBuffer getData(GnssMeasurementsEvent event) { + // 创建ByteBuffer,大小为结构体的字节数 + ByteBuffer buffer = ByteBuffer.allocate(7896); + + // 设置字节序为小端序(与packed属性相对应) + buffer.order(ByteOrder.BIG_ENDIAN); + gnssClockData(buffer, event.getClock()); +/* byte[] data = new byte[buffer.position()]; + System.arraycopy(buffer.array(),0,data,0,data.length); + CASLog.i(TAG, "jwt gnssClockData ===> %s",byteArrayToString(data));*/ + buffer.put((byte) event.getMeasurements().size()); + int x = (byte) event.getMeasurements().size(); + CASLog.i(TAG, "jwt event.getMeasurements().size()=%d", x); + + for (GnssMeasurement measurement : event.getMeasurements()) { + byte Constellation = (byte)measurement.getConstellationType(); + int svid = measurement.getSvid(); + double pseudorangeRateMps = measurement.getPseudorangeRateMetersPerSecond(); + long receivedSvTimeInNs = measurement.getReceivedSvTimeNanos(); + short accumulatedDeltaRangeState = (short)measurement.getAccumulatedDeltaRangeState(); + int state = measurement.getState(); + //CASLog.i(TAG, "jwt Constellation=%d", Constellation); + CASLog.i(TAG, "jwt svid=%d, Constellation=%d, pseudorangeRateMps=%f, receivedSvTimeInNs=%d, accumulatedDeltaRangeState=%d, state=%d " + + "",svid , Constellation, pseudorangeRateMps, receivedSvTimeInNs, accumulatedDeltaRangeState, state); + gnssMeasurementData(buffer, measurement); + } + return buffer; + } private class CellInfoData { private String cellType = ""; diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java index fc778f6..2fda54c 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java @@ -15,6 +15,7 @@ import com.huawei.cloudphone.common.CASLog; import com.huawei.cloudphone.virtualdevice.common.IVirtualDeviceDataListener; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; +import java.nio.ByteBuffer; public class VirtualLocationManager extends VirtualDeviceManager { private static final String TAG = "VirtualLocationManager"; @@ -64,6 +65,7 @@ public class VirtualLocationManager extends VirtualDeviceManager { @RequiresApi(api = Build.VERSION_CODES.P) public void processMsg(VirtualDeviceProtocol.MsgHeader header, byte[] body) { + Log.i(TAG,"processMsg:" + header); switch (header.mOptType) { case OPT_LOCATION_OPEN_REQ: Log.i(TAG, "processMsg: open location"); @@ -109,14 +111,17 @@ public class VirtualLocationManager extends VirtualDeviceManager { @Override public void onRecvData(Object... args) { - String body = (String) args[0]; +// String body = (String) args[0]; int type = 0; - int bodyLen = body.getBytes().length; +// int bodyLen = body.getBytes().length; + ByteBuffer body = (ByteBuffer) args[0]; + int bodyLen = body.position(); + CASLog.i(TAG, "gnssMeasurements size=" + bodyLen); int rspMsgLen = bodyLen + MSG_HEADER_LEN; - CASLog.i(TAG, "gnss bodyLen=" + bodyLen + " body=" + body); VirtualDeviceProtocol.MsgHeader header = new VirtualDeviceProtocol.MsgHeader(OPT_GNSS_MEASUREMENT_DATA, DEV_TYPE_LOCATION, (short) type, rspMsgLen); byte[] rspBody = new byte[bodyLen]; - System.arraycopy(body.getBytes(), 0, rspBody, 0, bodyLen); + System.arraycopy(body.array(), 0, rspBody, 0, bodyLen); +// System.arraycopy(body.getBytes(), 0, rspBody, 0, bodyLen); mVirtualDeviceProtocol.sendMsg(header, rspBody, LOCATION_DATA); } } -- Gitee From e1959fcddca12ff4a1a621b7da0ec64c88aa46f4 Mon Sep 17 00:00:00 2001 From: Kobetao <15503630572@163.com> Date: Sat, 1 Jun 2024 16:53:12 +0800 Subject: [PATCH 14/20] support gnss by struct fix1 --- app/build.gradle | 2 +- .../huawei/cloudapp/ui/CasCloudDebugActivity.java | 2 +- .../huawei/cloudapp/ui/CasCloudPhoneActivity.java | 2 +- .../huawei/cloudphone/service/CasProcessor.java | 1 + .../virtualdevice/location/VirtualLocation.java | 15 +++++++++++---- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4c0274f..55292f6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -74,7 +74,7 @@ dependencies { implementation 'androidx.cardview:cardview:1.0.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.14.0' implementation 'com.hyman:flowlayout-lib:1.1.2' - implementation 'com.github.Petterpx:FloatingX:1.3.3' + // implementation 'com.github.Petterpx:FloatingX:1.3.3' implementation 'com.android.support:design:28.0.0' implementation 'com.github.shem8:material-login:2.1.1' implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java index a39c376..63994e3 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java @@ -118,7 +118,7 @@ public class CasCloudDebugActivity extends Activity { connectorInfo.setSessionId(sessionId); connectorInfo.setTicket("ticket_xxxxxx"); // 32位16进制数,测试使用 - connectorInfo.setAesKey("a6b0986c973f4dbf9015b8f07c1f4524"); + connectorInfo.setAesKey("d252bf88dccf4affa7c490f707a37dd2"); connectorInfo.setAuthTs("987654321"); connectorInfo.setTouchTimeout("0"); return connectorInfo; diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java index 7273a46..b04fc89 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java @@ -919,7 +919,7 @@ public class CasCloudPhoneActivity extends FragmentActivity { connectorInfo.setSessionId(sessionId); connectorInfo.setTicket("ticket_xxxxxx"); // 32位16进制数,测试使用 - connectorInfo.setAesKey("11111111111111111111111111111111"); + connectorInfo.setAesKey("d252bf88dccf4affa7c490f707a37dd2"); connectorInfo.setAuthTs("987654321"); connectorInfo.setTouchTimeout(touchTimeout.isEmpty() ? "0" : touchTimeout); return connectorInfo; diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/service/CasProcessor.java b/cloudphone/src/main/java/com/huawei/cloudphone/service/CasProcessor.java index 1185123..24e25d9 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/service/CasProcessor.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/service/CasProcessor.java @@ -285,6 +285,7 @@ public class CasProcessor { jsonObj.put("user_id", connectorInfo.getUserId()); jsonObj.put("touch_timeout", connectorInfo.getTouchTimeout()); // 加密信息 + CASLog.i(TAG, "aeskey = " + connectorInfo.getAesKey()); String encryptedData = CasAESUtils.encryptWithAESGCM(jsonObj.toString(), connectorInfo.getAesKey(), connectorInfo.getAesIv()); return encryptedData; } diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java index 1b2d53e..be16ea4 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java @@ -430,7 +430,7 @@ public class VirtualLocation { buffer.putDouble(measurement.getSnrInDb()); // buffer.putDouble(measurement.getAutomaticGainControlLevelDb()); if (DEBUG) - Log.i(TAG, "@@tm@@ " + buffer.position() + " =====>:" + Arrays.toString(buffer.array())); + Log.i(TAG, "taotao" + buffer.position() + " =====>:" + Arrays.toString(buffer.array())); DEBUG = false; } @@ -478,7 +478,7 @@ public class VirtualLocation { buffer.putInt(gnssClock.getHardwareClockDiscontinuityCount()); //buffer.putInt(140); if (DEBUG) - Log.i(TAG, "@@tm@@ " + buffer.position() + " =====>:" + Arrays.toString(buffer.array())); + Log.i(TAG, "taotao" + buffer.position() + " =====>:" + Arrays.toString(buffer.array())); } @RequiresApi(api = Build.VERSION_CODES.N) @@ -574,17 +574,24 @@ public class VirtualLocation { int x = (byte) event.getMeasurements().size(); CASLog.i(TAG, "jwt event.getMeasurements().size()=%d", x); + int measurementCount = 1; for (GnssMeasurement measurement : event.getMeasurements()) { + if (measurementCount > 64){ + break; + } + byte Constellation = (byte)measurement.getConstellationType(); int svid = measurement.getSvid(); double pseudorangeRateMps = measurement.getPseudorangeRateMetersPerSecond(); long receivedSvTimeInNs = measurement.getReceivedSvTimeNanos(); short accumulatedDeltaRangeState = (short)measurement.getAccumulatedDeltaRangeState(); int state = measurement.getState(); + float carrierFrequencyHz= measurement.getCarrierFrequencyHz(); //CASLog.i(TAG, "jwt Constellation=%d", Constellation); - CASLog.i(TAG, "jwt svid=%d, Constellation=%d, pseudorangeRateMps=%f, receivedSvTimeInNs=%d, accumulatedDeltaRangeState=%d, state=%d " + - "",svid , Constellation, pseudorangeRateMps, receivedSvTimeInNs, accumulatedDeltaRangeState, state); + CASLog.i(TAG, "jwt measurementCount=%d, svid=%d, Constellation=%d, pseudorangeRateMps=%f, receivedSvTimeInNs=%d, accumulatedDeltaRangeState=%d, state=%d, carrierFrequencyHz = %f" + + "",measurementCount, svid , Constellation, pseudorangeRateMps, receivedSvTimeInNs, accumulatedDeltaRangeState, state, carrierFrequencyHz); gnssMeasurementData(buffer, measurement); + measurementCount+=1; } return buffer; } -- Gitee From 2a1889a65716d280321a75b54bbcd6f0f0ede3e1 Mon Sep 17 00:00:00 2001 From: Kobetao <15503630572@163.com> Date: Mon, 3 Jun 2024 21:12:29 +0800 Subject: [PATCH 15/20] support gnss by struct fix2 --- .../location/VirtualLocation.java | 88 ++++++++++++++++--- 1 file changed, 74 insertions(+), 14 deletions(-) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java index be16ea4..8e477ac 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java @@ -422,13 +422,39 @@ public class VirtualLocation { buffer.putShort((short) measurement.getAccumulatedDeltaRangeState()); buffer.putDouble(measurement.getAccumulatedDeltaRangeMeters()); buffer.putDouble(measurement.getAccumulatedDeltaRangeUncertaintyMeters()); - buffer.putFloat(measurement.getCarrierFrequencyHz()); - buffer.putLong(measurement.getCarrierCycles()); - buffer.putDouble(measurement.getCarrierPhase()); - buffer.putDouble(measurement.getCarrierPhaseUncertainty()); + + if (measurement.hasCarrierFrequencyHz()) { + buffer.putFloat(measurement.getCarrierFrequencyHz()); + } else { + buffer.putFloat(0); + } + + if (measurement.hasCarrierCycles()) { + buffer.putLong(measurement.getCarrierCycles()); + } else { + buffer.putLong(0); + } + + if (measurement.hasCarrierPhase()) { + buffer.putDouble(measurement.getCarrierPhase()); + } else { + buffer.putDouble(0); + } + + if (measurement.hasCarrierPhaseUncertainty()) { + buffer.putDouble(measurement.getCarrierPhaseUncertainty()); + } else { + buffer.putDouble(0); + } + buffer.put((byte) measurement.getMultipathIndicator()); - buffer.putDouble(measurement.getSnrInDb()); - // buffer.putDouble(measurement.getAutomaticGainControlLevelDb()); + + if (measurement.hasSnrInDb()) { + buffer.putDouble(measurement.getSnrInDb()); + } else { + buffer.putDouble(0); + } + //buffer.putDouble(measurement.getAutomaticGainControlLevelDb()); if (DEBUG) Log.i(TAG, "taotao" + buffer.position() + " =====>:" + Arrays.toString(buffer.array())); DEBUG = false; @@ -467,16 +493,50 @@ public class VirtualLocation { } buffer.putShort((short) flags); - buffer.putShort((short) gnssClock.getLeapSecond()); + if (gnssClock.hasLeapSecond()) { + buffer.putShort((short) gnssClock.getLeapSecond()); + } else { + buffer.putShort((short) 0); + } + buffer.putLong(gnssClock.getTimeNanos()); - buffer.putDouble(gnssClock.getTimeUncertaintyNanos()); - buffer.putLong(gnssClock.getFullBiasNanos()); - buffer.putDouble(gnssClock.getBiasNanos()); - buffer.putDouble(gnssClock.getLeapSecond()); - buffer.putDouble(gnssClock.getDriftNanosPerSecond()); - buffer.putDouble(gnssClock.getDriftUncertaintyNanosPerSecond()); + + if (gnssClock.hasTimeUncertaintyNanos()) { + buffer.putDouble(gnssClock.getTimeUncertaintyNanos()); + } else { + buffer.putDouble(0); + } + + if (gnssClock.hasFullBiasNanos()) { + buffer.putLong(gnssClock.getFullBiasNanos()); + } else { + buffer.putLong(0); + } + + if (gnssClock.hasBiasNanos()) { + buffer.putDouble(gnssClock.getBiasNanos()); + } else { + buffer.putDouble(0); + } + + if (gnssClock.hasBiasUncertaintyNanos()) { + buffer.putDouble(gnssClock.getBiasUncertaintyNanos()); + } else { + buffer.putDouble(0); + } + + if (gnssClock.hasDriftNanosPerSecond()) { + buffer.putDouble(gnssClock.getDriftNanosPerSecond()); + } else { + buffer.putDouble(0); + } + + if (gnssClock.hasDriftUncertaintyNanosPerSecond()) { + buffer.putDouble(gnssClock.getDriftUncertaintyNanosPerSecond()); + } else { + buffer.putDouble(0); + } buffer.putInt(gnssClock.getHardwareClockDiscontinuityCount()); - //buffer.putInt(140); if (DEBUG) Log.i(TAG, "taotao" + buffer.position() + " =====>:" + Arrays.toString(buffer.array())); } -- Gitee From 7bd8fdec375b7338710b127b5b27d304e52ca98b Mon Sep 17 00:00:00 2001 From: Kobetao <15503630572@163.com> Date: Tue, 4 Jun 2024 17:37:05 +0800 Subject: [PATCH 16/20] =?UTF-8?q?=E8=99=9A=E6=8B=9F=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=AB=AF=E4=BA=91=E5=8D=8F=E5=90=8Cversion2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 - app/src/main/AndroidManifest.xml | 5 - .../ui/activity/CasCloudPhoneActivity.java | 3 - .../cloudphone/service/CasProcessor.java | 1 - .../location/VirtualLocation.java | 143 +----------------- .../location/VirtualLocationManager.java | 3 - 6 files changed, 1 insertion(+), 156 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8f3d7c3..4dcd9d1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -82,8 +82,6 @@ dependencies { implementation 'androidx.navigation:navigation-fragment:2.3.0' implementation 'androidx.navigation:navigation-ui:2.3.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.14.0' - implementation 'com.hyman:flowlayout-lib:1.1.2' - implementation 'com.github.Petterpx:FloatingX:1.3.3' implementation 'com.android.support:design:28.0.0' implementation'com.android.support:support-v4:28.0.0' implementation 'org.bouncycastle:bcprov-jdk15to18:1.71' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 81776ef..e45284d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,11 +13,6 @@ - - measurements = (List) event.getMeasurements(); - // 云手机接口文档最大64个,取64个卫星,当大于64时如何选择 - int measurementCount = measurements.size() <= 64 ? measurements.size() : 64; - for (int i = 0; i < measurementCount; i++) { - jsonObject = gnssMeasurementToJsonObject(measurements.get(i)); - gnssMesurementsJsonArray.put(jsonObject); - } - - gnssMesurementsJson.put("measurements", gnssMesurementsJsonArray); - // Log.i(TAG,"jwt gnssMesurementsJson:" + gnssMesurementsJson.toString()); mGnssMeasurementsDataListener.onRecvData(getData(event)); - //mGnssMeasurementsDataListener.onRecvData(gnssMesurementsJson.toString()); - } - - @RequiresApi(api = Build.VERSION_CODES.N) - private JSONObject gnssClockToJsonObject(GnssClock gnssClock) throws JSONException { - DecimalFormat numberFormat = new DecimalFormat("#.#"); - JSONObject jsonObject = new JSONObject(); - int flags = 0; - - if (gnssClock.hasLeapSecond()) { - flags = flags | HAS_LEAP_SECOND; - jsonObject.put("leapSecond", gnssClock.getLeapSecond()); - } - - jsonObject.put("timeNs", gnssClock.getTimeNanos()); - - if (gnssClock.hasTimeUncertaintyNanos()) { - flags = flags | HAS_TIME_UNCERTAINTY; -// jsonObject.put("timeUncertaintyNs", numberFormat.format(gnssClock.getTimeUncertaintyNanos())); - jsonObject.put("timeUncertaintyNs", gnssClock.getTimeUncertaintyNanos()); - } - - if (gnssClock.hasFullBiasNanos()) { - flags = flags | HAS_FULL_BIAS; - jsonObject.put("fullBiasNs", gnssClock.getFullBiasNanos()); - } - - if (gnssClock.hasBiasNanos()) { - flags = flags | HAS_BIAS; -// jsonObject.put("biasNs", numberFormat.format(gnssClock.getBiasNanos())); - jsonObject.put("biasNs", gnssClock.getBiasNanos()); - } - - if (gnssClock.hasBiasUncertaintyNanos()) { - flags = flags | HAS_BIAS_UNCERTAINTY; -// jsonObject.put("biasUncertaintyNs", numberFormat.format(gnssClock.getBiasUncertaintyNanos())); - jsonObject.put("biasUncertaintyNs", gnssClock.getBiasUncertaintyNanos()); - } - - if (gnssClock.hasDriftNanosPerSecond()) { - flags = flags | HAS_DRIFT; -// jsonObject.put("driftNsps", numberFormat.format(gnssClock.getDriftNanosPerSecond())); - jsonObject.put("driftNsps", gnssClock.getDriftNanosPerSecond()); - } - - if (gnssClock.hasDriftUncertaintyNanosPerSecond()) { - flags = flags | HAS_DRIFT_UNCERTAINTY; -// jsonObject.put("driftUncertaintyNsps", numberFormat.format(gnssClock.getDriftUncertaintyNanosPerSecond())); - jsonObject.put("driftUncertaintyNsps", gnssClock.getDriftUncertaintyNanosPerSecond()); - } - - jsonObject.put("hwClockDiscontinuityCount", gnssClock.getHardwareClockDiscontinuityCount()); - jsonObject.put("flags", flags); - return jsonObject; } private static boolean DEBUG = true; @@ -541,77 +470,6 @@ public class VirtualLocation { Log.i(TAG, "taotao" + buffer.position() + " =====>:" + Arrays.toString(buffer.array())); } - @RequiresApi(api = Build.VERSION_CODES.N) - private JSONObject gnssMeasurementToJsonObject(GnssMeasurement measurement) throws JSONException { - DecimalFormat numberFormat = new DecimalFormat("#.#"); - JSONObject jsonObject = new JSONObject(); - int flags = 0; - - jsonObject.put("svid", measurement.getSvid()); - jsonObject.put("constellation", measurement.getConstellationType()); -// jsonObject.put("timeOffsetNs", numberFormat.format(measurement.getTimeOffsetNanos())); - jsonObject.put("timeOffsetNs", measurement.getTimeOffsetNanos()); - jsonObject.put("state", measurement.getState()); - jsonObject.put("receivedSvTimeInNs", measurement.getReceivedSvTimeNanos()); - jsonObject.put("receivedSvTimeUncertaintyInNs", measurement.getReceivedSvTimeUncertaintyNanos()); -// jsonObject.put("cN0Dbhz", numberFormat.format(measurement.getCn0DbHz())); -// jsonObject.put("pseudorangeRateMps", numberFormat.format(measurement.getPseudorangeRateMetersPerSecond())); -// jsonObject.put("pseudorangeRateUncertaintyMps", numberFormat.format(measurement.getPseudorangeRateUncertaintyMetersPerSecond())); - - jsonObject.put("cN0Dbhz", measurement.getCn0DbHz()); - jsonObject.put("pseudorangeRateMps", measurement.getPseudorangeRateMetersPerSecond()); - jsonObject.put("pseudorangeRateUncertaintyMps", measurement.getPseudorangeRateUncertaintyMetersPerSecond()); - - jsonObject.put("accumulatedDeltaRangeState", measurement.getAccumulatedDeltaRangeState()); -// jsonObject.put("accumulatedDeltaRangeM", numberFormat.format(measurement.getAccumulatedDeltaRangeMeters())); -// jsonObject.put("accumulatedDeltaRangeUncertaintyM", numberFormat.format(measurement.getAccumulatedDeltaRangeUncertaintyMeters())); - - jsonObject.put("accumulatedDeltaRangeM", measurement.getAccumulatedDeltaRangeMeters()); - jsonObject.put("accumulatedDeltaRangeUncertaintyM", measurement.getAccumulatedDeltaRangeUncertaintyMeters()); - - if (measurement.hasCarrierFrequencyHz()) { - flags = flags | HAS_CARRIER_FREQUENCY; -// jsonObject.put("carrierFrequencyHz", numberFormat.format(measurement.getCarrierFrequencyHz())); - jsonObject.put("carrierFrequencyHz", measurement.getCarrierFrequencyHz()); - } - - if (measurement.hasCarrierCycles()) { - flags = flags | HAS_CARRIER_CYCLES; - jsonObject.put("carrierCycles", measurement.getCarrierCycles()); - } - - if (measurement.hasCarrierPhase()) { - flags = flags | HAS_CARRIER_PHASE; -// jsonObject.put("carrierPhase", numberFormat.format(measurement.getCarrierPhase())); - jsonObject.put("carrierPhase", measurement.getCarrierPhase()); - } - - if (measurement.hasCarrierPhaseUncertainty()) { - flags = flags | HAS_CARRIER_PHASE_UNCERTAINTY; -// jsonObject.put("carrierPhaseUncertainty", numberFormat.format(measurement.getCarrierPhaseUncertainty())); - jsonObject.put("carrierPhaseUncertainty", measurement.getCarrierPhaseUncertainty()); - } - - jsonObject.put("multipathIndicator", measurement.getMultipathIndicator()); - - if (measurement.hasSnrInDb()) { - flags = flags | HAS_SNR; -// jsonObject.put("snrDb", numberFormat.format(measurement.getSnrInDb())); - jsonObject.put("snrDb", measurement.getSnrInDb()); - } - - if (SDK_INT >= Build.VERSION_CODES.O) { - if (measurement.hasAutomaticGainControlLevelDb()) { - flags = flags | HAS_AUTOMATIC_GAIN_CONTROL; -// jsonObject.put("agcLevelDb", numberFormat.format(measurement.getAutomaticGainControlLevelDb())); - jsonObject.put("agcLevelDb", measurement.getAutomaticGainControlLevelDb()); - } - } - - jsonObject.put("flags", flags); - return jsonObject; - } - public static String byteArrayToString(byte[] byteArray) { StringBuilder sb = new StringBuilder(); for (byte b : byteArray) { @@ -628,6 +486,7 @@ public class VirtualLocation { buffer.order(ByteOrder.BIG_ENDIAN); gnssClockData(buffer, event.getClock()); /* byte[] data = new byte[buffer.position()]; + buffer.flip(); System.arraycopy(buffer.array(),0,data,0,data.length); CASLog.i(TAG, "jwt gnssClockData ===> %s",byteArrayToString(data));*/ buffer.put((byte) event.getMeasurements().size()); diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java index 2fda54c..e9b8173 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java @@ -111,9 +111,7 @@ public class VirtualLocationManager extends VirtualDeviceManager { @Override public void onRecvData(Object... args) { -// String body = (String) args[0]; int type = 0; -// int bodyLen = body.getBytes().length; ByteBuffer body = (ByteBuffer) args[0]; int bodyLen = body.position(); CASLog.i(TAG, "gnssMeasurements size=" + bodyLen); @@ -121,7 +119,6 @@ public class VirtualLocationManager extends VirtualDeviceManager { VirtualDeviceProtocol.MsgHeader header = new VirtualDeviceProtocol.MsgHeader(OPT_GNSS_MEASUREMENT_DATA, DEV_TYPE_LOCATION, (short) type, rspMsgLen); byte[] rspBody = new byte[bodyLen]; System.arraycopy(body.array(), 0, rspBody, 0, bodyLen); -// System.arraycopy(body.getBytes(), 0, rspBody, 0, bodyLen); mVirtualDeviceProtocol.sendMsg(header, rspBody, LOCATION_DATA); } } -- Gitee From f7432374861cb6354a51d2bed1bccdf566831ab0 Mon Sep 17 00:00:00 2001 From: Kobetao <15503630572@163.com> Date: Wed, 5 Jun 2024 15:58:03 +0800 Subject: [PATCH 17/20] =?UTF-8?q?=E8=99=9A=E6=8B=9F=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=AB=AF=E4=BA=91=E5=8D=8F=E5=90=8Cversion3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/activity/CasCloudPhoneActivity.java | 2 +- .../common/VirtualDeviceProtocol.java | 2 +- .../location/VirtualLocation.java | 35 ++----------------- .../vibrator/VirtualVibrator.java | 2 +- 4 files changed, 6 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java index 966e0e3..07711ad 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java @@ -298,8 +298,8 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa mMediaConfig.put(PHYSICAL_WIDTH, String.valueOf(metrics.widthPixels)); mMediaConfig.put(PHYSICAL_HEIGHT, String.valueOf(metrics.heightPixels)); mCloudPhone.setMediaConfig(mMediaConfig); - getPhoneConnectInfo(mPhoneId); + getPhoneConnectInfo(mPhoneId); } catch (IllegalArgumentException e) { showDialog(getResources().getString(R.string.cas_phone_input_param_invalid)); } catch (Exception e) { diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java index b8e347a..d3af49c 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java @@ -88,7 +88,7 @@ public class VirtualDeviceProtocol { public void processMsg(MsgHeader header, byte[] body) { short devType = header.mDeviceType; - Log.e(TAG, "processMsg: device type :" + header.mDeviceType); + Log.i(TAG, "processMsg: device type :" + header.mDeviceType); if (devType == 0) devType = DEV_TYPE_SENSOR; VirtualDeviceManager virtualDeviceManager = virtualDeviceManagers.get(devType); if (virtualDeviceManager == null) { diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java index afc73f2..f90b4d4 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java @@ -306,8 +306,6 @@ public class VirtualLocation { mGnssMeasurementsDataListener.onRecvData(getData(event)); } - private static boolean DEBUG = true; - @RequiresApi(api = Build.VERSION_CODES.N) private static void gnssMeasurementData(ByteBuffer buffer, GnssMeasurement measurement) { int flags = 0; @@ -383,10 +381,6 @@ public class VirtualLocation { } else { buffer.putDouble(0); } - //buffer.putDouble(measurement.getAutomaticGainControlLevelDb()); - if (DEBUG) - Log.i(TAG, "taotao" + buffer.position() + " =====>:" + Arrays.toString(buffer.array())); - DEBUG = false; } @RequiresApi(api = Build.VERSION_CODES.N) @@ -465,18 +459,10 @@ public class VirtualLocation { } else { buffer.putDouble(0); } + buffer.putInt(gnssClock.getHardwareClockDiscontinuityCount()); - if (DEBUG) - Log.i(TAG, "taotao" + buffer.position() + " =====>:" + Arrays.toString(buffer.array())); } - public static String byteArrayToString(byte[] byteArray) { - StringBuilder sb = new StringBuilder(); - for (byte b : byteArray) { - sb.append(String.format("%02X ", b)); - } - return sb.toString().trim(); - } @RequiresApi(api = Build.VERSION_CODES.N) public static ByteBuffer getData(GnssMeasurementsEvent event) { // 创建ByteBuffer,大小为结构体的字节数 @@ -485,30 +471,15 @@ public class VirtualLocation { // 设置字节序为小端序(与packed属性相对应) buffer.order(ByteOrder.BIG_ENDIAN); gnssClockData(buffer, event.getClock()); -/* byte[] data = new byte[buffer.position()]; - buffer.flip(); - System.arraycopy(buffer.array(),0,data,0,data.length); - CASLog.i(TAG, "jwt gnssClockData ===> %s",byteArrayToString(data));*/ buffer.put((byte) event.getMeasurements().size()); - int x = (byte) event.getMeasurements().size(); - CASLog.i(TAG, "jwt event.getMeasurements().size()=%d", x); + CASLog.i(TAG, "GetMeasurements size = %d", event.getMeasurements().size()); int measurementCount = 1; for (GnssMeasurement measurement : event.getMeasurements()) { + // 当Measurement卫星数量大于64时,取前64个卫星中的数据 if (measurementCount > 64){ break; } - - byte Constellation = (byte)measurement.getConstellationType(); - int svid = measurement.getSvid(); - double pseudorangeRateMps = measurement.getPseudorangeRateMetersPerSecond(); - long receivedSvTimeInNs = measurement.getReceivedSvTimeNanos(); - short accumulatedDeltaRangeState = (short)measurement.getAccumulatedDeltaRangeState(); - int state = measurement.getState(); - float carrierFrequencyHz= measurement.getCarrierFrequencyHz(); - //CASLog.i(TAG, "jwt Constellation=%d", Constellation); - CASLog.i(TAG, "jwt measurementCount=%d, svid=%d, Constellation=%d, pseudorangeRateMps=%f, receivedSvTimeInNs=%d, accumulatedDeltaRangeState=%d, state=%d, carrierFrequencyHz = %f" + - "",measurementCount, svid , Constellation, pseudorangeRateMps, receivedSvTimeInNs, accumulatedDeltaRangeState, state, carrierFrequencyHz); gnssMeasurementData(buffer, measurement); measurementCount+=1; } diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java index e795dc7..d306588 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java @@ -41,7 +41,7 @@ public class VirtualVibrator { long vibrateTime = ((body[0] << 24) | (body[1] << 16) | (body[2] << 8) | (body[3])); CASLog.i(TAG, "vibrate time is " + vibrateTime); mVibrator.cancel(); -// mVibrator.vibrate(vibrateTime); + mVibrator.vibrate(vibrateTime); } @SuppressLint("MissingPermission") -- Gitee From 99adb8603430b92c9264607f3db73ed4bd35fcf1 Mon Sep 17 00:00:00 2001 From: Kobetao <15503630572@163.com> Date: Thu, 6 Jun 2024 10:41:10 +0800 Subject: [PATCH 18/20] =?UTF-8?q?=E8=99=9A=E6=8B=9F=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=AB=AF=E4=BA=91=E5=8D=8F=E5=90=8Cversion4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java | 1 + .../cloudphone/virtualdevice/location/VirtualLocation.java | 4 +++- .../cloudphone/virtualdevice/vibrator/VirtualVibrator.java | 6 ++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java index 07711ad..91efb66 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java @@ -51,6 +51,7 @@ import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_LOCATION; import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_MICROPHONE; import static com.huawei.cloudphone.api.CloudPhoneParas.DevType.DEV_PHONE; import static com.huawei.cloudphone.utils.CasConstantsUtil.CLIENT_MODE; + import android.annotation.SuppressLint; import android.app.Activity; import android.content.ClipData; diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java index f90b4d4..20b40a6 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java @@ -70,6 +70,8 @@ import java.util.List; public class VirtualLocation { private static final String TAG = "VirtualLocation"; private final long MIN_TIME = 1000; + + private static final int GNSSPACKET_SIZE = 7361; private final float MIN_DISTANCE = 1; private final int TYPE_LOCATION = 0; private final int TYPE_GNSS_MEASUREMENT = 1; @@ -466,7 +468,7 @@ public class VirtualLocation { @RequiresApi(api = Build.VERSION_CODES.N) public static ByteBuffer getData(GnssMeasurementsEvent event) { // 创建ByteBuffer,大小为结构体的字节数 - ByteBuffer buffer = ByteBuffer.allocate(7896); + ByteBuffer buffer = ByteBuffer.allocate(GNSSPACKET_SIZE); // 设置字节序为小端序(与packed属性相对应) buffer.order(ByteOrder.BIG_ENDIAN); diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java index d306588..d3a632c 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java @@ -40,6 +40,12 @@ public class VirtualVibrator { } long vibrateTime = ((body[0] << 24) | (body[1] << 16) | (body[2] << 8) | (body[3])); CASLog.i(TAG, "vibrate time is " + vibrateTime); + + if (vibrateTime < 0) { + CASLog.i(TAG, "The vibration duration must be positive, but got " + vibrateTime); + return; + } + mVibrator.cancel(); mVibrator.vibrate(vibrateTime); } -- Gitee From ed1a396b3c0b52263961d78088537aa4d564d55d Mon Sep 17 00:00:00 2001 From: Kobetao <15503630572@163.com> Date: Tue, 11 Jun 2024 11:50:52 +0800 Subject: [PATCH 19/20] close vibrator & optimize log --- cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp | 4 +++- .../virtualdevice/common/VirtualDeviceProtocol.java | 4 ++-- .../cloudphone/virtualdevice/location/VirtualLocation.java | 3 +-- .../virtualdevice/location/VirtualLocationManager.java | 2 -- .../cloudphone/virtualdevice/sensor/VirtualSensor.java | 5 ----- .../virtualdevice/sensor/VirtualSensorManager.java | 1 - .../cloudphone/virtualdevice/vibrator/VirtualVibrator.java | 1 - .../virtualdevice/vibrator/VirtualVibratorManager.java | 2 -- 8 files changed, 6 insertions(+), 16 deletions(-) diff --git a/cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp b/cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp index 6439dfc..904db53 100644 --- a/cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp +++ b/cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp @@ -75,7 +75,9 @@ void CasStreamRecvParser::SetServiceHandle(unsigned char type, CasPktHandle *ser CasPktHandle *CasStreamRecvParser::GetServiceHandle(unsigned char type) { - return VirtualVibrator >= type && type >= VirtualCamera ? m_serviceHandles[VirtualDevice] : m_serviceHandles[type]; + return VirtualLocation >= type && type >= VirtualCamera ? m_serviceHandles[VirtualDevice] : m_serviceHandles[type]; + // 暂时关闭马达(振动),待传输时延优化后重新开启 + // return VirtualVibrator >= type && type >= VirtualCamera ? m_serviceHandles[VirtualDevice] : m_serviceHandles[type]; } CasStreamParseThread::CasStreamParseThread(CasSocket *socket, CasStreamRecvParser *streamRecvParser) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java index d3af49c..26662f4 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java @@ -58,7 +58,8 @@ public class VirtualDeviceProtocol { virtualDeviceManagers.put(DEV_TYPE_SENSOR, new VirtualSensorManager(this, (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE))); virtualDeviceManagers.put(DEV_TYPE_LOCATION, new VirtualLocationManager(this, mContext)); - virtualDeviceManagers.put(DEV_TYPE_VIBRATOR, new VirtualVibratorManager(this, mContext)); + // 马达(振动)暂不使能,待传输时延优化后重新开启 + // virtualDeviceManagers.put(DEV_TYPE_VIBRATOR, new VirtualVibratorManager(this, mContext)); // 设置权限监听 if (listener != null) { @@ -88,7 +89,6 @@ public class VirtualDeviceProtocol { public void processMsg(MsgHeader header, byte[] body) { short devType = header.mDeviceType; - Log.i(TAG, "processMsg: device type :" + header.mDeviceType); if (devType == 0) devType = DEV_TYPE_SENSOR; VirtualDeviceManager virtualDeviceManager = virtualDeviceManagers.get(devType); if (virtualDeviceManager == null) { diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java index 20b40a6..8f93088 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocation.java @@ -467,14 +467,13 @@ public class VirtualLocation { @RequiresApi(api = Build.VERSION_CODES.N) public static ByteBuffer getData(GnssMeasurementsEvent event) { - // 创建ByteBuffer,大小为结构体的字节数 + // 创建ByteBuffer,大小为 gnssMeasurementPacket结构体的字节数 ByteBuffer buffer = ByteBuffer.allocate(GNSSPACKET_SIZE); // 设置字节序为小端序(与packed属性相对应) buffer.order(ByteOrder.BIG_ENDIAN); gnssClockData(buffer, event.getClock()); buffer.put((byte) event.getMeasurements().size()); - CASLog.i(TAG, "GetMeasurements size = %d", event.getMeasurements().size()); int measurementCount = 1; for (GnssMeasurement measurement : event.getMeasurements()) { diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java index e9b8173..6344bf6 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/location/VirtualLocationManager.java @@ -99,7 +99,6 @@ public class VirtualLocationManager extends VirtualDeviceManager { int type = 0; int bodyLen = body.getBytes().length; int rspMsgLen = bodyLen + MSG_HEADER_LEN; - CASLog.i(TAG, "location bodyLen=" + bodyLen + " body=" + body); VirtualDeviceProtocol.MsgHeader header = new VirtualDeviceProtocol.MsgHeader(OPT_LOCATION_DATA, DEV_TYPE_LOCATION, (short) type, rspMsgLen); byte[] rspBody = new byte[bodyLen]; System.arraycopy(body.getBytes(), 0, rspBody, 0, bodyLen); @@ -114,7 +113,6 @@ public class VirtualLocationManager extends VirtualDeviceManager { int type = 0; ByteBuffer body = (ByteBuffer) args[0]; int bodyLen = body.position(); - CASLog.i(TAG, "gnssMeasurements size=" + bodyLen); int rspMsgLen = bodyLen + MSG_HEADER_LEN; VirtualDeviceProtocol.MsgHeader header = new VirtualDeviceProtocol.MsgHeader(OPT_GNSS_MEASUREMENT_DATA, DEV_TYPE_LOCATION, (short) type, rspMsgLen); byte[] rspBody = new byte[bodyLen]; diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java index e6d3aee..4c14852 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensor.java @@ -47,11 +47,6 @@ public class VirtualSensor implements SensorEventListener { public VirtualSensor(SensorManager sensorManager) { mSensorManager = sensorManager; mAccelerationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); -// List sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL); -// CASLog.i(TAG, "sensor list size " + sensorList.size()); -// for (Sensor sensor : sensorList) { -// mSensorMap.put(sensor.getType(), mSensorManager.getDefaultSensor(sensor.getType())); -// } } void registerSensorDataListener(IVirtualDeviceDataListener listener) { diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java index 48b9c7d..f93ce01 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java @@ -113,7 +113,6 @@ public class VirtualSensorManager extends VirtualDeviceManager { int sensorId = sensorEvent.sensor.getType(); int bodyLen = body.getBytes().length; int rspMsgLen = bodyLen + MSG_HEADER_LEN; - CASLog.i(TAG, "sensorid=" + sensorId + " bodyLen=" + bodyLen + " body=" + body); MsgHeader header = new MsgHeader(OPT_SENSOR_DATA, DEV_TYPE_SENSOR, (short)sensorId, rspMsgLen); byte[] rspBody = new byte[bodyLen]; System.arraycopy(body.getBytes(), 0, rspBody, 0, bodyLen); diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java index d3a632c..6bcb88b 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java @@ -39,7 +39,6 @@ public class VirtualVibrator { return; } long vibrateTime = ((body[0] << 24) | (body[1] << 16) | (body[2] << 8) | (body[3])); - CASLog.i(TAG, "vibrate time is " + vibrateTime); if (vibrateTime < 0) { CASLog.i(TAG, "The vibration duration must be positive, but got " + vibrateTime); diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java index dd522a7..efa9066 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java @@ -22,11 +22,9 @@ public class VirtualVibratorManager extends VirtualDeviceManager { public void processMsg(VirtualDeviceProtocol.MsgHeader header, byte[] body) { switch (header.mOptType) { case OPT_VIBRATOR_START_REQ: - CASLog.i(TAG, "processMsg: start vibrate"); mVirtualVibrator.startVibrate(header, body); break; case OPT_VIBRATOR_STOP_REQ: - CASLog.i(TAG, "processMsg: stop vibrate"); mVirtualVibrator.stopVibrate(); break; default: -- Gitee From d474b736811560ef5817742fbffd1401379997a5 Mon Sep 17 00:00:00 2001 From: Kobetao <15503630572@163.com> Date: Tue, 11 Jun 2024 15:22:51 +0800 Subject: [PATCH 20/20] delete vibrator --- app/src/main/AndroidManifest.xml | 1 - cloudphone/src/main/cpp/cas_common/CasMsg.h | 1 - .../cpp/cas_stream/CasStreamRecvParser.cpp | 2 - .../cloudphone/api/CloudPhoneParas.java | 1 - .../common/VirtualDeviceProtocol.java | 4 -- .../vibrator/VirtualVibrator.java | 59 ------------------- .../vibrator/VirtualVibratorManager.java | 34 ----------- 7 files changed, 102 deletions(-) delete mode 100644 cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java delete mode 100644 cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e45284d..3d7b485 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,6 @@ - = type && type >= VirtualCamera ? m_serviceHandles[VirtualDevice] : m_serviceHandles[type]; - // 暂时关闭马达(振动),待传输时延优化后重新开启 - // return VirtualVibrator >= type && type >= VirtualCamera ? m_serviceHandles[VirtualDevice] : m_serviceHandles[type]; } CasStreamParseThread::CasStreamParseThread(CasSocket *socket, CasStreamRecvParser *streamRecvParser) diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/api/CloudPhoneParas.java b/cloudphone/src/main/java/com/huawei/cloudphone/api/CloudPhoneParas.java index 729c0d8..1abef36 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/api/CloudPhoneParas.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/api/CloudPhoneParas.java @@ -31,5 +31,4 @@ public class CloudPhoneParas { public static final short DEV_TYPE_MICROPHONE = 2; public static final short DEV_TYPE_SENSOR = 3; public static final short DEV_TYPE_LOCATION = 4; - public static final short DEV_TYPE_VIBRATOR = 5; } diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java index 26662f4..16906a5 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java @@ -19,7 +19,6 @@ import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_CAMERA; import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_LOCATION; import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_MICROPHONE; import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_SENSOR; -import static com.huawei.cloudphone.api.CloudPhoneParas.DEV_TYPE_VIBRATOR; import android.content.Context; import android.hardware.SensorManager; @@ -30,7 +29,6 @@ import com.huawei.cloudphone.virtualdevice.camera.VirtualCameraManager; import com.huawei.cloudphone.virtualdevice.location.VirtualLocationManager; import com.huawei.cloudphone.virtualdevice.microphone.VirtualMicrophoneManager; import com.huawei.cloudphone.virtualdevice.sensor.VirtualSensorManager; -import com.huawei.cloudphone.virtualdevice.vibrator.VirtualVibratorManager; import java.util.HashMap; import java.util.Map; @@ -58,8 +56,6 @@ public class VirtualDeviceProtocol { virtualDeviceManagers.put(DEV_TYPE_SENSOR, new VirtualSensorManager(this, (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE))); virtualDeviceManagers.put(DEV_TYPE_LOCATION, new VirtualLocationManager(this, mContext)); - // 马达(振动)暂不使能,待传输时延优化后重新开启 - // virtualDeviceManagers.put(DEV_TYPE_VIBRATOR, new VirtualVibratorManager(this, mContext)); // 设置权限监听 if (listener != null) { diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java deleted file mode 100644 index 6bcb88b..0000000 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibrator.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2023 Huawei Cloud Computing Technology 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. - */ -package com.huawei.cloudphone.virtualdevice.vibrator; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.os.Vibrator; - -import com.huawei.cloudphone.common.CASLog; -import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; - -public class VirtualVibrator { - private static final String TAG = "VirtualVibrator"; - - private Context mContext; - private Vibrator mVibrator; - - public VirtualVibrator(Context context) { - mContext = context; - mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); - } - - @SuppressLint("MissingPermission") - public void startVibrate(VirtualDeviceProtocol.MsgHeader header, byte[] body) { - if (!mVibrator.hasVibrator()) { - return; - } - long vibrateTime = ((body[0] << 24) | (body[1] << 16) | (body[2] << 8) | (body[3])); - - if (vibrateTime < 0) { - CASLog.i(TAG, "The vibration duration must be positive, but got " + vibrateTime); - return; - } - - mVibrator.cancel(); - mVibrator.vibrate(vibrateTime); - } - - @SuppressLint("MissingPermission") - public void stopVibrate() { - if (!mVibrator.hasVibrator()) { - return; - } - mVibrator.cancel(); - } -} \ No newline at end of file diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java deleted file mode 100644 index efa9066..0000000 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/vibrator/VirtualVibratorManager.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.huawei.cloudphone.virtualdevice.vibrator; - -import android.content.Context; - -import com.huawei.cloudphone.common.CASLog; -import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager; -import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; - -public class VirtualVibratorManager extends VirtualDeviceManager { - private static final String TAG = "VirtualVibratorManager"; - public static final short OPT_VIBRATOR_START_REQ = 0x1; - public static final short OPT_VIBRATOR_STOP_REQ = 0x2; - - private VirtualVibrator mVirtualVibrator; - private VirtualDeviceProtocol mVirtualDeviceProtocol; - - public VirtualVibratorManager(VirtualDeviceProtocol virtualDeviceProtocol, Context context) { - mVirtualDeviceProtocol = virtualDeviceProtocol; - mVirtualVibrator = new VirtualVibrator(context); - } - - public void processMsg(VirtualDeviceProtocol.MsgHeader header, byte[] body) { - switch (header.mOptType) { - case OPT_VIBRATOR_START_REQ: - mVirtualVibrator.startVibrate(header, body); - break; - case OPT_VIBRATOR_STOP_REQ: - mVirtualVibrator.stopVibrate(); - break; - default: - CASLog.e(TAG, "processMsg: error opt type"); - } - } -} -- Gitee