MagJsonConverter.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System;
  2. using Newtonsoft.Json;
  3. using Newtonsoft.Json.Linq;
  4. using o0._9Axis;
  5. using MathNet.Numerics.LinearAlgebra;
  6. public class MagJsonConverter : JsonConverter
  7. {
  8. public override bool CanConvert(Type objectType)
  9. {
  10. return typeof(MagnetometerAutoCalibrater) == objectType;
  11. }
  12. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  13. {
  14. var jo = JObject.Load(reader);
  15. var tg = new MagnetometerAutoCalibrater();
  16. tg.MaxCount = jo.GetValue("MaxCount").ToObject<int>();
  17. tg.Lock = jo.GetValue("Lock").ToObject<bool>();
  18. tg.Variance = jo.GetValue("Variance").ToObject<double>();
  19. tg.EllipsoidFitting = ToEllipsoidFitting(jo.GetValue("EllipsoidFitting"));
  20. tg.FitThreshold = jo.GetValue("FitThreshold").ToObject<int>();
  21. tg.FitCountLeft = jo.GetValue("FitCountLeft").ToObject<int>();
  22. tg.NewBlockAccumulation = jo.GetValue("NewBlockAccumulation").ToObject<double>();
  23. tg.NewBlock = jo.GetValue("NewBlock").ToObject<int>();
  24. tg.CountPerLength = jo.GetValue("CountPerLength").ToObject<double>();
  25. foreach (JProperty item in jo.GetValue("VectorByBlock"))
  26. tg.VectorByBlock[ToVectorInt(JArray.Parse(item.Name))] = ToVectorDouble(item.Value as JArray);
  27. tg.LastTimestamp = jo.GetValue("LastTimestamp").ToObject<long>();
  28. return tg;
  29. }
  30. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
  31. var jo = JObject.FromObject(value);
  32. var tg = value as MagnetometerAutoCalibrater;
  33. jo.Remove("Complete");
  34. jo.Remove("EllipsoidFitting");
  35. var EllipsoidFitting = tg.EllipsoidFitting;
  36. JObject _EllipsoidFitting = new JObject();
  37. _EllipsoidFitting.Add("Center", JToken.FromObject(EllipsoidFitting.Center));
  38. _EllipsoidFitting.Add("CorrectMatrixArray", JToken.FromObject(EllipsoidFitting.CorrectMatrixArray));
  39. _EllipsoidFitting.Add("Radius", JToken.FromObject(EllipsoidFitting.Radius));
  40. jo.Add("EllipsoidFitting", _EllipsoidFitting);
  41. jo.WriteTo(writer);
  42. }
  43. private EllipsoidFitting ToEllipsoidFitting(JToken jToken)
  44. {
  45. var Center = ToVectorDouble(jToken["Center"] as JArray);
  46. var CorrectMatrix = ToMatrixDouble(jToken["CorrectMatrixArray"] as JArray);
  47. var Radius = ToVectorDouble(jToken["Radius"] as JArray);
  48. return new EllipsoidFitting(Center, CorrectMatrix, Radius);
  49. }
  50. private Matrix<double> ToMatrixDouble(JArray arr)
  51. {
  52. int rcCount = arr.Count;
  53. Matrix<double> matrix = CreateMatrix.Dense<double>(rcCount, rcCount);
  54. for (var i = 0; i < rcCount; ++i)
  55. for (var j = 0; j < rcCount; ++j)
  56. matrix[i, j] = arr[i][j].Value<double>();
  57. return matrix;
  58. }
  59. private o0.Geometry.Vector<double> ToVectorDouble(JArray arr)
  60. {
  61. return new o0.Geometry.Vector<double>(arr[0].Value<double>(), arr[1].Value<double>(), arr[2].Value<double>());
  62. }
  63. private o0.Geometry.Vector<int> ToVectorInt(JArray arr)
  64. {
  65. return new o0.Geometry.Vector<int>(arr[0].Value<int>(), arr[1].Value<int>(), arr[2].Value<int>());
  66. }
  67. }