1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.adm.aem;
18
19 import java.util.Arrays;
20
21 import org.orekit.files.ccsds.ndm.adm.AttitudeType;
22 import org.orekit.time.AbsoluteDate;
23 import org.orekit.utils.TimeStampedAngularCoordinates;
24
25
26
27
28
29 class AttitudeEntry {
30
31
32 private final AemMetadata metadata;
33
34
35 private AbsoluteDate epoch;
36
37
38 private double[] components;
39
40
41
42
43 AttitudeEntry(final AemMetadata metadata) {
44 this.metadata = metadata;
45 this.components = new double[8];
46 Arrays.fill(components, Double.NaN);
47 }
48
49
50
51
52 public AemMetadata getMetadata() {
53 return metadata;
54 }
55
56
57
58
59 public void setEpoch(final AbsoluteDate epoch) {
60 this.epoch = epoch;
61 }
62
63
64
65
66
67 public void setComponent(final int i, final double value) {
68 components[i] = value;
69 }
70
71
72
73
74
75 public void setLabeledAngle(final char axis, final double angle) {
76 if (metadata.getEulerRotSeq() != null) {
77 for (int i = 0; i < components.length; ++i) {
78 if (metadata.getEulerRotSeq().name().charAt(i) == axis && Double.isNaN(components[i])) {
79 setComponent(i, angle);
80 return;
81 }
82 }
83 }
84 }
85
86
87
88
89
90 public void setLabeledRate(final char axis, final double rate) {
91 if (metadata.getEulerRotSeq() != null) {
92 final int first = (metadata.getAttitudeType() == AttitudeType.QUATERNION_ANGVEL ||
93 metadata.getAttitudeType() == AttitudeType.QUATERNION_EULER_RATES) ?
94 4 : 3;
95 for (int i = 0; i < 3; ++i) {
96 if (metadata.getEulerRotSeq().name().charAt(i) == axis && Double.isNaN(components[first + i])) {
97 setComponent(first + i, rate);
98 return;
99 }
100 }
101 }
102 }
103
104
105
106
107 public TimeStampedAngularCoordinates getCoordinates() {
108 return metadata.getAttitudeType().build(metadata.isFirst(),
109 metadata.getEndpoints().isExternal2SpacecraftBody(),
110 metadata.getEulerRotSeq(), metadata.isSpacecraftBodyRate(),
111 epoch, components);
112 }
113
114 }