Skip to content

Commit

Permalink
feature/dataprovider (#210)
Browse files Browse the repository at this point in the history
* Add async operation on dataprovider

* Update version
  • Loading branch information
sylvain-guillet authored Sep 28, 2024
1 parent 6d0e0f3 commit 268ffc0
Show file tree
Hide file tree
Showing 8 changed files with 766 additions and 733 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<FileVersion>0.0.1</FileVersion>
<PackAsTool>true</PackAsTool>
<ToolCommandName>astro</ToolCommandName>
<Version>0.5.0-preview-5</Version>
<Version>0.5.0-preview-6</Version>
<Title>Astrodynamics command line interface</Title>
<Authors>Sylvain Guillet</Authors>
<Description>This CLI allows end user to exploit IO.Astrodynamics framework </Description>
Expand Down
7 changes: 3 additions & 4 deletions IO.Astrodynamics.Net/IO.Astrodynamics.Tests/APITest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -497,8 +497,7 @@ void GetCelestialBodyInformationWithoutJ()
void TransformFrame()
{
//Get the quaternion to transform
var res = API.Instance.TransformFrame(Frames.Frame.ICRF, new Frames.Frame(PlanetsAndMoons.EARTH.Frame),
TimeSystem.Time.J2000TDB);
var res = API.Instance.TransformFrame(TimeSystem.Time.J2000TDB,Frames.Frame.ICRF, new Frames.Frame(PlanetsAndMoons.EARTH.Frame));
Assert.Equal(0.76713121207787449, res.Rotation.W, 6);
Assert.Equal(-1.8618836714990174E-05, res.Rotation.VectorPart.X, 6);
Assert.Equal(8.4688405480964646E-07, res.Rotation.VectorPart.Y, 6);
Expand All @@ -513,9 +512,9 @@ void TransformFrameExceptions()
{
//Get the quaternion to transform
Assert.Throws<ArgumentNullException>(() =>
API.Instance.TransformFrame(Frames.Frame.ICRF, null, TimeSystem.Time.J2000TDB));
API.Instance.TransformFrame(TimeSystem.Time.J2000TDB,Frames.Frame.ICRF, null));
Assert.Throws<ArgumentNullException>(() =>
API.Instance.TransformFrame(null, new Frames.Frame(PlanetsAndMoons.EARTH.Frame), TimeSystem.Time.J2000TDB));
API.Instance.TransformFrame(TimeSystem.Time.J2000TDB,null, new Frames.Frame(PlanetsAndMoons.EARTH.Frame)));
}

