Browse Source

地磁计(序列化和反序列化)自定义适配ios

lvjincheng 3 years ago
parent
commit
69227eb0a0

+ 2 - 2
Assets/BowArrow/Scripts/Bluetooth/AimHandler.cs

@@ -103,7 +103,7 @@ public class AimHandler : MonoBehaviour
     public void InitMag(string record) {
         try {
             if (!string.IsNullOrEmpty(record)) {
-                MagCalibrater = MagJsonConvert.Parse(record);
+                MagCalibrater = JsonConvert.DeserializeObject<MagnetometerAutoCalibrater>(record, new MagJsonConverter());
             } else {
                 MagCalibrater = new MagnetometerAutoCalibrater();
             }
@@ -141,7 +141,7 @@ public class AimHandler : MonoBehaviour
     public IEnumerator SaveMag() {
         yield return null;
         string mac = LoginMgr.myUserInfo.mac;
-        string record = JsonConvert.SerializeObject(MagCalibrater);
+        string record = JsonConvert.SerializeObject(MagCalibrater, new JsonConverter[]{new MagJsonConverter()});
         UserPlayer.ins.call("userComp.saveMacCalibrate", 1, mac, record);
     }
 

+ 74 - 0
Assets/BowArrow/Scripts/Bluetooth/MagJsonConverter.cs

@@ -0,0 +1,74 @@
+using System;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using o0._9Axis;
+using MathNet.Numerics.LinearAlgebra;
+
+public class MagJsonConverter : JsonConverter
+{
+    public override bool CanConvert(Type objectType)
+    {
+        return typeof(MagnetometerAutoCalibrater) == objectType;
+    }
+
+    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+    {
+        var jo = JObject.Load(reader);
+        var tg = new MagnetometerAutoCalibrater();
+        tg.MaxCount = jo.GetValue("MaxCount").ToObject<int>();
+        tg.Lock = jo.GetValue("Lock").ToObject<bool>();
+        tg.Variance = jo.GetValue("Variance").ToObject<double>();
+        tg.EllipsoidFitting = ToEllipsoidFitting(jo.GetValue("EllipsoidFitting"));
+        tg.FitThreshold = jo.GetValue("FitThreshold").ToObject<int>();
+        tg.FitCountLeft = jo.GetValue("FitCountLeft").ToObject<int>();
+        tg.NewBlockAccumulation = jo.GetValue("NewBlockAccumulation").ToObject<double>();
+        tg.NewBlock = jo.GetValue("NewBlock").ToObject<int>();
+        tg.CountPerLength = jo.GetValue("CountPerLength").ToObject<double>();
+        foreach (JProperty item in jo.GetValue("VectorByBlock"))
+            tg.VectorByBlock[ToVectorInt(JArray.Parse(item.Name))] = ToVectorDouble(item.Value as JArray);
+        tg.LastTimestamp = jo.GetValue("LastTimestamp").ToObject<long>();
+        return tg;
+    }
+
+    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
+        var jo = JObject.FromObject(value);
+        var tg = value as MagnetometerAutoCalibrater;
+        jo.Remove("Complete");
+        jo.Remove("EllipsoidFitting");
+        var EllipsoidFitting = tg.EllipsoidFitting;
+        JObject _EllipsoidFitting = new JObject();
+        _EllipsoidFitting.Add("Center", JToken.FromObject(EllipsoidFitting.Center));
+        _EllipsoidFitting.Add("CorrectMatrixArray", JToken.FromObject(EllipsoidFitting.CorrectMatrixArray));
+        _EllipsoidFitting.Add("Radius", JToken.FromObject(EllipsoidFitting.Radius));
+        jo.Add("EllipsoidFitting", _EllipsoidFitting);
+        jo.WriteTo(writer);
+    }
+
+    private EllipsoidFitting ToEllipsoidFitting(JToken jToken) 
+    {
+        var Center = ToVectorDouble(jToken["Center"] as JArray);
+        var CorrectMatrix = ToMatrixDouble(jToken["CorrectMatrixArray"] as JArray);
+        var Radius = ToVectorDouble(jToken["Radius"] as JArray);
+        return new EllipsoidFitting(Center, CorrectMatrix, Radius);
+    }
+
+    private Matrix<double> ToMatrixDouble(JArray arr) 
+    {
+        int rcCount = arr.Count;
+        Matrix<double> matrix = CreateMatrix.Dense<double>(rcCount, rcCount);
+        for (var i = 0; i < rcCount; ++i)
+            for (var j = 0; j < rcCount; ++j)
+                matrix[i, j] = arr[i][j].Value<double>();
+        return matrix;
+    }
+
+    private o0.Geometry.Vector<double> ToVectorDouble(JArray arr) 
+    {
+        return new o0.Geometry.Vector<double>(arr[0].Value<double>(), arr[1].Value<double>(), arr[2].Value<double>());
+    }
+
+    private o0.Geometry.Vector<int> ToVectorInt(JArray arr) 
+    {
+        return new o0.Geometry.Vector<int>(arr[0].Value<int>(), arr[1].Value<int>(), arr[2].Value<int>());
+    }
+}

+ 11 - 0
Assets/BowArrow/Scripts/Bluetooth/MagJsonConverter.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d0e21aaa8c13f8f408d61ce1766e5082
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 3 - 3
ProjectSettings/ProjectSettings.asset

@@ -159,7 +159,7 @@ PlayerSettings:
     iPhone: 0
     tvOS: 0
   overrideDefaultApplicationIdentifier: 1
-  AndroidBundleVersionCode: 2
+  AndroidBundleVersionCode: 1
   AndroidMinSdkVersion: 19
   AndroidTargetSdkVersion: 31
   AndroidPreferredInstallLocation: 1
@@ -242,7 +242,7 @@ PlayerSettings:
   useCustomBaseGradleTemplate: 0
   useCustomGradlePropertiesTemplate: 0
   useCustomProguardFile: 0
-  AndroidTargetArchitectures: 1
+  AndroidTargetArchitectures: 2
   AndroidSplashScreenScale: 0
   androidSplashScreen: {fileID: 0}
   AndroidKeystoreName: "{inproject}: Doc/App\u79C1\u94A5/2022-11-17/smartbow.keystore"
@@ -694,7 +694,7 @@ PlayerSettings:
   additionalCompilerArguments: {}
   platformArchitecture: {}
   scriptingBackend:
-    Android: 0
+    Android: 1
     Standalone: 0
   il2cppCompilerConfiguration:
     Standalone: 1