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(); tg.Lock = jo.GetValue("Lock").ToObject(); tg.Variance = jo.GetValue("Variance").ToObject(); tg.EllipsoidFitting = ToEllipsoidFitting(jo.GetValue("EllipsoidFitting")); tg.FitThreshold = jo.GetValue("FitThreshold").ToObject(); tg.FitCountLeft = jo.GetValue("FitCountLeft").ToObject(); tg.NewBlockAccumulation = jo.GetValue("NewBlockAccumulation").ToObject(); tg.NewBlock = jo.GetValue("NewBlock").ToObject(); tg.CountPerLength = jo.GetValue("CountPerLength").ToObject(); 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(); 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 ToMatrixDouble(JArray arr) { int rcCount = arr.Count; Matrix matrix = CreateMatrix.Dense(rcCount, rcCount); for (var i = 0; i < rcCount; ++i) for (var j = 0; j < rcCount; ++j) matrix[i, j] = arr[i][j].Value(); return matrix; } private o0.Geometry.Vector ToVectorDouble(JArray arr) { return new o0.Geometry.Vector(arr[0].Value(), arr[1].Value(), arr[2].Value()); } private o0.Geometry.Vector ToVectorInt(JArray arr) { return new o0.Geometry.Vector(arr[0].Value(), arr[1].Value(), arr[2].Value()); } }