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