[Fact]
Expand Down
1,422 changes: 715 additions & 707 deletions IO.Astrodynamics.Net/IO.Astrodynamics/API.cs

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,6 @@ public abstract class CelestialItem : ILocalizable, IEquatable<CelestialItem>
/// <param name="frame">Initial orbital parameters frame</param>
/// <param name="epoch">Epoch</param>
/// <param name="geopotentialModelParameters"></param>
/// <param name="dataProvider"></param>
protected CelestialItem(int naifId, Frame frame, in Time epoch, GeopotentialModelParameters geopotentialModelParameters = null)
{
_dataProvider = Configuration.Instance.DataProvider;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using IO.Astrodynamics.Body;
using IO.Astrodynamics.Frames;
using IO.Astrodynamics.OrbitalParameters;
Expand All @@ -9,9 +11,12 @@ namespace IO.Astrodynamics.DataProvider;

public interface IDataProvider
{
StateOrientation FrameTransformation(Frame source, Frame target, in Time date);
OrbitalParameters.OrbitalParameters GetEphemeris(in Time epoch, ILocalizable target, ILocalizable observer, Frame frame, Aberration aberration);
Task<IEnumerable<StateOrientation>> FrameTransformationAsync(Window window, Frame source, Frame target, TimeSpan stepSize);
StateOrientation FrameTransformation(in Time date, Frame source, Frame target);
OrbitalParameters.OrbitalParameters GetEphemeris(in Time date, ILocalizable target, ILocalizable observer, Frame frame, Aberration aberration);
Task<IEnumerable<OrbitalParameters.OrbitalParameters>> GetEphemerisAsync(Window window, ILocalizable target, ILocalizable observer, Frame frame, Aberration aberration, TimeSpan stepSize);
Task<DTO.CelestialBody> GetCelestialBodyInfoAsync(int naifId);
DTO.CelestialBody GetCelestialBodyInfo(int naifId);
void WriteEphemeris(FileInfo outputFile,INaifObject naifObject, IEnumerable<StateVector> stateVectors);
void WriteOrientation(FileInfo outputFile,INaifObject naifObject, IEnumerable<StateOrientation> stateOrientations);
void WriteEphemeris(FileInfo outputFile, INaifObject naifObject, IEnumerable<StateVector> stateVectors);
void WriteOrientation(FileInfo outputFile, INaifObject naifObject, IEnumerable<StateOrientation> stateOrientations);
}
Original file line number Diff line number Diff line change
@@ -1,27 +1,46 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using IO.Astrodynamics.Body;
using IO.Astrodynamics.Frames;
using IO.Astrodynamics.Math;
using IO.Astrodynamics.OrbitalParameters;
using IO.Astrodynamics.SolarSystemObjects;
using IO.Astrodynamics.TimeSystem;
using CelestialBody = IO.Astrodynamics.DTO.CelestialBody;

namespace IO.Astrodynamics.DataProvider;

public class SpiceDataProvider : IDataProvider
{
public StateOrientation FrameTransformation(Frame source, Frame target, in Time date)
public Task<IEnumerable<StateOrientation>> FrameTransformationAsync(Window window, Frame source, Frame target, TimeSpan stepSize)
{
return API.Instance.TransformFrame(source, target, date);
return Task.Run(() => API.Instance.TransformFrame(window, source, target, stepSize));
}

public OrbitalParameters.OrbitalParameters GetEphemeris(in Time epoch, ILocalizable target, ILocalizable observer, Frame frame, Aberration aberration)
public StateOrientation FrameTransformation(in Time date, Frame source, Frame target)
{
return API.Instance.ReadEphemeris(epoch, observer, target, frame, aberration);
return API.Instance.TransformFrame(date, source, target);
}

public DTO.CelestialBody GetCelestialBodyInfo(int naifId)
public OrbitalParameters.OrbitalParameters GetEphemeris(in Time date, ILocalizable target, ILocalizable observer, Frame frame, Aberration aberration)
{
return API.Instance.ReadEphemeris(date, observer, target, frame, aberration);
}

public Task<IEnumerable<OrbitalParameters.OrbitalParameters>> GetEphemerisAsync(Window window, ILocalizable target, ILocalizable observer, Frame frame, Aberration aberration,
TimeSpan stepSize)
{
return Task.Run(() => API.Instance.ReadEphemeris(window, observer, target, frame, aberration, stepSize));
}

public Task<DTO.CelestialBody> GetCelestialBodyInfoAsync(int naifId)
{
return Task.Run(() => API.Instance.GetCelestialBodyInfo(naifId));
}

CelestialBody IDataProvider.GetCelestialBodyInfo(int naifId)
{
return API.Instance.GetCelestialBodyInfo(naifId);
}
Expand Down
23 changes: 13 additions & 10 deletions IO.Astrodynamics.Net/IO.Astrodynamics/Frames/Frame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Collections.Immutable;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using IO.Astrodynamics.DataProvider;
using IO.Astrodynamics.Math;
using IO.Astrodynamics.OrbitalParameters;
Expand All @@ -17,7 +18,7 @@ public class Frame : IEquatable<Frame>
public string Name { get; }
public int? Id { get; }

protected SortedDictionary<Time,StateOrientation> _stateOrientationsToICRF = new();
protected SortedDictionary<Time, StateOrientation> _stateOrientationsToICRF = new();
protected ImmutableSortedDictionary<Time, StateOrientation> StateOrientationsToICRF => _stateOrientationsToICRF.ToImmutableSortedDictionary();

/// <summary>
Expand Down Expand Up @@ -67,25 +68,25 @@ public Frame(string name, int? id = null)
Name = name;
Id = id;
}
public virtual StateOrientation GetStateOrientationToICRF(Time epoch)

public virtual StateOrientation GetStateOrientationToICRF(Time date)
{
return _stateOrientationsToICRF.GetOrAdd(epoch, _ => _dataProvider.FrameTransformation(this, ICRF, epoch));
return _stateOrientationsToICRF.GetOrAdd(date, dt => _dataProvider.FrameTransformation(dt, this, ICRF));
}

public bool AddStateOrientationToICRF(StateOrientation stateOrientation)
{
return _stateOrientationsToICRF.TryAdd(stateOrientation.Epoch, stateOrientation);
}

public StateOrientation GetLatestStateOrientationToICRF()
{
return _stateOrientationsToICRF.Values.OrderBy(x=>x.Epoch).LastOrDefault();
return _stateOrientationsToICRF.Values.OrderBy(x => x.Epoch).LastOrDefault();
}

public IEnumerable<StateOrientation> GetStateOrientationsToICRF()
{
return _stateOrientationsToICRF.OrderBy(x=>x.Key).Select(x=>x.Value).ToArray();
return _stateOrientationsToICRF.OrderBy(x => x.Key).Select(x => x.Value).ToArray();
}

public StateOrientation ToFrame(Frame targetFrame, Time epoch)
Expand All @@ -104,13 +105,14 @@ public StateOrientation ToFrame(Frame targetFrame, Time epoch)

return new StateOrientation(rotation, angularVelocity, epoch, this);
}

public void ClearStateOrientations()
{
_stateOrientationsToICRF.Clear();
}

#region Operators

public override string ToString()
{
return Name;
Expand Down Expand Up @@ -145,5 +147,6 @@ public override int GetHashCode()
{
return !Equals(left, right);
}

#endregion
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<id>IO.Astrodynamics</id>
<authors>Sylvain Guillet</authors>
<copyright>Sylvain Guillet</copyright>
<version>6.0.0-preview-5</version>
<version>6.0.0-preview-6</version>
<title>Astrodynamics framework</title>
<icon>images\dragonfly-dark-trans.png</icon>
<readme>docs\README.md</readme>
Expand Down

0 comments on commit 268ffc0

Please sign in to comment.