rsspice/generated/spicelib/
zzfrmgt1.rs1use super::*;
6use f2rust_std::*;
7
8const INERTL: i32 = 1;
9const PCK: i32 = (INERTL + 1);
10const CK: i32 = (PCK + 1);
11const TK: i32 = (CK + 1);
12const DYN: i32 = (TK + 1);
13const SWTCH: i32 = (DYN + 1);
14const ALL: i32 = -1;
15
16struct SaveVars {
17    VERSN: Vec<u8>,
18    IDNT66: StackArray2D<f64, 36>,
19    PASS1: bool,
20}
21
22impl SaveInit for SaveVars {
23    fn new() -> Self {
24        let mut VERSN = vec![b' '; 6 as usize];
25        let mut IDNT66 = StackArray2D::<f64, 36>::new(1..=6, 1..=6);
26        let mut PASS1: bool = false;
27
28        PASS1 = true;
29        fstr::assign(&mut VERSN, b"4.0.0");
30
31        Self {
32            VERSN,
33            IDNT66,
34            PASS1,
35        }
36    }
37}
38
39pub fn ZZFRMGT1(
41    INFRM: i32,
42    ET: f64,
43    XFORM: &mut [f64],
44    OUTFRM: &mut i32,
45    FOUND: &mut bool,
46    ctx: &mut Context,
47) -> f2rust_std::Result<()> {
48    let save = ctx.get_vars::<SaveVars>();
49    let save = &mut *save.borrow_mut();
50
51    let mut XFORM = DummyArrayMut2D::new(XFORM, 1..=6, 1..=6);
52    let mut CENTER: i32 = 0;
53    let mut TYPE: i32 = 0;
54    let mut TYPEID: i32 = 0;
55    let mut TSIPM = StackArray2D::<f64, 36>::new(1..=6, 1..=6);
56    let mut ROTATE = StackArray2D::<f64, 9>::new(1..=3, 1..=3);
57
58    *FOUND = false;
78
79    if RETURN(ctx) {
83        return Ok(());
84    }
85
86    CHKIN(b"ZZFRMGT1", ctx)?;
87
88    if save.PASS1 {
92        CLEARD(36, save.IDNT66.as_slice_mut());
93
94        for I in 1..=6 {
95            save.IDNT66[[I, I]] = 1.0;
96        }
97
98        save.PASS1 = false;
99    }
100
101    FRINFO(INFRM, &mut CENTER, &mut TYPE, &mut TYPEID, FOUND, ctx)?;
105
106    if !*FOUND {
107        CLEARD(36, XFORM.as_slice_mut());
108        *OUTFRM = 0;
109
110        CHKOUT(b"ZZFRMGT1", ctx)?;
111        return Ok(());
112    }
113
114    if (TYPE == INERTL) {
119        IRFROT(INFRM, 1, ROTATE.as_slice_mut(), ctx)?;
120
121        if !FAILED(ctx) {
122            for I in 1..=3 {
123                for J in 1..=3 {
124                    XFORM[[I, J]] = ROTATE[[I, J]];
125                    XFORM[[(I + 3), (J + 3)]] = ROTATE[[I, J]];
126                    XFORM[[(I + 3), J]] = 0.0;
127                    XFORM[[I, (J + 3)]] = 0.0;
128                }
129            }
130
131            *OUTFRM = 1;
132        }
133    } else if (TYPE == PCK) {
134        TISBOD(b"J2000", TYPEID, ET, TSIPM.as_slice_mut(), ctx)?;
135
136        if !FAILED(ctx) {
137            INVSTM(TSIPM.as_slice(), XFORM.as_slice_mut(), ctx)?;
138
139            *OUTFRM = 1;
140        }
141    } else if (TYPE == CK) {
142        CKFXFM(TYPEID, ET, XFORM.as_slice_mut(), OUTFRM, FOUND, ctx)?;
143    } else if (TYPE == TK) {
144        TKFRAM(TYPEID, ROTATE.as_slice_mut(), OUTFRM, FOUND, ctx)?;
145
146        if !FAILED(ctx) {
147            for I in 1..=3 {
148                for J in 1..=3 {
149                    XFORM[[I, J]] = ROTATE[[I, J]];
150                    XFORM[[(I + 3), (J + 3)]] = ROTATE[[I, J]];
151                    XFORM[[(I + 3), J]] = 0.0;
152                    XFORM[[I, (J + 3)]] = 0.0;
153                }
154            }
155        }
156    } else if (TYPE == DYN) {
157        SETMSG(b"The reference frame # is a dynamic frame. Dynamic frames may not be used at recursion level 1.", ctx);
158        ERRINT(b"#", INFRM, ctx);
159        SIGERR(b"SPICE(RECURSIONTOODEEP)", ctx)?;
160        CHKOUT(b"ZZFRMGT1", ctx)?;
161        return Ok(());
162    } else if (TYPE == SWTCH) {
163        ZZSWFXFM(INFRM, ET, 6, XFORM.as_slice_mut(), OUTFRM, FOUND, ctx)?;
164    } else {
165        CLEARD(36, XFORM.as_slice_mut());
166        *OUTFRM = 0;
167        *FOUND = false;
168
169        SETMSG(b"The reference frame # has class #. This form of reference frame is not supported in version # of ZZFRMGT1. You need to update your version of SPICELIB to the latest version in order to support this frame. ", ctx);
170
171        ERRINT(b"#", INFRM, ctx);
172        ERRINT(b"#", TYPE, ctx);
173        ERRCH(b"#", &save.VERSN, ctx);
174        SIGERR(b"SPICE(UNKNOWNFRAMETYPE)", ctx)?;
175        CHKOUT(b"ZZFRMGT1", ctx)?;
176        return Ok(());
177    }
178
179    if (FAILED(ctx) || !*FOUND) {
184        CLEARD(36, XFORM.as_slice_mut());
185        *OUTFRM = 0;
186        *FOUND = false;
187    }
188
189    CHKOUT(b"ZZFRMGT1", ctx)?;
190    Ok(())
191}