private static SequenceComponents CalculateSequenceComponents(Complex an, Complex bn, Complex cn) { double TwoPI = 2.0D * Math.PI; double Rad120 = TwoPI / 3.0D; Complex a = new Complex(Math.Cos(Rad120), Math.Sin(Rad120)); Complex aSq = a * a; SequenceComponents sequenceComponents = new SequenceComponents(); sequenceComponents.S0 = (an + bn + cn) / 3.0D; sequenceComponents.S1 = (an + a * bn + aSq * cn) / 3.0D; sequenceComponents.S2 = (an + aSq * bn + a * cn) / 3.0D; return(sequenceComponents); }
public ActionResult Get(int eventID, int pixels) { using (AdoDataConnection connection = new AdoDataConnection(m_configuration["OpenXDA:ConnectionString"], m_configuration["OpenXDA:DataProviderString"])) { Event evt = new TableOperations <Event>(connection).QueryRecordWhere("ID = {0}", eventID); if (evt == null) { return(BadRequest("Must provide a valid EventID")); } Meter meter = new TableOperations <Meter>(connection).QueryRecordWhere("ID = {0}", evt.MeterID); meter.ConnectionFactory = () => new AdoDataConnection(m_configuration["OpenXDA:ConnectionString"], m_configuration["OpenXDA:DataProviderString"]); Dictionary <string, IEnumerable <double[]> > returnData = new Dictionary <string, IEnumerable <double[]> >(); DataGroupHelper dataGroupHelper = new DataGroupHelper(m_configuration, m_memoryCache); VICycleDataGroup vICycleDataGroup = dataGroupHelper.QueryVICycleDataGroup(eventID, meter); Dictionary <string, List <double[]> > returnList = new Dictionary <string, List <double[]> >(); if (vICycleDataGroup.VA != null && vICycleDataGroup.VB != null && vICycleDataGroup.VC != null) { var va = vICycleDataGroup.VA.RMS.DataPoints; var vaPhase = vICycleDataGroup.VA.Phase.DataPoints; var vb = vICycleDataGroup.VB.RMS.DataPoints; var vbPhase = vICycleDataGroup.VB.Phase.DataPoints; var vc = vICycleDataGroup.VC.RMS.DataPoints; var vcPhase = vICycleDataGroup.VC.Phase.DataPoints; IEnumerable <SequenceComponents> sequencComponents = va.Select((point, index) => { DataPoint vaPoint = point; DataPoint vaPhasePoint = vaPhase[index]; Complex vaComplex = Complex.FromPolarCoordinates(vaPoint.Value, vaPhasePoint.Value); DataPoint vbPoint = vb[index]; DataPoint vbPhasePoint = vbPhase[index]; Complex vbComplex = Complex.FromPolarCoordinates(vbPoint.Value, vbPhasePoint.Value); DataPoint vcPoint = vc[index]; DataPoint vcPhasePoint = vcPhase[index]; Complex vcComplex = Complex.FromPolarCoordinates(vcPoint.Value, vcPhasePoint.Value); SequenceComponents sequenceComponents = CalculateSequenceComponents(vaComplex, vbComplex, vcComplex); return(sequenceComponents); }); returnList.Add("S0/S1 Voltage", sequencComponents.Select((point, index) => new double[] { va[index].Time.Subtract(m_epoch).TotalMilliseconds, point.S0.Magnitude / point.S1.Magnitude * 100.0D }).ToList()); returnList.Add("S2/S1 Voltage", sequencComponents.Select((point, index) => new double[] { va[index].Time.Subtract(m_epoch).TotalMilliseconds, point.S2.Magnitude / point.S1.Magnitude * 100.0D }).ToList()); } if (vICycleDataGroup.IA != null && vICycleDataGroup.IB != null && vICycleDataGroup.IC != null) { var ia = vICycleDataGroup.IA.RMS.DataPoints; var iaPhase = vICycleDataGroup.IA.Phase.DataPoints; var ib = vICycleDataGroup.IB.RMS.DataPoints; var ibPhase = vICycleDataGroup.IB.Phase.DataPoints; var ic = vICycleDataGroup.IC.RMS.DataPoints; var icPhase = vICycleDataGroup.IC.Phase.DataPoints; IEnumerable <SequenceComponents> sequencComponents = ia.Select((point, index) => { DataPoint iaPoint = point; DataPoint iaPhasePoint = iaPhase[index]; Complex iaComplex = Complex.FromPolarCoordinates(iaPoint.Value, iaPhasePoint.Value); DataPoint ibPoint = ib[index]; DataPoint ibPhasePoint = ibPhase[index]; Complex ibComplex = Complex.FromPolarCoordinates(ibPoint.Value, ibPhasePoint.Value); DataPoint icPoint = ic[index]; DataPoint icPhasePoint = icPhase[index]; Complex icComplex = Complex.FromPolarCoordinates(icPoint.Value, icPhasePoint.Value); SequenceComponents sequenceComponents = CalculateSequenceComponents(iaComplex, ibComplex, icComplex); return(sequenceComponents); }); returnList.Add("S0/S1 Current", sequencComponents.Select((point, index) => new double[] { ia[index].Time.Subtract(m_epoch).TotalMilliseconds, point.S0.Magnitude / point.S1.Magnitude * 100.0D }).ToList()); returnList.Add("S2/S1 Current", sequencComponents.Select((point, index) => new double[] { ia[index].Time.Subtract(m_epoch).TotalMilliseconds, point.S2.Magnitude / point.S1.Magnitude * 100.0D }).ToList()); } return(Ok(returnList)); } }