using DTS.Common.Utilities; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using static DTS.Common.Enums.DASFactory.DFConstantsAndEnums; namespace DTS.Common.DAS.Concepts { public partial class Test { /// /// A container for DTS generic module concepts. /// public sealed partial class Module { public class TiltAxis { public int AxisNumber { get; set; } public double CurrentTilt { get; set; } public string Label { get; set; } public int Inversion { get; set; } = 1; public bool IsIgnored { get; set; } = false; public double MountedOffset { get; set; } = 0.0; public double TargetOffset { get; set; } = 0.0; } public class TiltAxesHelper { bool UseForTiltCalculation { get; set; } = true; public Dictionary AxisConfigurations { get; set; } = new Dictionary(); public TiltAxis AxisOne { get; set; } public TiltAxis AxisTwo { get; set; } public double LevelTolerance { get; set; } = 0.5; public TiltAxesHelper() { AxisConfigurations = new Dictionary { { 1, new TiltAxis() }, { 2, new TiltAxis() }, { 3, new TiltAxis() } }; } /// /// Constructor to build Helper from FW Attributes. /// public TiltAxesHelper( string TiltAxes, double MountOffsetAxisOne, double MountOffsetAxisTwo, double TargetAxisOne, double TargetAxisTwo, double LevelTolerance, int AxisIgnored, bool UseForTiltCalculation) : this() { this.LevelTolerance = LevelTolerance; // Parse the TiltAxes string from e.g. "IXIYIZ" for (int i = 0; i < 3; i++) { // X, Y, or Z AxisConfigurations[i].Label = TiltAxes[i * 2].ToString(); // N = negative = -1 otherwise positive AxisConfigurations[i].Inversion = TiltAxes[i * 2 + 1] == 'N' ? -1 : 1; } if (AxisIgnored < 3) AxisConfigurations[AxisIgnored].IsIgnored = true; // References to used axes depending on ignored axis if (AxisIgnored == 1) { AxisOne = AxisConfigurations[2]; AxisTwo = AxisConfigurations[3]; } else if (AxisIgnored == 2) { AxisOne = AxisConfigurations[1]; AxisTwo = AxisConfigurations[3]; } else { AxisOne = AxisConfigurations[1]; AxisOne = AxisConfigurations[2]; } AxisOne.MountedOffset = MountOffsetAxisOne; AxisTwo.MountedOffset = MountOffsetAxisTwo; AxisOne.TargetOffset = TargetAxisOne; AxisOne.TargetOffset = TargetAxisTwo; } public string AxesToString() { string s = ""; foreach (var a in AxisConfigurations) s = s + (a.Value.Label) + (a.Value.Inversion == -1 ? "N" : "P"); return s; } } public enum TiltAxesSimple { XYZ = 0, XZY = 1, YXZ = 2, YZX = 3, ZXY = 4, ZYX = 5, } public static TiltAxesSimple SimplifyTiltAxes(TiltAxes axes) { return (TiltAxesSimple)Enum.Parse(typeof(TiltAxesSimple), axes.ToString().Replace("I", "")); } public enum TiltAxesPolarity { PPP = 0, PPN = 1, PNP = 2, PNN = 3, NPP = 4, NPN = 5, NNP = 6, NNN = 7 } /// /// Convert a string representation of a recording mode enumeration into its corresponding /// enumeration value. /// /// /// /// The representation to be converted. /// /// /// /// The value corresponding to the /// specified string, if any. If not, an exception will be thrown. /// /// public static TiltAxes GetTiltAxesFromString(string tiltAxes) { try { return (TiltAxes)Enum.Parse(typeof(TiltAxes), tiltAxes); } catch (Exception ex) { throw new Exception("encountered problem getting tilt axis from string representation " + (null != tiltAxes ? "\"" + tiltAxes + "\"" : "<>"), ex); } } public static int[] GetPolaritiesFromTiltAxes(TiltAxes ta) { var rv = new List(); var rvBool = GetBoolPolaritiesFromTiltAxes(ta); foreach (var b in rvBool) { rv.Add(b ? -1 : 1); } return rv.ToArray(); } public static bool[] GetBoolPolaritiesFromTiltAxes(TiltAxes tiltAxes) { var rv = new bool[3]; var ax = 0; var tiltAxesString = tiltAxes.ToString(); // Parse enum for I's, invert corresponding array member; for (var i = 0; i < tiltAxesString.Length; i++) { if (tiltAxesString[i] == 'I') { rv[ax] = true; } else { ax++; } } return rv; } public enum TiltSensorCalAttributes { TILTSENSOR_CAL_1_GainAxis1 = 0, TILTSENSOR_CAL_2_ZeroAxis1 = 1, TILTSENSOR_CAL_3_ZeroDomAxis2PosAxis1 = 2, TILTSENSOR_CAL_4_ZeroDomAxis2NegAxis1 = 3, TILTSENSOR_CAL_5_ZeroDomAxis3PosAxis1 = 4, TILTSENSOR_CAL_6_ZeroDomAxis3NegAxis1 = 5, TILTSENSOR_CAL_7_GainAxis2 = 6, TILTSENSOR_CAL_8_ZeroAxis2 = 7, TILTSENSOR_CAL_9_ZeroDomAxis1PosAxis2 = 8, TILTSENSOR_CAL_10_ZeroDomAxis1NegAxis2 = 9, TILTSENSOR_CAL_11_ZeroDomAxis3PosAxis2 = 10, TILTSENSOR_CAL_12_ZeroDomAxis3NegAxis2 = 11, TILTSENSOR_CAL_13_GainAxis3 = 12, TILTSENSOR_CAL_14_ZeroAxis3 = 13, TILTSENSOR_CAL_15_ZeroDomAxis1PosAxis3 = 14, TILTSENSOR_CAL_16_ZeroDomAxis1NegAxis3 = 15, TILTSENSOR_CAL_17_ZeroDomAxis2PosAxis3 = 16, TILTSENSOR_CAL_18_ZeroDomAxis2NegAxis3 = 17, } /// /// 3 digits of precision by default /// http://manuscript.dts.local/f/cases/34373/Tilt-Sensor-4-0-reported-value-significant-figure-in-DataPRO /// private const int SIGNIFICANT_DIGITS = 1000; public static double[] GetTiltDegreesEU(short[] tiltSensorADC, double[] tiltSensorCals) { return GetTiltDegreesEU(tiltSensorADC, tiltSensorCals, TiltAxes.IXYZ, 3, new float[2] { 0F, 0F }); } public static double[] GetTiltDegreesEU(short[] tiltSensorADC, double[] tiltSensorCals, TiltAxes axes, int ignoredAxis, float[] mountOffsetAxis) { var mountOffsetAxisOne = mountOffsetAxis[0]; var mountOffsetAxisTwo = mountOffsetAxis[1]; double tiltSensorAxisXDegreesPre = 0D; double tiltSensorAxisYDegreesPre = 0D; double tiltSensorAxisZDegreesPre = 0D; if (ignoredAxis == 0) { ignoredAxis = 3; } int dominantAxis = GetDominantTiltAxis(tiltSensorADC); double[] gains = GetTiltGains(tiltSensorCals); double[] zeroData = GetTiltZeroData(tiltSensorADC, tiltSensorCals, dominantAxis); var xFactor = 1; var yFactor = 1; var zFactor = 1; switch (axes) { case TiltAxes.IXIYIZ: case TiltAxes.IXIYZ: case TiltAxes.IXIZIY: case TiltAxes.IXIZY: case TiltAxes.IXYIZ: case TiltAxes.IXYZ: case TiltAxes.IXZIY: case TiltAxes.IXZY: case TiltAxes.IYIXIZ: case TiltAxes.IYIXZ: case TiltAxes.IYIZIX: case TiltAxes.IYZIX: case TiltAxes.IZIXIY: case TiltAxes.IZIXY: case TiltAxes.IZIYIX: case TiltAxes.IZYIX: case TiltAxes.YIXIZ: case TiltAxes.YIXZ: case TiltAxes.YIZIX: case TiltAxes.YZIX: case TiltAxes.ZIXIY: case TiltAxes.ZIXY: case TiltAxes.ZIYIX: case TiltAxes.ZYIX: xFactor = -1; break; } switch (axes) { case TiltAxes.IXIYIZ: case TiltAxes.IXIYZ: case TiltAxes.IXIZIY: case TiltAxes.IXZIY: case TiltAxes.IYIXIZ: case TiltAxes.IYIXZ: case TiltAxes.IYIZIX: case TiltAxes.IYIZX: case TiltAxes.IYXIZ: case TiltAxes.IYXZ: case TiltAxes.IYZIX: case TiltAxes.IYZX: case TiltAxes.IZIXIY: case TiltAxes.IZIYIX: case TiltAxes.IZIYX: case TiltAxes.IZXIY: case TiltAxes.XIYIZ: case TiltAxes.XIYZ: case TiltAxes.XIZIY: case TiltAxes.XZIY: case TiltAxes.ZIXIY: case TiltAxes.ZIYIX: case TiltAxes.ZIYX: case TiltAxes.ZXIY: yFactor = -1; break; } switch (axes) { case TiltAxes.IXIYIZ: case TiltAxes.IXIZIY: case TiltAxes.IXIZY: case TiltAxes.IXYIZ: case TiltAxes.IYIXIZ: case TiltAxes.IYIZIX: case TiltAxes.IYIZX: case TiltAxes.IYXIZ: case TiltAxes.IZIXIY: case TiltAxes.IZIXY: case TiltAxes.IZIYIX: case TiltAxes.IZIYX: case TiltAxes.IZXIY: case TiltAxes.IZXY: case TiltAxes.IZYIX: case TiltAxes.IZYX: case TiltAxes.XIYIZ: case TiltAxes.XIZIY: case TiltAxes.XIZY: case TiltAxes.XYIZ: case TiltAxes.YIXIZ: case TiltAxes.YIZIX: case TiltAxes.YIZX: case TiltAxes.YXIZ: zFactor = -1; break; } var simplifiedAxes = SimplifyTiltAxes(axes); switch (simplifiedAxes) { case TiltAxesSimple.XYZ: double Sx = xFactor * ((tiltSensorADC[0] - zeroData[0]) / gains[0]); double Sy = yFactor * ((tiltSensorADC[1] - zeroData[1]) / gains[1]); double Sz = zFactor * ((tiltSensorADC[2] - zeroData[2]) / gains[2]); double SG = Math.Sqrt(Math.Pow(Sx, 2) + Math.Pow(Sy, 2) + Math.Pow(Sz, 2)); switch (ignoredAxis) { case 1: tiltSensorAxisXDegreesPre = double.NaN; tiltSensorAxisYDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sy, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisZDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sz, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place break; case 2: tiltSensorAxisXDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sx, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisYDegreesPre = double.NaN; tiltSensorAxisZDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sz, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place break; case 3: tiltSensorAxisXDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sx, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisYDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sy, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisZDegreesPre = double.NaN; break; } break; case TiltAxesSimple.XZY: Sx = xFactor * ((tiltSensorADC[0] - zeroData[0]) / gains[0]); Sz = zFactor * ((tiltSensorADC[1] - zeroData[1]) / gains[1]); Sy = yFactor * ((tiltSensorADC[2] - zeroData[2]) / gains[2]); SG = Math.Sqrt(Math.Pow(Sx, 2) + Math.Pow(Sy, 2) + Math.Pow(Sz, 2)); switch (ignoredAxis) { case 1: tiltSensorAxisXDegreesPre = double.NaN; tiltSensorAxisZDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sz, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisYDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sy, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place break; case 2: tiltSensorAxisXDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sx, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisZDegreesPre = double.NaN; tiltSensorAxisYDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sy, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place break; case 3: tiltSensorAxisXDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sx, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisZDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sz, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisYDegreesPre = double.NaN; break; } break; case TiltAxesSimple.YXZ: Sy = yFactor * ((tiltSensorADC[0] - zeroData[0]) / gains[0]); Sx = xFactor * ((tiltSensorADC[1] - zeroData[1]) / gains[1]); Sz = zFactor * ((tiltSensorADC[2] - zeroData[2]) / gains[2]); SG = Math.Sqrt(Math.Pow(Sx, 2) + Math.Pow(Sy, 2) + Math.Pow(Sz, 2)); switch (ignoredAxis) { case 1: tiltSensorAxisYDegreesPre = double.NaN; tiltSensorAxisXDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sx, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisZDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sz, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place break; case 2: tiltSensorAxisYDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sy, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisXDegreesPre = double.NaN; tiltSensorAxisZDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sz, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place break; case 3: tiltSensorAxisYDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sy, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisXDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sx, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisZDegreesPre = double.NaN; break; } break; case TiltAxesSimple.YZX: Sy = yFactor * ((tiltSensorADC[0] - zeroData[0]) / gains[0]); Sz = zFactor * ((tiltSensorADC[1] - zeroData[1]) / gains[1]); Sx = xFactor * ((tiltSensorADC[2] - zeroData[2]) / gains[2]); SG = Math.Sqrt(Math.Pow(Sx, 2) + Math.Pow(Sy, 2) + Math.Pow(Sz, 2)); switch (ignoredAxis) { case 1: tiltSensorAxisYDegreesPre = double.NaN; tiltSensorAxisZDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sz, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisXDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sx, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place break; case 2: tiltSensorAxisYDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sy, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisZDegreesPre = double.NaN; tiltSensorAxisXDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sx, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place break; case 3: tiltSensorAxisYDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sy, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisZDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sz, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisXDegreesPre = double.NaN; break; } break; case TiltAxesSimple.ZXY: Sz = zFactor * ((tiltSensorADC[0] - zeroData[0]) / gains[0]); Sx = xFactor * ((tiltSensorADC[1] - zeroData[1]) / gains[1]); Sy = yFactor * ((tiltSensorADC[2] - zeroData[2]) / gains[2]); SG = Math.Sqrt(Math.Pow(Sx, 2) + Math.Pow(Sy, 2) + Math.Pow(Sz, 2)); switch (ignoredAxis) { case 1: tiltSensorAxisZDegreesPre = double.NaN; tiltSensorAxisXDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sx, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisYDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sy, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place break; case 2: tiltSensorAxisZDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sz, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisXDegreesPre = double.NaN; tiltSensorAxisYDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sy, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place break; case 3: tiltSensorAxisZDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sz, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisXDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sx, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisYDegreesPre = double.NaN; break; } break; case TiltAxesSimple.ZYX: Sz = zFactor * ((tiltSensorADC[0] - zeroData[0]) / gains[0]); Sy = yFactor * ((tiltSensorADC[1] - zeroData[1]) / gains[1]); Sx = xFactor * ((tiltSensorADC[2] - zeroData[2]) / gains[2]); SG = Math.Sqrt(Math.Pow(Sx, 2) + Math.Pow(Sy, 2) + Math.Pow(Sz, 2)); switch (ignoredAxis) { case 1: tiltSensorAxisZDegreesPre = double.NaN; tiltSensorAxisYDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sy, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisXDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sx, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place break; case 2: tiltSensorAxisZDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sz, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisYDegreesPre = double.NaN; tiltSensorAxisXDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sx, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place break; case 3: tiltSensorAxisZDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sz, SG) + mountOffsetAxisOne) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisYDegreesPre = Math.Round((DegreesFromADC.GetDegrees(Sy, SG) + mountOffsetAxisTwo) * SIGNIFICANT_DIGITS) / SIGNIFICANT_DIGITS; //1 decimal place tiltSensorAxisXDegreesPre = double.NaN; break; } break; } return new double[] { tiltSensorAxisXDegreesPre, tiltSensorAxisYDegreesPre, tiltSensorAxisZDegreesPre }; } public static double[] GetTiltZeroData(short[] tiltSensorADC, double[] tiltSensorCals, int dominantAxis) { double[] zeroData = new double[] { tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_2_ZeroAxis1], tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_8_ZeroAxis2], tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_14_ZeroAxis3] }; bool positivePolarity = (tiltSensorADC[dominantAxis] > 0); switch (dominantAxis) { case 0: zeroData[1] = (positivePolarity) ? tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_9_ZeroDomAxis1PosAxis2] : tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_10_ZeroDomAxis1NegAxis2]; zeroData[2] = (positivePolarity) ? tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_15_ZeroDomAxis1PosAxis3] : tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_16_ZeroDomAxis1NegAxis3]; break; case 1: zeroData[0] = (positivePolarity) ? tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_3_ZeroDomAxis2PosAxis1] : tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_4_ZeroDomAxis2NegAxis1]; zeroData[2] = (positivePolarity) ? tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_17_ZeroDomAxis2PosAxis3] : tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_18_ZeroDomAxis2NegAxis3]; break; case 2: zeroData[0] = (positivePolarity) ? tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_5_ZeroDomAxis3PosAxis1] : tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_6_ZeroDomAxis3NegAxis1]; zeroData[1] = (positivePolarity) ? tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_11_ZeroDomAxis3PosAxis2] : tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_12_ZeroDomAxis3NegAxis2]; break; } return zeroData; } public static int GetDominantTiltAxis(short[] tiltSensorADC) { return (tiltSensorADC.Max() < Math.Abs(tiltSensorADC.Min())) ? Array.IndexOf(tiltSensorADC, tiltSensorADC.Min()) : Array.IndexOf(tiltSensorADC, tiltSensorADC.Max()); } public static double[] GetTiltGains(double[] tiltSensorCals) { double[] gains = new double[3]; gains[0] = tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_1_GainAxis1] == 0D ? 1D : tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_1_GainAxis1]; gains[1] = tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_7_GainAxis2] == 0D ? 1D : tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_7_GainAxis2]; gains[2] = tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_13_GainAxis3] == 0D ? 1D : tiltSensorCals[(int)TiltSensorCalAttributes.TILTSENSOR_CAL_13_GainAxis3]; return gains; } public enum AxisLabel { X = 0, Y = 1, Z = 2, } public static AxisLabel[] GetAxisLabelFromTiltAxes(TiltAxes tiltAxes) { var simplifiedTiltAxes = SimplifyTiltAxes(tiltAxes); var axesLabelChars = simplifiedTiltAxes.ToString().ToCharArray(); var rv = new AxisLabel[axesLabelChars.Length]; for (int i = 0; i < rv.Length; i++) { rv[i] = (AxisLabel)Enum.Parse(typeof(AxisLabel), axesLabelChars[i].ToString()); } return rv; } public static AxisLabel[] GetAxisLabelFromTiltAxes(string tiltAxes) { return GetAxisLabelFromTiltAxes(GetTiltAxesFromString(tiltAxes)); } public static string ConvertBoolToInvertString(bool isInverted) { return isInverted ? "I" : ""; } public static string GetOrientationLabelFromAxisInfo(string[] axisLabels, bool[] invertAxis) { var sb = new StringBuilder(); for (int i = 0; i < 3; i++) { sb.Append($"{ConvertBoolToInvertString(invertAxis[i])}{axisLabels[i]}"); } return sb.ToString(); } public static TiltAxes GetTiltAxesFromAxisInfo(string[] axisLabels, bool[] invertAxis) { return GetTiltAxesFromString(GetOrientationLabelFromAxisInfo(axisLabels, invertAxis)); } public static float[] GetMountOffsetsOrTargetsFromAxisInfo(float[] perAxisValue, int axisToIgnore) { var rv = new float[2]; switch (axisToIgnore) { case 1: rv[0] = perAxisValue[1]; rv[1] = perAxisValue[2]; break; case 2: rv[0] = perAxisValue[0]; rv[1] = perAxisValue[2]; break; case 3: rv[0] = perAxisValue[0]; rv[1] = perAxisValue[1]; break; } return rv; } } } }