Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
LUGAN
Orekit
Commits
6eeb8d8b
Commit
6eeb8d8b
authored
Mar 16, 2019
by
Luc Maisonobe
Browse files
Merge branch 'issue-534' into release-9.3
parents
eb600144
b86ca507
Changes
8
Hide whitespace changes
Inline
Side-by-side
pom.xml
View file @
6eeb8d8b
...
...
@@ -5,7 +5,7 @@
<groupId>
org.orekit
</groupId>
<artifactId>
orekit
</artifactId>
<packaging>
jar
</packaging>
<version>
9.3
</version>
<version>
9.3
.1
</version>
<name>
ORbit Extrapolation KIT
</name>
<url>
http://www.orekit.org/
</url>
...
...
src/main/java/org/orekit/frames/EOPHistory.java
View file @
6eeb8d8b
...
...
@@ -590,7 +590,7 @@ public class EOPHistory implements Serializable {
/** Get a non-modifiable view of the EOP entries.
* @return non-modifiable view of the EOP entries
*/
List
<
EOPEntry
>
getEntries
()
{
public
List
<
EOPEntry
>
getEntries
()
{
return
cache
.
getAll
();
}
...
...
src/main/java/org/orekit/time/GPSDate.java
View file @
6eeb8d8b
...
...
@@ -17,9 +17,13 @@
package
org.orekit.time
;
import
java.io.Serializable
;
import
java.util.List
;
import
java.util.concurrent.atomic.AtomicReference
;
import
org.hipparchus.util.FastMath
;
import
org.orekit.frames.EOPEntry
;
import
org.orekit.utils.Constants
;
import
org.orekit.utils.IERSConventions
;
/** Container for date in GPS form.
* @author Luc Maisonobe
...
...
@@ -31,12 +35,26 @@ public class GPSDate implements Serializable, TimeStamped {
/** Serializable UID. */
private
static
final
long
serialVersionUID
=
20180633L
;
/** Duration of a week in days. */
private
static
final
int
WEEK_D
=
7
;
/** Duration of a week in seconds. */
private
static
final
double
WEEK
=
7
*
Constants
.
JULIAN_DAY
;
private
static
final
double
WEEK_S
=
WEEK_D
*
Constants
.
JULIAN_DAY
;
/** Number of weeks in one rollover cycle. */
private
static
final
int
CYCLE_W
=
1024
;
/** Number of days in one rollover cycle. */
private
static
final
int
CYCLE_D
=
WEEK_D
*
CYCLE_W
;
/**
c
onversion factor from seconds to milliseconds. */
/**
C
onversion factor from seconds to milliseconds. */
private
static
final
double
S_TO_MS
=
1000.0
;
/** Reference date for ensuring continuity across GPS week rollover.
* @since 9.3.1
*/
private
static
AtomicReference
<
DateComponents
>
rolloverReference
=
new
AtomicReference
<
DateComponents
>(
null
);
/** Week number since {@link AbsoluteDate#GPS_EPOCH GPS epoch}. */
private
final
int
weekNumber
;
...
...
@@ -47,22 +65,52 @@ public class GPSDate implements Serializable, TimeStamped {
private
final
transient
AbsoluteDate
date
;
/** Build an instance corresponding to a GPS date.
* <p>GPS dates are provided as a week number starting at
* {@link AbsoluteDate#GPS_EPOCH GPS epoch} and as a number of milliseconds
* since week start.</p>
* @param weekNumber week number since {@link AbsoluteDate#GPS_EPOCH GPS epoch}
* <p>
* GPS dates are provided as a week number starting at {@link AbsoluteDate#GPS_EPOCH GPS epoch}
* and as a number of milliseconds since week start.
* </p>
* <p>
* Many interfaces provide only the 10 lower bits of the GPS week number, just as it comes from
* the GPS signal. In other words they use a week number modulo 1024. In order to cope with
* this, when the week number is smaller than 1024, this constructor assumes a modulo operation
* has been performed and it will fix the week number according to the reference date set up for
* handling rollover (see {@link #setRolloverReference(DateComponents) setRolloverReference(reference)}).
* If the week number is 1024 or larger, it will be used without any correction.
* </p>
* @param weekNumber week number, either absolute or modulo 1024
* @param milliInWeek number of milliseconds since week start
*/
public
GPSDate
(
final
int
weekNumber
,
final
double
milliInWeek
)
{
this
.
weekNumber
=
weekNumber
;
this
.
milliInWeek
=
milliInWeek
;
final
int
day
=
(
int
)
FastMath
.
floor
(
milliInWeek
/
(
Constants
.
JULIAN_DAY
*
S_TO_MS
));
final
double
secondsInDay
=
milliInWeek
/
S_TO_MS
-
day
*
Constants
.
JULIAN_DAY
;
date
=
new
AbsoluteDate
(
new
DateComponents
(
DateComponents
.
GPS_EPOCH
,
weekNumber
*
7
+
day
),
new
TimeComponents
(
secondsInDay
),
TimeScalesFactory
.
getGPS
());
int
w
=
weekNumber
;
DateComponents
dc
=
new
DateComponents
(
DateComponents
.
GPS_EPOCH
,
weekNumber
*
7
+
day
);
if
(
weekNumber
<
1024
)
{
DateComponents
reference
=
rolloverReference
.
get
();
if
(
reference
==
null
)
{
// lazy setting of a default reference, using end of EOP entries
final
UT1Scale
ut1
=
TimeScalesFactory
.
getUT1
(
IERSConventions
.
IERS_2010
,
true
);
final
List
<
EOPEntry
>
eop
=
ut1
.
getEOPHistory
().
getEntries
();
final
int
lastMJD
=
eop
.
get
(
eop
.
size
()
-
1
).
getMjd
();
reference
=
new
DateComponents
(
DateComponents
.
MODIFIED_JULIAN_EPOCH
,
lastMJD
);
rolloverReference
.
compareAndSet
(
null
,
reference
);
}
// fix GPS week rollover
while
(
dc
.
getJ2000Day
()
<
reference
.
getJ2000Day
()
-
CYCLE_D
/
2
)
{
dc
=
new
DateComponents
(
dc
,
CYCLE_D
);
w
+=
CYCLE_W
;
}
}
this
.
weekNumber
=
w
;
this
.
milliInWeek
=
milliInWeek
;
date
=
new
AbsoluteDate
(
dc
,
new
TimeComponents
(
secondsInDay
),
TimeScalesFactory
.
getGPS
());
}
...
...
@@ -71,14 +119,49 @@ public class GPSDate implements Serializable, TimeStamped {
*/
public
GPSDate
(
final
AbsoluteDate
date
)
{
this
.
weekNumber
=
(
int
)
FastMath
.
floor
(
date
.
durationFrom
(
AbsoluteDate
.
GPS_EPOCH
)
/
WEEK
);
final
AbsoluteDate
weekStart
=
new
AbsoluteDate
(
AbsoluteDate
.
GPS_EPOCH
,
WEEK
*
weekNumber
);
this
.
weekNumber
=
(
int
)
FastMath
.
floor
(
date
.
durationFrom
(
AbsoluteDate
.
GPS_EPOCH
)
/
WEEK
_S
);
final
AbsoluteDate
weekStart
=
new
AbsoluteDate
(
AbsoluteDate
.
GPS_EPOCH
,
WEEK
_S
*
weekNumber
);
this
.
milliInWeek
=
date
.
durationFrom
(
weekStart
)
*
S_TO_MS
;
this
.
date
=
date
;
}
/** Set a reference date for ensuring continuity across GPS week rollover.
* <p>
* Instance created using the {@link #GPSDate(int, double) GPSDate(weekNumber, milliInWeek)}
* constructor and with a week number between 0 and 1024 after this method has been called will
* fix the week number to ensure they correspond to dates between {@code reference - 512 weeks}
* and {@code reference + 512 weeks}.
* </p>
* <p>
* If this method is never called, a default reference date for rollover will be set using
* the date of the last known EOP entry retrieved from {@link UT1Scale#getEOPHistory() UT1}
* time scale.
* </p>
* @param reference reference date for GPS week rollover
* @see #getRolloverReference()
* @see #GPSDate(int, double)
* @since 9.3.1
*/
public
static
void
setRolloverReference
(
final
DateComponents
reference
)
{
rolloverReference
.
set
(
reference
);
}
/** Get the reference date ensuring continuity across GPS week rollover.
* @return reference reference date for GPS week rollover
* @see #setRolloverReference(AbsoluteDate)
* @see #GPSDate(int, double)
* @since 9.3.1
*/
public
static
DateComponents
getRolloverReference
()
{
return
rolloverReference
.
get
();
}
/** Get the week number since {@link AbsoluteDate#GPS_EPOCH GPS epoch}.
* <p>
* The week number returned here has been fixed for GPS week rollover, i.e.
* it may be larger than 1024.
* </p>
* @return week number since {@link AbsoluteDate#GPS_EPOCH GPS epoch}
*/
public
int
getWeekNumber
()
{
...
...
src/site/markdown/downloads.md
View file @
6eeb8d8b
...
...
@@ -43,9 +43,14 @@ as required.
| package | link |
|----------|---------------------------------------------------------------------------------------------------------------------------------------|
| source | orekit-9.3-sources.zip (URL to be defined after official release) |
| binary | orekit-9.3.jar (URL to be defined after official release) |
| javadoc | orekit-9.3-javadoc.jar (URL to be defined after official release) |
| source | orekit-9.3.1-sources.zip (URL to be defined after official release) |
| binary | orekit-9.3.1.jar (URL to be defined after official release) |
version 9.3.1 downloads (release date: 2019-03-16)
| package | link |
|----------|---------------------------------------------------------------------------------------------------------------------------------------|
| source |
[
orekit-9.3-sources.zip
](
https://gitlab.orekit.org/orekit/orekit/uploads/e313519415d0313043587739d417abcb/orekit-9.3-sources.zip
)
|
| binary |
[
orekit-9.3.jar
](
https://gitlab.orekit.org/orekit/orekit/uploads/32bc68ad2f4e58d1e8de71dbc4ff3494/orekit-9.3.jar
)
|
version 9.3 downloads (release date: 2019-01-25)
| package | link |
...
...
src/site/xdoc/changes.xml
View file @
6eeb8d8b
...
...
@@ -20,6 +20,12 @@
<title>
Orekit Changes
</title>
</properties>
<body>
<release
version=
"9.3.1"
date=
"2019-03-16"
description=
"Version 9.3.1 is a minor version of Orekit.
It fixes an issue with GPS week rollover."
>
<action
dev=
"luc"
type=
"add"
issue=
"534"
>
Handle GPS week rollover in GPSDate.
</action>
</release>
<release
version=
"9.3"
date=
"2019-01-25"
description=
"Version 9.3 is a minor version of Orekit.
It includes both new features and bug fixes. New features introduced in 9.3 are: a new GPSDate class,
changed OrekitException from checked to unchecked exceptions, parameter drivers scales and reference
...
...
src/test/java/org/orekit/Utils.java
View file @
6eeb8d8b
...
...
@@ -42,6 +42,7 @@ import org.orekit.propagation.semianalytical.dsst.utilities.JacobiPolynomials;
import
org.orekit.propagation.semianalytical.dsst.utilities.NewcombOperators
;
import
org.orekit.time.AbsoluteDate
;
import
org.orekit.time.DateComponents
;
import
org.orekit.time.GPSDate
;
import
org.orekit.time.TimeScale
;
import
org.orekit.time.TimeScalesFactory
;
import
org.orekit.utils.Constants
;
...
...
@@ -85,6 +86,7 @@ public class Utils {
FramesFactory
.
clearEOPHistoryLoaders
();
FramesFactory
.
setEOPContinuityThreshold
(
5
*
Constants
.
JULIAN_DAY
);
TimeScalesFactory
.
clearUTCTAIOffsetsLoaders
();
GPSDate
.
setRolloverReference
(
null
);
GravityFieldFactory
.
clearPotentialCoefficientsReaders
();
GravityFieldFactory
.
clearOceanTidesReaders
();
DataProvidersManager
.
getInstance
().
clearProviders
();
...
...
src/test/java/org/orekit/propagation/analytical/gnss/GPSPropagatorTest.java
View file @
6eeb8d8b
...
...
@@ -36,6 +36,7 @@ import org.orekit.propagation.SpacecraftState;
import
org.orekit.propagation.analytical.tle.TLE
;
import
org.orekit.propagation.analytical.tle.TLEPropagator
;
import
org.orekit.time.AbsoluteDate
;
import
org.orekit.time.DateComponents
;
import
org.orekit.time.GPSDate
;
import
org.orekit.time.TimeScalesFactory
;
import
org.orekit.utils.CartesianDerivativesFilter
;
...
...
@@ -51,6 +52,7 @@ public class GPSPropagatorTest {
@BeforeClass
public
static
void
setUpBeforeClass
()
{
Utils
.
setDataRoot
(
"gnss"
);
GPSDate
.
setRolloverReference
(
new
DateComponents
(
DateComponents
.
GPS_EPOCH
,
7
*
512
));
// Get the parser to read a SEM file
SEMParser
reader
=
new
SEMParser
(
null
);
// Reads the SEM file
...
...
src/test/java/org/orekit/time/GPSDateTest.java
View file @
6eeb8d8b
...
...
@@ -38,6 +38,7 @@ public class GPSDateTest {
Assert
.
assertEquals
(
1387
,
date
.
getWeekNumber
());
Assert
.
assertEquals
(
318677000.0
,
date
.
getMilliInWeek
(),
1.0
e
-
15
);
Assert
.
assertEquals
(
0
,
date
.
getDate
().
durationFrom
(
ref
),
1.0
e
-
15
);
Assert
.
assertNull
(
GPSDate
.
getRolloverReference
());
}
@Test
...
...
@@ -56,6 +57,34 @@ public class GPSDateTest {
Assert
.
assertEquals
(
0.0
,
date
.
getMilliInWeek
(),
1.0
e
-
15
);
}
@Test
public
void
testZeroZero
()
{
GPSDate
.
setRolloverReference
(
new
DateComponents
(
DateComponents
.
GPS_EPOCH
,
7
*
512
));
GPSDate
date1
=
new
GPSDate
(
0
,
0.0
);
Assert
.
assertEquals
(
0.0
,
date1
.
getDate
().
durationFrom
(
AbsoluteDate
.
GPS_EPOCH
),
1.0
e
-
15
);
GPSDate
.
setRolloverReference
(
new
DateComponents
(
GPSDate
.
getRolloverReference
(),
1
));
GPSDate
date2
=
new
GPSDate
(
0
,
0.0
);
Assert
.
assertEquals
(
1024
,
date2
.
getWeekNumber
());
}
@Test
public
void
testDefaultRolloverReference
()
{
Assert
.
assertNull
(
GPSDate
.
getRolloverReference
());
GPSDate
date
=
new
GPSDate
(
305
,
1.5
);
// the default reference is extracted from last EOP entry
// which in this test comes from bulletin B 218, in the final values section
Assert
.
assertEquals
(
"2006-03-05"
,
GPSDate
.
getRolloverReference
().
toString
());
Assert
.
assertEquals
(
305
+
1024
,
date
.
getWeekNumber
());
}
@Test
public
void
testUserRolloverReference
()
{
GPSDate
.
setRolloverReference
(
new
DateComponents
(
DateComponents
.
GPS_EPOCH
,
7
*
(
3
*
1024
+
512
)));
GPSDate
date
=
new
GPSDate
(
305
,
1.5
);
Assert
.
assertEquals
(
"2048-09-13"
,
GPSDate
.
getRolloverReference
().
toString
());
Assert
.
assertEquals
(
305
+
3
*
1024
,
date
.
getWeekNumber
());
}
@Test
public
void
testSerialization
()
throws
IOException
,
ClassNotFoundException
{
GPSDate
date
=
new
GPSDate
(
1387
,
318677000.0
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment