1   /* Copyright 2002-2015 CS Systèmes d'Information
2    * Licensed to CS Systèmes d'Information (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.frames;
18  
19  import org.orekit.errors.OrekitException;
20  import org.orekit.time.AbsoluteDate;
21  import org.orekit.utils.PVCoordinatesProvider;
22  
23  /** Class for frames moving with an orbiting satellite.
24   * <p>There are several local orbital frames available. They are specified
25   * by the {@link LOFType} enumerate.</p>
26   * @author Luc Maisonobe
27   */
28  public class LocalOrbitalFrame extends Frame {
29  
30      /** Serializable UID. */
31      private static final long serialVersionUID = -4469440345574964950L;
32  
33      /** Build a new instance.
34       * @param parent parent frame (must be non-null)
35       * @param type frame type
36       * @param provider provider used to compute frame motion
37       * @param name name of the frame
38       * @exception IllegalArgumentException if the parent frame is null
39       */
40      public LocalOrbitalFrame(final Frame parent, final LOFType type,
41                               final PVCoordinatesProvider provider,
42                               final String name)
43          throws IllegalArgumentException {
44          super(parent, new LocalProvider(type, provider, parent), name, false);
45      }
46  
47      /** Local provider for transforms. */
48      private static class LocalProvider implements TransformProvider {
49  
50          /** Serializable UID. */
51          private static final long serialVersionUID = 386815086579675823L;
52  
53          /** Frame type. */
54          private final LOFType type;
55  
56          /** Provider used to compute frame motion. */
57          private final PVCoordinatesProvider provider;
58  
59          /** Reference frame. */
60          private final Frame reference;
61  
62          /** Simple constructor.
63           * @param type frame type
64           * @param provider provider used to compute frame motion
65           * @param reference reference frame
66           */
67          public LocalProvider(final LOFType type, final PVCoordinatesProvider provider,
68                               final Frame reference) {
69              this.type      = type;
70              this.provider  = provider;
71              this.reference = reference;
72          }
73  
74          /** {@inheritDoc} */
75          public Transform getTransform(final AbsoluteDate date) throws OrekitException {
76              return type.transformFromInertial(date, provider.getPVCoordinates(date, reference));
77          }
78  
79      }
80  
81  }